接上一篇文章使用Xtrabackup备份MySQL数据库,下面介绍使用Xtrabackup实现MySQL数据库的增量备份
先在users表中插入10条记录,全库做一次全量备份
[root@localhost ~]# mkdir /backup
[root@localhost ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=MySQL@2019 --socket=/tmp/mysql.sock /backup
接下面我们再在表中插入几条新数据
要实现第一次增量备份,可以使用下面的命令进行:
# innobackupex --incremental /backup --incremental-basedir=BASEDIR
其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。
--incremental-basedir应该指向上一次的增量备份所在的目录。
--incremental /backup/ 指定增量备份文件备份的目录
innobackupex --defaults-file=/etc/my.cnf --user=root --password=MySQL@2019 --socket=/tmp/mysql.sock --incremental /backup --incremental-basedir=/backup/2019-09-15_14-12-17/
下面我们删除几条数据,然后通过之前的增量备份进行还原
“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。
(2)基于所有的备份将未提交的事务进行“回滚”。
于是,操作就变成了:
# innobackupex --apply-log --redo-only BASE-DIR
接着执行:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
而后是第二个增量:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR指的是完全备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,每一次都要执行如上操作
下面模拟只有一次增量备份的增量备份还原过程
先确认两个备份目录哪一个是全量备份,哪一个是增量备份
然后进行prepare操作
innobackupex --defaults-file=/etc/my.cnf --user=root --password=MySQL@2019 --socket=/tmp/mysql.sock --apply-log --redo-only /backup/2019-09-15_14-12-17/
innobackupex --defaults-file=/etc/my.cnf --user=root --password=MySQL@2019 --socket=/tmp/mysql.sock --apply-log --redo-only /backup/2019-09-15_14-12-17/ --incremental-dir=/backup/2019-09-15_14-22-35/
接下来停掉数据库服务,移除当前的数据库数据目录
service mysqld stop
mv /usr/local/mysql/data/ /backup/mysql_data_backup
进行备份还原
innobackupex --copy-back /backup/2019-09-15_14-12-17/
然后chown -R mysql:mysql /usr/local/mysql/data/
service mysqld start
登录数据库验证是否恢复成功
可以看出增量备份恢复成功
当然有时也可以通过mysqlbinlog来查看某个时间段的二进制日志进行恢复
mysqlbinlog --start-datetime="2019-09-15 09:12:51" --stop-datetime="2019-09-15 09:14:00" mysqlbin.000001 > /root/bak.sql
--start-datetime : 指定起始的时间点。
--stop-datetime: 指定结束的时间点。
--start-position: 指定二进制日志开始日志点。
--stop-position : 指定二进制日志结束的日志点。
上面四个参数可以配合使用
然后把上面导出sql文件导入到MySQL服务中。
mysql> set sql_log_bin=0; #导入时,若文件较大会产生很多二进制日志文件,可以先把二进制日志文件关闭,
mysql> source bak.sql; #导入文件,可以使用mysql直接导入
mysql> set sql_log_bin=1; #导入完成之后,开启二进制日志文件
具体的操作就不演示了。