使用Xtrabackup实现MySQL数据库的增量备份

2019-09-17 11:12:11 浏览数 (1)

接上一篇文章使用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; #导入完成之后,开启二进制日志文件

具体的操作就不演示了。

0 人点赞