xtrabackup原理,整库,单表,部分备份恢复
xtrabackup原理,整库,单表,部分备份恢复
物理备份xtrabackup原理
Percona XtraBackup(简称PXB)是 Percona 公司开发的⼀个⽤于 MySQL 数据库物理热备的备份⼯具,⽀持 MySQl(Oracle)、Percona Server 和 MariaDB
1.innobackupex在执⾏后会fork⼀个xtrabackup的进程,然后就等待xtrabackup的ibd数据⽂件。
4.innobackupex收到xtrabackup通知后,执⾏FLUSH TABLES WITH READ LOCK(FTWRL),去的⼀致性点位,开始拷贝⾮ibd⽂件可选copy或者rsync⽅式俩种,拷贝⾮ InnoDB ⽂件过程中,因为数据库处
于全局只读状态,如果在业务的主库备份的话,要特别⼩⼼,⾮InnoDB 表(主要是MyISAM)⽐较多的话整库只读时间就会⽐较长,这个影响⼀定要评估到。
5.当 innobackupex 拷贝完所有⾮ InnoDB 表⽂件后,通知 xtrabackup(通过删⽂件),同时⾃⼰进⼊等待(等待另⼀个⽂件被创建)
世界最高的山峰
7.innobackupex 收到 redo 备份完成通知后,就开始解锁,执⾏ UNLOCK TABLES;
8.最后 innobackupex 和 xtrabackup 进程各⾃完成收尾⼯作,如资源的释放、写备份元数据信息等,innobackupex 等待 xtrabackup ⼦进程结束后退出。
简略的Xtrabackup流程
Xtrabackup实质上是利⽤了InnoDB Crash Recovery机制
xtrabackup备份原理分析:
对于Innodb,它是基于Innodb的crash recovery功能进⾏备份。
XtraBackup 在备份的时候并不锁定表,⽽是⼀页⼀页地复制 InnoDB 的数据,与此同时,XtraBackup 还有另外⼀个线程监视着transactions log,⼀旦 log 发⽣变化,
就把变化过的 log pages 复制⾛。在全部数据⽂件复制完成之后,停⽌复制 logfile。
XtraBackup联机备份:
专注于InnoDB、XtraBackup的热备⼯具,是C语⾔开发的程序,专⽤于备份InnoDB及XtraDB引擎对象
备份集⾼效、完整、可⽤
备份任务执⾏过程中不会阻塞事务
节省磁盘空间,降低⽹络带宽占⽤
备份集⾃动验证机制
赛尔号鲁比克
恢复更快
[root@mysql1 /]# rpm -ivh percona-xtrabackup-2.2.3-4982.el6.x86_64.rpm
MySQL5.7安装percona-xtrabackup
# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm
# rpm -ivh percona-xtrabackup-24-2.4.5-1.el6.x86_64.rpm
[mysql@mysql1 ~]$ echo "export PATH=/usr/bin:\$PATH" >> /home/mysql/.bash_profile
(system@localhost) [(none)]> create user xtrabk@'localhost' identified by 'onlybackup';
(system@localhost) [(none)]> grant reload,lock tables,process,Replication client,super on *.* to xtrabk@'localhost';
使⽤xtrabackup命令进⾏备份
xtrabackup命令有两种模式,--backup(备份模式)和--prepare(恢复准备模式)
--backup指定当前的操作模式,backup就是说要创建备份集
--target-dir指定备份集的存储路径
--defaults-file从MySQL的选项⽂件中读取参数
[mysql@mysql1 ~]$ xtrabackup --defaults-file=/data/mysqldata/3306/myf --backup --target-dir=/data/mysqldata/backup/full_bak
古埃及传说
使⽤innobackupex命令进⾏备份,还能备份⾮InnoDB对象
[mysql@mysql1 ~]$ innobackupex --defaults-file=/data/mysqldata/3306/myf --user=xtrabk --password='onlybackup'
/data/mysqldata/backup/
创建增量备份:
[mysql@mysql2 ~]$ innobackupex --defaults-file=/data/mysqldata/3306/myf --user=xtrabk --password='onlybackup' --incremental --incremental-basedir=/data/mysqldata/backup/2014-07-10_09-29-32 /data/mysqldata/backup_inc
--incremental:告诉xtrabackup这次是要创建增量备份
--incremental-basedir:指定⼀个全量备份的路径,作为增量备份的基础
--incremental-lsn:指定备份开始时的LSN
MySQL的增量备份对应Oracle的差异增量备份
InnoDB的Log Sequence Number⽇志序列号LSN。InnoDB的每个页(Page)都保存有LSN,这个序号能够标识该页最后修改时间,增量备份正是根据这个LSN来的,因为每次备份(含xtrabackup和innobackupex),XtraBackup都会在备份集中创建⼀个xtrabackup_checkpoints⽂件,这个⽂件中的内容就记录了最后修改的LSN序号。创建增量备份集时,只需要从上次的备份集中到xtrabackup_checkpoints⽂件,读取最新的LSN,⽽后在创建增量是,选择LSN⼤于这个序号的页,以及这期间产⽣的⼆进制⽇志就可以了,甚⾄不需要对⽐全量备份集和当前数据库的数据⽂件
XtraBackup备份⼯作机制:
XtraBackup本质是基于InnoDB的故障恢复(crash-recovery)机制,先复制InnoDB的数据⽂件,复制的时候数据仍有可能正在读写,复制出的⽂件可能是不⼀致的状态,所以在备份过程中,需要定时扫描⽇志并作记录,⽽后通过备份的⽇志⽂件执⾏故障恢复,使⽂件恢复到⼀个⼀致的状态,使数据库达到可⽤状态。核⼼就是InnoDB维护的重做⽇志(redo log)。XtraBackup会在启动时先记录下当前的⽇志序列号(LSN),然后开始复制数据⽂件,同时XtraBackup运⾏⼀个后台进程,监控着事务⽇志,并复制新发⽣的修改。这项操作会在XtraBackup备份执⾏过程中⼀直执⾏,就是log scanned up to信息,以确保记录下所有备份期间数据库发⽣的修改。接下来是准备进程(prepare process),在这⼀步中,XtraBackup对复制的数据⽂件执⾏故障恢复,将数据库恢复到可⽤状态
执⾏恢复:全量恢复和增量恢复:
准备恢复(prepare):就是为恢复做准备。备份集没有办法直接拿来⽤,所有需要⼀个对备份集做准备的过程
对于xtrabackup对应的参数是--prepare,对于innobackupex对应的参数是--apply-log
执⾏恢复(copy-back):备份集准备好以后,可以执⾏恢复了
对于xtrabackup没有特殊说明,简单cp/mv过程,对于innobackupex对应的参数是--copy-back,它的功能是将制定的备份集,恢复到指定的路径下
⾸先对全量备份做恢复的准备⼯作
[mysql@mysql1 ~]$ innobackupex --defaults-file=/data/mysqldata/3306/myf --apply-log --redo-only /data/mysqldata/backup/2014-07-
08_16-24-07/
--apply-log从指定的选项⽂件中读取配置信息并应⽤⽇志等,表⽰要做的是对备份集做恢复的准备⼯作
--redo-only如果进⾏准备⼯作的备份集操作完成后,还有其他增量备份集待处理,那么就必须指定本参数
继续执⾏innobackupex命令,应⽤增量备份,这次要操作的备份集就是最后⼀份,不需要再指定--redo-only参数
[mysql@mysql1 ~]$ innobackupex --defaults-file=/data/mysqldata/3306/myf --apply-log /data/mysqldata/backup/2014-07-08_16-24-07/ --incremental-dir=/data/mysqldata/backup_inc/2014-07-08_16-29-44/
注意在备份集进⾏恢复的准备过程中,不要随意中断该任务,否则有可能导致备份集处于不⼀致状态。由于XtraBackup是直接在备份集中进⾏准备,⼀旦有异常,搞不好想恢复都没办法。建议操作之前,将备份集备份⼀次。
建议再执⾏⼀遍innobackupex --apply-log
[mysql@mysql1 ~]$ innobackupex --defaults-file=/data/mysqldata/3306/myf --apply-log  /data/mysqldata/backup/2014-07-08_16-24-07/执⾏⽂件的恢复
[mysql@mysql1 ~]$ innobackupex --defaults-file=/data/mysqldata/3306/myf --copy-back /data/my
sqldata/backup/2014-07-08_16-24-07/恢复操作可以在任意机器上执⾏,只要您拥有完整备份集,可以把XtraBackup当做数据库迁移⼯具
打包和压缩备份集
XtraBackup⽀持流(stream)模式,能够直接将备份输出到指定的格式进⾏处理,⽐如tar或xbstream
[mysql@mysql1 ~]$ innobackupex --defaults-file=/data/mysqldata/3306/myf --user=xtrabk --password=onlybackup --stream=tar /tmp | gzip -> /data/mysqldata/backup/xtra_
⾃动化备份脚本
[mysql@mysql1 ~]$ more mysql_full_backup_by_xtra.sh
#!/bin/bash
#create by allen
source /data/mysqldata/scripts/mysql_env.ini
DATA_PATH=/data/mysqldata/backup/mysql_full
DATA_FILE=${DATA_PATH}/xtra_fullbak_`date +%F`.
LOG_FILE=${DATA_PATH}/xtra_fullbak_`date +%F`.log
ORI_CONF_FILE=/data/mysqldata/3306/myf
NEW_CONF_FILE=${DATA_PATH}/my_3306_`date +%F`f
MYSQL_PATH=/usr/bin
MYSQL_CMD="${MYSQL_PATH}/innobackupex --defaults-file=${ORI_CONF_FILE} --user=xtrabk --password=onlybackup --stream=tar /tmp"
echo > ${LOG_FILE}
echo -e "=== Jobs started at `date +%F' '%T' '%w` ===\n" >> ${LOG_FILE}
echo -e "=== First cp myf file to backup directory ===" >> ${LOG_FILE}
/bin/cp ${ORI_CONF_FILE} ${NEW_CONF_FILE}
echo > ${LOG_FILE}
网络的推广
数据库恢复echo -e "*** Executed command:${MYSQL_CMD} | gzip > ${DATA_FILE}" >> ${LOG_FILE}
${MYSQL_CMD} | gzip > ${DATA_FILE}
echo -e "*** Executed finished at `date +%F' '%T' '%w` ===" >> ${LOG_FILE}
echo -e "*** Backup file size:`du -sh ${DATA_FILE}` ===\n" >> ${LOG_FILE}
echo -e "--- Find expired backup and delete those files ---" >> ${LOG_FILE}
for tfile in $(/usr/bin/find $DATA_PATH -mtime +6)
do
if [ -d $tfile ] ; then
rmdir $tfile
elif [ -f $tfile ] ; then
rm -f $tfile
fi
echo -e "--- Delete file:$tfile ---" >> ${LOG_FILE}
done
echo -e "\n=== Jobs ended at `date +%F' '%T' '%w` ===\n" >> ${LOG_FILE}
差⼀个⾃动化增量备份脚本
innodb_force_recovery参数的使⽤
参数值为0到6
每次加1进⾏恢复测试
使⽤xtrabackup注意事项
设置⼀个超时时间,避免⽆限期的等待。Xtrabackup提供了以下参数实现该功能:
--lock-wait-timeout=SECONDS, ,⼀旦Flush table with read lock被阻塞超过预定时间,则XtraBackup出错返回退出,该值默认为0,也就是说⼀旦阻塞,⽴即返回失败。
--lock-wait-query-type=all|update,该参数允许⽤户指定,哪类的SQL语句是需要Flush table with read lock等待的,同时⽤户可以通过--lock-wait-threshold=SECONDS设置等待的时间,如果不在query-type指定的类型范围内或者超过了wait-threshold指定的时间,XtraBackup 均返回错误。如果指定update类型,则UPDATE/ALTER/REPLACE/INSERT 均会等待,ALL表⽰所有的SQL语句。
kill 其他阻塞线程
Kill掉所有阻塞Flush table with read lock的线程:
--kill-long-queries-timeout=SECONDS参数允许⽤户指定了超过该阈值时间的查询会被Kill,同时也允许⽤户指定Kill
SQL语句的类型。
--kill-long-query-type=all|select
默认值为ALL,如果选择Select,只有Select语句会被Kill,如果Flush table with read lock是被Update语句阻塞,则XtraBackup不会处理。创建部分备份(Creating Partial Backups)清明节的作文400字左右
部分备份共有三种⽅式,分别是:
1. ⽤正则表达式表⽰要备份的库名及表名(参数为--include)
2. 将要备份的表名或库名都写在⼀个⽂本⽂件中(参数为--tables-file)
3. 将要备份表名或库名完整的写在命令⾏中(参数为:--databases)。
(译者注:不管你备份哪个库或是哪张表,强烈推荐把mysql库也⼀起备份,恢复的时候要⽤。)
⽅式⼀:使⽤--include参数
使⽤正则模式匹配备份部分库表,需要使⽤参数--include
innobackupex --include='st*' /backup --user=root --password=msds007
⽅式⼆:使⽤表列表备份部分表,需要使⽤参数--tables-file,语句类似如下:
cat /
test.t
innobackupex --tables-file=/ /backup --user=root --password=msds007
⽅式三:使⽤--databases参数
innobackupex --databases=test,mysql /backup --user=root --password=msds007
准备部分备份(Preparing Partial Backups)
执⾏preparing partial backups,与恢复独⽴的表(Restoring Individual Tables)很类似:使⽤--apply-log和--export参数,并包含上⼀步⽣成的时间戳⽂件夹
innobackupex --apply-log --export /backup/2018-05-10_19-38-44
恢复部分备份(Restoring Partial Backups)
1)查看备份集中的⽂件
[root@mydb1 test]# pwd
/backup/2018-05-10_19-38-44/test
[root@mydb1 test]# ll
total 256
-rw-r--r--. 1 root root  390 May 10 19:58 t.cfg
-rw-r--r--. 1 root root  1087 May 10 19:58 testflashback2.cfg
-rw-r--r--. 1 root root 16384 May 10 19:p
-rw-r-----. 1 root root  9030 May 10 19:38 testflashback2.frm
-rw-r-----. 1 root root 98304 May 10 19:38 testflashback2.ibd
-rw-r--r--. 1 root root 16384 May 10 19:p
-rw-r-----. 1 root root  8586 May 10 19:38 t.frm
-rw-r-----. 1 root root 98304 May 10 19:38 t.ibd
2)建表,可以从frm⽂件中解析出建表语句
# mysqlfrm --diagnostic t.frm
# WARNING: Cannot generate character set or collation names without the --server option.
# CAUTION: The diagnostic mode is a best-effort parse of the .frm file. As such, it may not identify all of the components of the table correctly. This is especially true for damaged files. It will also not read the default values for the columns and the resulting statement may not be syntactically correct.
# Reading .frm file for t.frm:
# The .frm file is a TABLE.
# CREATE TABLE Statement:
[root@mydb1 ~]# mysqlfrm --server=dba_user:msds007@192.168.1.101 /app/mysqldata/3306/data/test/tt.frm --user=root --port=2323
--server=dba_user:msds007@192.168.1.101    远端服务器,要读取的数据字典
/app/mysqldata/3306/data/test/tt.frm                  frm源⽂件放置的本地位置
--user=root --port=2323                                    Starting the spawned server on port 2323
CREATE TABLE `t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY `PRIMARY` (`id`)
) ENGINE=InnoDB;
#...done.
3)导⼊数据
ALTER TABLE test.t DISCARD TABLESPACE;
After this, copy t.ibd p ( or t.cfg if importing to MySQL 5.6) files to database’s home, and import its tablespace:
chown mysql:mysql t.p t.cfg
ALTER TABLE test.t IMPORT TABLESPACE;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。