一、基础知识
mysqldump是mysql自带的一个单线程的逻辑备份工具,当数据量很大时,使用mysqldump备份的时间会非常长,且无法做增量备份,xtrabackup是一款基于底层块复制、开源的备份工具,可以对数据库在线实现备份。xtrabackup支持对Innodb和Xtradb存储引擎的完全、增量和差异备份,对于不支持事物的MyISAM存储引擎只能完全备份。
二、备份工具
Xtrabackup工具用到的命令为xtrabackup和innobackupex,而innobackupex又是将xtrabackup使用perl脚本语言封装的二次版本,其目的时为了便于使用
本文重点介绍innobackupex为例,介绍完全备份、增量备份和差异备份
三、实验说明
本次实验采用CentOS7.4系统,数据库版本为MariaDB 5.5.56,innobackupex 版本为2.3.6。
1.完全备份
(1)创建备份账户
MariaDB [hellodb]> grant all privileges on *.* to 'backup'@'localhost' identified by 'backuppassword';
MariaDB [hellodb]> flush privileges;
(2)创建备份目录
[root@node1 ~]# mkdir -pv /data/back
[root@node1 ~]# chown -R mysql.mysql /data/back
(3)执行备份
innobackupex --defaults-file=/etc/my.cnf --user=backup --password=backuppassword /data/back
看到completed OK!提示后表示备份成功,上述命令还可以使用--databases="db1 db2"来备份制定的库,或者使用--no-timestamp不自动生成时间戳
(4)关闭数据库服务,删除数据,模拟数据库损坏
[root@node1 back]# systemctl stop mariadb.service
(5)恢复前准备(将已提交的事物同步到磁盘,未提交的事务回滚)
innobackupex --defaults-file=/etc/my.cnf --user=backup --password=backuppassword --apply-log /data/back/2018-04-24_07-38-47/
(6)恢复数据(如果用root账号操作,需要更改恢复后数据目录的属组和属主)
innobackupex --defaults-file=/etc/my.cnf --user=backup --password=backuppassword --copy-back /data/back/2018-04-24_07-38-47/
(7)重启数据库服务,至此操作完成
2.增量备份
增量备份的实现是根据每一个Innodb页都有一个log sequence number(LSN),当数据发生变化时,其所在的Innodb页的LSN会自动增长,增量备份就是根据LSN的范围序列实现备份,每次备份的LSN号可以在xtrabackup_checkpoints中查看。其备份的方式与全备略有不同,增量备份需要给予一个全被或者上一次增量来进行,具体步骤如下:
(1)创建一个完全备份
[root@node1 ~]# innobackupex --defaults-file=/etc/my.cnf --user=backup --password=backuppassword /data/back
(2)基于已创建的完全备份,做增量备份
[root@node1 ~]# innobackupex --defaults-file=/etc/my.cnf --user=backup --password=backuppassword --incremental /data/incremental/ --incremental-basedir=/data/back/2018-04-25_06-32-18/
(3)基于已第一次创建的增量备份,做第二次增量备份(将--incremental-basedir指向完备份,则做的是差异备份)
[root@node1 ~]# innobackupex --defaults-file=/etc/my.cnf --user=backup --password=backuppassword --incremental /data/incremental/ --incremental-basedir=/data/incremental/2018-04-25_06-34-15/
(4)删除数据库文件,模拟故障(提前保存二进制文件,备份到故障发生点之间的还原还需要通过二进制文件)
[root@node1 ~]# cat /data/incremental/2018-04-25_06-39-57/xtrabackup_binlog_info
[root@node1 ~]# mysqlbinlog --start-position=1721 mysql-binlog.000002 > /data/incremental/binlog.sql
[root@node1 ~]# systemctl stop mariadb.service
[root@node1 ~]# rm -rf /var/lib/mysql*
(5)恢复前准备(出除最后一个增量外其他都需要使用--redo-only选项,其作用是不进行回滚操作,因为增量1中未提交的事务在增量2中可能会提交,所以不回滚。最后1个增量也可以用--redo-only选项,就算他不回滚,根据mariadb的crash-recover机制,启动时也会回滚未提交事务)
[root@node1 ~]# innobackupex --apply-log --redo-only /data/back/2018-04-25_06-32-18/
[root@node1 ~]# innobackupex --apply-log --redo-only /data/back/2018-04-25_06-32-18/ --incremental-dir=/data/incremental/2018-04-25_06-34-15/
[root@node1 ~]# innobackupex --apply-log --redo-only /data/back/2018-04-25_06-32-18/ --incremental-dir=/data/incremental/2018-04-25_06-39-57/
[root@node1 ~]# chown -R mysql.mysql /var/lib/mysql
(6)恢复数据库
[root@node1 ~]# innobackupex --copy-back /data/back/2018-04-25_06-32-18/
[root@node1 ~]# mysql < /data/incremental/binlog.sql
补充说明:
1.xtrabackup是通过读取LSN从而指导数据的更改的每一个innodb page页的大小默认是16K,实际测试中发现,如果数据量变化很小,即使binlog中的position发生了变了,使用增量备份的时候LSN号不会发生变化,但是恢复后的数据是一致的
2.在恢复增量备份的准备阶段时--incremental-dir选项后面不能使用相对路径,否则会提示找不到要恢复增量备份的xtrabackup_logfile