MySQL数据库之全量+增量+二进制日志的备份与恢复

一、简介数据的备份与恢复

1、为什么备份?

  • 灾难恢复:人为错误、硬件故障(冗余)、软件故障(bug)、自然灾害、黑客攻击、误操作、…;
  • 测试;

2、备份时应该注意些什么?

  • 能容忍最多丢失多少数据;
  • 恢复数据需要在多长时间内完成;
  • 需要恢复哪些数据;
  • 做恢复演练:测试备份的可用性;增强恢复操作效率;

2、备份的数据集的范围:

  • 完全备份:整个数据集;
  • 部分备份:数据集的一部分,比如部分表;

3、全量备份、增量备份、差异备份:

  • 完全备份
  • 增量备份:仅备份自上一次完全备份或 增量备份以来变量的那部数据;
  • 差异备份:仅备份自上一次完全备份以来变量的那部数据;

4、根据数据服务是否在线:

  • 热备:读写操作均可进行的状态下所做的备份;
  • 温备:可读但不可写状态下进行的备份;
  • 冷备:读写操作均不可进行的状态下所做的备份;

注意:在实际生产环境中,很少有把服务器机器停下来进行备份,一般是在运行中进行备份数据,而且专门备份的数据相比之下都是较大的数据,所以一般情况使用的是物理热备。

5、备份策略:

  • 全量+差异 + binlogs
  • 全量+增量 + binlogs

6、备份工具:

  • mysqldump:mysql服务自带的备份工具,是一种逻辑备份工具,它支持一下方式备份:

    完全、部分备份;

    InnoDB:热备;

    MyISAM:温备;

  • cp/tar

    lvm2:快照(请求一个全局锁),之后立即释放锁,达到几乎热备的效果;物理备份;

    注意:不能仅备份数据文件;要同时备份事务日志;

    前提:要求数据文件和事务日志位于同一个逻辑卷;

  • innobackup[收费] / xtrabackup[免费]:

    由Percona提供,开源工具,支持对InnoDB做热备,物理备份工具;

    完全备份、部分备份;

    完全备份、增量备份;

    完全备份、差异备份;

二、实现数据库全量+增量+二进制日志备份与恢复

Xtrabackup是MySQL数据库的备份不可多得的工具之一。提供了全备,增备,数据库级别,表级别备份等等。

percona-xtrabackup软件包中中包含了两个工具,一个是xtrabackup,另一个是innobackupex,innobackupex由per进行封装,在对innodb表进行备份时会自动调用xtraback工具,所以对InnoDB表做备份的实际是xtrabackup这个工具,xtrabackup也只能对innodb表做备份,这是一个专门对innodb开发的热备工具,而对myisam这样的其他引擎的表则由innobackupex来负责备份,若是全备份加增量的方案,那每次增量innobackupex工具对非innodb表都是全备份且会请求读锁。

xtrabackup对innodb表进行备份时不再只是简单复制文件,而是利用在innodb存储引擎层中的LSN(日志序列号)的新旧来识别这一数据页是否需要备份。

xtraback工具对innodb引擎完美支持真正的热备份,备份好的数据中数据文件与事务日志的文件因innodb cache等因素的存在,所以备份好的数据和事务日志中的数据往往是不一致的,所以,在做数据恢复时需要把事务日志中已提交的事务做redo,没有提交的事务做undo操作,这就是在做数据恢复时要做的准备工作,即prepare。

在以下地址可以下载到xtrabackup:http://www.percona.com/downloads/XtraBackup/,可以根据自己的需要选择稳定版本或者最新版本以及操作系统、源码包或者rpm包等等。

我下载了最新版的rpm包:percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm

使用yum安装可以把依赖的包一起安装上

每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。

实验环境:两台安装centos7系统的主机,A主机上安装Mariadb数据库,并且已经初始化,B主机上安装了Mariadb数据库,没有初始化。并且A和B都安装了percona-xtrabackup-24-2.4.8-1.el7.x86_64.rpm

需要注意的是,增量备份仅能应用于InnoDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。

在A主机上:

创建一个数据库test,并且在数据下创建一个students表,里面添加了若干数据数据。

备份

全量备份

第一次修改数据

修改数据后,第一次增量备份

第二次修改数据

第二次修改数据后增量备份

第三次修改

修改之后,这时候,服务器宕机,数据库崩溃,需要我们恢复数据,但是二进制日志还在。

查看最后一次增量备份完成的位置,以确定后面的操作二进制日志开始纪录的位置,并二进制日志还原数据增量备份之后的数据

备份增量备份之后的二进制日志文件

把A机器上的备份的文件,以及二进制日志文件拷贝到B机器上,准备做恢复操作。

注意:备份的数据不应该和原数据存放在一起,如果遭受遭难,那么备份的数据和原数据一起被损坏,备份就失去意义了。

恢复

准备增量备份与整理完全备份有着一些不同,尤其要注意的是:

(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放之后”,所有的备份数据将合并到完全备份上。

(2)基于所有的备份将未提交的事务进行“回滚”。全量备份文件中完成和未完成的,执行提交和回滚操作。

全量备份文件中完成和未完成的,执行提交和回滚操作

第一次增量备份文件中完成和未完成的,执行提交和回滚操作

第二次增量备份文件中完成和未完成的,执行提交和回滚操作

全部在滚回提交一次

同时可以注意到,备份开始的位置是全量备份最初的位置,结束的位置,是第二次增量备份结束的位置。

恢复全量+第一次增量+第二次增量备份数据

如下,数据库中已经有对应的数据

把备份数据文件的所属主和所属组修改为mysql

登陆数据库,需要注意的是,登陆的用户名,密码都是原数据的用户名和密码

细心的朋友可以看到,我们并没有完全恢复数据,还有增量备份之后的数据还没恢复。

恢复完成,和宕机之前数据做对比,完全一样,恢复成功

MariaDB [(none)]> select * from test.students;

| 3088 | stu88 | 38 | M | NULL |

| 3089 | stu89 | 95 | M | NULL |

| 3100 | xiaoming | 18 | M | yingyu |

+——+———-+——+——–+——–+

1089 rows in set (0.01 sec)

恢复完成后,不要着急上线,赶紧做一次全量备份,生成新的序列。

猜你喜欢

转载自www.cnblogs.com/mysql-sql/p/11018038.html