xtrabackup实现全量+增量+binlog恢复库

大鹏一日同风起,扶摇直上九万里。这篇文章主要讲述xtrabackup实现全量+增量+binlog恢复库相关的知识,希望能为你提供帮助。
      xtrabackup是Percona公司提供的mysql数据库备份工具,并且是惟一开源的能够对innodb和xtradb数据库进行热备的工具,它具有以下特点:
    ①备份还原过程快速、可靠;
    ②备份过程不会打断正在执行的事务;
    ③能够基于压缩等功能节约磁盘空间和流量;
    ④自动实现备份检验;
    ⑤开源,免费。
    在CentOS7上可以直接使用yum通过epel源来下载老版的xtrabackup,如果是CentOS8版本则需要通过Percona官网??(下载选择页面:https://www.percona.com/downloads/)??去下载xtrabackup的rpm包,并且直接使用CentOS8yum安装的MySQL为8.0版本,只能下载xtrabackup的8.0版本,其它版本不适用。
    笔者这边准备了两台CentOS8版本的虚拟机,下载了同版本的MySQL8.0.26数据库,并分别取名xtrabackup和destination。

  1. ?xtrabackup实现全量备份及还原?
?1.1 下载并安装xtrabackup包??
    通过官网下载好xtrabackup包,??要注意的是包的版本必须和MySQL数据库版本相同??,复制无法进行后续操作。虽然下载的是rpm包,但建议使用yum进行安装,以解决相关依赖包问题??(如下图)??。


  ?1.2 完全备份到/backup?
    xtrabackup主机上创建/backup目录,并进行完全备份到该目录下。由于未设置密*码,所以直接使用root账号进行备份即可,同时备份的/backup/base目录会自动创建??(如下图)??。

    进入到/backup/base目录下,可以看到已对数据库进行了完全备份,包括各类创建的数据库和系统自带的数据库。查看xtrabackup_binlog_info时,里面记录了我们进行完全备份是在二进制日志的哪个点;xtrabackup_checkpoints文件中记录了lsn的相关信息,对后期的增量备份尤为重要;xtrabackup_info文件的信息则更为详细,包括UUID、使用的是什么工具、工具版本、使用了什么命令等??(如下图)??。

?1.3 拷贝文件至目标主机?
    xtrabackup主机将整个/backup目录拷贝至destination主机。


?1.4 destination主机预准备?
      预准备可以确保数据一致,提交完成的事务,回滚未完成的事务。destination主机上执行  ?xtrabackup --prepare --target-dir=/backup/base?  命令进行预准备,对比预准备之前的文件大小,已经从74M变成了190M??(如下图)??。


?1.5 复制到destination数据库?
    要保证目标主机的数据库目录为空,同时数据库状态是关闭的,执行?  xtrabackup --copy-back --target-dir=/backup/base?  命令进行将xtrabackup主机数据库中的数据复制到本机的MySQL中??(如下图)??。

?1.6 还原属性?
    此时在destination主机上查看/var/lib/mysql目录,已将数据进行还原,但是所有者和所属组是root,因此还要改成mysql??(如下图)??。

?1.7 测试环节?
    destination主机开启mysql服务,登录数据库后,查看现有的数据库,内容与xtrabackup主机数据库中内容相同,已经完成了完全备份??(如下图)??。




  1. ?增量备份及还原?
    要进行增量备份,必须先进行完全备份。与上面的完全备份并还原不同,在增量备份中,完全备份的数据还原过程是不能进行回滚操作的,因为在完全备份的时间点上,如果有事务正在进行,而又进行了回滚的操作,会导致复制还原的数据不全。同理,如果是做了多次的增量备份,除了最后一次的增量备份数据还原需执行回滚操作,中间节点的增量备份还原也不能进行回滚。
?2.1 完全备份到/backup?
    笔者就不重新还原系统进行操作了,xtrabackup的下载、安装及创建目录与上述完全备份都是相同的,笔者直接删除xtrabackup主机中/backup目录下的文件,同时停掉destination主机的mysql服务,并清空之前的数据,从完全备份开始演示。
    xtrabackup主机执行  ?xtrabackup -uroot --backup --target-dir=/backup/base  ?命令将数据库所有数据备份到/backup目录下。

?2.2 第一次增量备份?
    假设在完全备份后,我们在hellodb数据库中的students表中添加了三条学生信息??(如下图)??。


    此时我们要进行增量备份,执行  ?xtrabackup -uroot --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base  ?命令,即我们是基于/backup/base这个完全备份来进行的增量备份,同时增量备份是放在/backup/inc1目录下??(如下图)??。

?2.3 第二次增量备份?
    在完成第一次增量备份操作后,假设现在又要对hellodb数据库中的students表进行表动,再添加两条学生信息??(如下图)??。

    此时我们进行增量备份时不能是基于完全备份,应是基于第一次增量备份来进行的,即在/backup/inc1的基础上做的新增量备份,我们可以按次序放在/backup/inc2目录下??(如下图)??。

?2.4 拷贝文件至目标主机?
    与完全备份部分的操作相同,将整个/backup文件夹复制到destination主机上??(如下图)??。


?2.5 数据还原?
      预准备完全备份,需加上--apply-log-only选项来阻止回滚未完成的事务,否则在生产中可能会导致一些事务不全??(如下图)??。

    第一次增量备份的数据还原也不能进行回滚,同时要整合到完全备份中??(如下图)??。

    如果中间有多个增量备份,除了最后一次的增量备份还原,都不能有回滚操作,笔者这边模拟的比较简单,只有两次增量备份的数据还原,因此第二次还原时是要进行回滚,即取消--apply-log-only选项??(如下图)??。

?2.6 复制到destination数据库?
    因为上面的数据还原过程,已经将第一次和第二次的增量备份整合到了完全备份中,此时在destination主机上执行  ?xtrabackup --copy-back --target-dir=/backup/base?  命令即可将所有数据复制到数据库中??(如下图)??。

?2.7 修改属性?
    由于/var/lib/mysql目录下的文件所有者和所属组是root,还需改成mysql??(如下图)??。

?2.8 测试环节?
    destination主机开启mysql服务,登录hellodb数据库后,查看students表,显示的信息与xtrabackup主机hellodb数据库中的相同,从而实现了增量备份??(如下图)??。




  1. ?binlog还原数据?
    在完全备份和增量备份的基础上,如果xtrabackup主机的数据库再发生数据更新,继续用增量备份的话可能会导致目标主机数据库中的部分事务不全,此时可以使用binlog来进行数据还原。
    假设我们现在又对hellodb数据库中的students表进行了内容添加??(如下图)??。

?3.1 查看二进制日志位置?
    由于destination主机上的数据在进行第二次增量备份的还原时有回滚操作,可能会有事务不全,此时我们应该通过destination主机查看第二次增量备份整合到完全备份后的二进制日志位置??(如下图)??。

?3.2 发送二进制日志至目标主机?
    其他的事务都是在第二次增量备份整合到完全备份之后发生的,因此要将mysql-bin.000006二进制文件156节点后的所有数据进行还原,需要xtrabackup主机将mysql-bin.000006和之后的二进制日志文件都发送到destination主机上,由于刚好都在一个二进制日志文件上,笔者这边只发送一个即可??(如下图)??。

?3.3 生成并读取SQL文件?
?    ?destination主机执行  ?mysqlbinlog /backup/mysql-bin.000006 --start-position=156 > /backup/binlog.sql  ?命令,将完全备份+增量备份还原数据后新增的数据添加到binlog.sql文件中,登录数据库后先关闭二进制日志,然后通过source来读取生成的SQL文件数据??(如下图)??。


?3.4 测试环节?
    读取完SQL文件数据,可以重新开启二进制日志,此时查看hellodb数据库中的students表,在完全备份+增量备份之后添加的两条学生信息也已经还原到destination主机数据库中??(如下图)??。
【xtrabackup实现全量+增量+binlog恢复库】

    推荐阅读