Xtrabackup工具支持对InnoDB存储引擎的增量备份,工作原理如下
1、在InnoDB内部会维护一个redo/undo日志文件,也可以叫做事务日志文件。事务日志会存储每一个InnoDB表数据的记录修改。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用(前滚)已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。
2、Xtrabackup在启动时会记住log sequence number(LSN),并且复制所有的数据文件。复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。这时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。Xtrabackup必须持续的做这个操作,是因为事务日志是会轮转重复的写入,并且事务日志可以被重用。所以xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来。
3、上面就是xtrabackup的备份过程。接下来是准备(prepare)过程,在这个过程中,xtrabackup使用之前复制的事务日志,对各个数据文件执行灾难恢复(就像mysql刚启动时要做的一样)。当这个过程结束后,数据库就可以做恢复还原了,这个过程在xtrabackup的编译二进制程序中实现。程序innobackupex可以允许我们备份MyISAM表和frm文件从而增加了便捷和功能。Innobackupex会启动xtrabackup,直到xtrabackup复制数据文件后,然后执行FLUSH TABLES WITH READ LOCK来阻止新的写入进来并把MyISAM表数据刷到硬盘上,之后复制MyISAM数据文件,最后释放锁。
4、备份MyISAM和InnoDB表最终会处于一致,在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不是回滚到xtrabackup刚开始时的点。这个时间点与执行FLUSH TABLES WITH READ LOCK的时间点相同,所以myisam表数据与InnoDB表数据是同步的。类似oracle的,InnoDB的prepare过程可以称为recover(恢复),myisam的数据复制过程可以称为restore(还原)。
5、Xtrabackup 和 innobackupex这两个工具都提供了许多前文没有提到的功能特点。手册上有对各个功能都有详细的介绍。简单介绍下,这些工具提供了如流(streaming)备份,增量(incremental)备份等,通过复制数据文件,复制日志文件和提交日志到数据文件(前滚)实现了各种复合备份方式。
1、安装
rpm -ivh libev-4.04-2.el6.x86_64.rpm
rpm -ivh perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
rpm -ivh percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
2、查看my.cnf
#egrep -v "^#|^$" /etc/my.cnf
!includedir /etc/my.cnf.d/
!includedir /etc/percona-server.conf.d/
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqld]
character-set-server = utf8
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
做增量备份是在全量的基础上,所以,需要先做一个全量备份,放在/data/mysqlbackup/下,且不压缩,方便后面同步数据,生成当前日期的一个目录,语句如下:
innobackupex --user=root --password=Passw0rd! /data/mysqlbackup/
3、创建测试数据库和表
Mysql> create database backup_test; //创建库
CREATE TABLE `backup` ( //创建表
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(20) NOT NULL DEFAULT '' ,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,
`del` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=myisam DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
4、增量备份
#--incremental:增量备份的文件夹
#--incremental-dir:针对哪个做增量备份
//第一次加入数据,然后备份
mysql> INSERT INTO backup (name) VALUES ('haha'),('six'); //插入数据
innobackupex --user=root --password=Passw0rd! --incremental-basedir=/data/mysqlbackup/2018-08-20_14-58-42 --incremental /data/mysqlbackup/ //增量备份语句
//再次加入数据,然后备份
mysql> INSERT INTO backup (name) VALUES ('test'),('testd'); //在插入数据
innobackupex --user=root --password=Passw0rd! --incremental-basedir=/data/mysqlbackup/2018-08-20_15-05-11 --incremental /data/mysqlbackup/ //增量备份语句
这个时候在 /data/mysqlbackup/ 下面应该有当前时间的三个目录,时间有一点差别而已
#/data/mysqlbackup/2018-08-20_14-58-42 全备份目录
#/data/mysqlbackup/2018-08-20_15-05-11 第一次增量备份产生的目录
#/data/mysqlbackup/2018-08-20_15-10-27 第二次增量备份产生的目录
5、查看增量备份记录文件
[root@ma02]# cat 2018-08-20_14-58-42/xtrabackup_checkpoints //全备目录下的文件
backup_type = full-backuped
from_lsn = 0 //全备起始为0
to_lsn = 44966412
last_lsn = 44966421
compact = 0
recover_binlog_info = 0
[root@ma02]# cat 2018-08-20_15-05-11/xtrabackup_checkpoints //第一次增量备份目录下的文件
backup_type = incremental
from_lsn = 44966412
to_lsn = 44969224
last_lsn = 44969233
compact = 0
recover_binlog_info = 0
[root@ma02]# cat 2018-08-20_15-10-27/xtrabackup_checkpoints //第二次增量备份目录下的文件
backup_type = incremental
from_lsn = 44969224
to_lsn = 44971200
last_lsn = 44971209
compact = 0
recover_binlog_info = 0
5.1 模拟数据丢失
增量备份做完后,把backup_test这个数据库删除掉,
Mysql> drop database backup_test;
这样可以对比还原后
6、增量还原,同步开始合并
回滚未提交的事务及同步已经提交的事务至数据文件使得数据文件处于一致性状态
①innobackupex --apply-log --redo-only 2018-08-20_14-58-42/
②innobackupex --apply-log --redo-only --incremental 2018-08-20_14-58-42/ --incremental-dir 2018-08-20_15-05-11/
③innobackupex --apply-log --redo-only --incremental 2018-08-20_14-58-42/ --incremental-dir 2018-08-20_15-10-27/
提示:
#/data/mysqlbackup/2018-08-20_14-58-42 全备份目录
#/data/mysqlbackup/2018-08-20_15-05-11 第一次增量备份产生的目录
#/data/mysqlbackup/2018-08-20_15-10-27 第二次增量备份产生的目录
从my.cnf读取datadir/innodb_data_home_dir/innodb_data_file_path等变量
先复制MyISAM表,然后是innodb表,最后为logfile
7、恢复数据
拷贝先前备份所有文件到它们的原始路径
1 2 3 4 |
Systemctl stop mysqld.service innobackupex --copy-back /data/backup/2018-08-20_14-58-42 chown –R mysql.mysql /var/lib/mysql/* Systemctl start mysqld.service |
注意:
① --data-dir目录必须为空(可在恢复前移动到其他目录下)
② 恢复完数据之后记得更改所有者和所属组,防止mysql 启动失败
8、 登录验证数据是否存在
发现数据都在,未丢失,实验结束。
9、其他
//全部数据库备份
innobackupex --user=ftpuser --password=Passw0rd! /data/backup/
//单数据库备份
innobackupex --user=ftpuser --password=Passw0rd! --database=backup_test /data/backup/
//多库
innobackupex--user=ftpuser --password=Passw0rd! --include='dba.*|dbb.*' /data/backup/
//多表
innobackupex --user=ftpuser --password=Passw0rd! --include='dba.tablea|dbb.tableb' /data/backup/
//数据库备份并压缩
log=zztx01_`date +%F_%H-%M-%S`.log
db=zztx01_`date +%F_%H-%M-%S`.tar.gz
innobackupex --user=ftpuser --password=Passw0rd! --stream=tar /data/backup 2>/data/backup/$log | gzip 1> /data/backup/$db
//不过注意解压需要手动进行,并加入 -i 的参数,否则无法解压出所有文件,疑惑了好长时间
//如果有错误可以加上 --defaults-file=/etc/my.cnf
innobackup 常用参数说明
--defaults-file
同xtrabackup的--defaults-file参数
--apply-log
对xtrabackup的--prepare参数的封装
--copy-back
做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir ;
--remote-host=HOSTNAME
通过ssh将备份数据存储到进程服务器上;
--stream=[tar]
备 份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定--stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件)。
在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。
--tmpdir=DIRECTORY
当有指定--remote-host or --stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir
--redo-only --apply-log组,
强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要。
--use-memory=#
该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量
--throttle=IOS
同xtrabackup的--throttle参数
--sleep=是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册 ;
--compress[=LEVEL]
对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;
--include=REGEXP
对 xtrabackup参数--tables的封装,也支持ibbackup。备份包含的库表,例如:--include="test.*",意思是要备份 test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:test1和test2,则写 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"。
--databases=LIST
列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份;
--uncompress
解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;
--slave-info,
备 份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET
指定mysql.sock所在位置,以便备份进程登录mysql.