Mysql增量备份与恢复_第1张图片 Mysql增量备份与恢复_第2张图片  



实现增量备份

要进行mysql增量备份,首先要开启二进制日志功能。

在mysql配置文件的【mysqld】项中加入log_bin=mysql-bin,重启服务

vim /etc/my.cnf

............

[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1

log_bin=mysql-bin              #开启二进制日志文件的功能

...........

service mysqld restart     #重启mysql服务

Mysql增量备份与恢复_第3张图片  

   101  

使用mysqldump完全备份school库的info表(在school库中提前建好一个表info用作实验)

 Mysql增量备份与恢复_第4张图片

mysqldump -uroot -p school info>/opt/info.sql

103

使用mysqladmin的选项flush-logs生成新的二进制文件mysql-bin.000002,这样在插入新的数据后,新的二进制文件对应的就是数据库的变化的内容。

完全备份之后再插入数据,然后进行增量备份

mysqladmin -uroot -p flush-logs     #刷新生成的新日志为空日志

 

Mysql增量备份与恢复_第5张图片

Mysql增量备份与恢复_第6张图片

mysqladmin -uroot -p flush-logs     #对刚才的操作进行增量备份

mysqlbinlog --no-defaults --base64-output=de code-rows -v mysql-bin.000002    

--base64-output=de code-rows -v #查看二进制日志文件不会出现乱码

Mysql增量备份与恢复_第7张图片

Mysql增量备份与恢复_第8张图片

增量恢复

增量恢复比完全恢复操作更为繁琐,每个增量备份都是单独的个体,数据不重复,需要控制的更加精确

下面我们模拟完全备份之后丢失所有数据的恢复步骤

当完全备份和增量备份之后,所有数据丢失,需要把完全备份和所有增量备份文件逐个恢复

mysql -uroot -p -e 'use school;drop table info;show tables;'      #使用drop删除表info,也就是假设完全备份前info的数据和完全备份后info的数据都丢失了

mysql -uroot -p school

mysql -uroot -p -e 'use school;show tables;select * from info'     #不进入mysql查询info表的数据恢复情况

被删除的表中的数据又可以查询出来,说明完全恢复成功。

Mysql增量备份与恢复_第9张图片

使用二进制文件进行增量恢复操作,

mysqlbinlog --no-defaults mysql-bin.000002 | mysql -uroot -p    

不进入mysql查询info表的数据恢复情况,增量备份的新插入的数据找回来了,说明数据恢复成功

mysql -uroot -p -e 'use school;show tables;select * from info'

Mysql增量备份与恢复_第10张图片

基于时间点与位置的恢复

利用二进制日志可实现基于时间点与位置的恢复,例如由于误操作删除了一张表,这时完全恢复是没有用的,因为日志里面还存在误操作语句,我们需要的是恢复到误操作之前的状态,然后跳过误操作语句,再恢复后面操作的语句

假定需要往数据库中插入两条数据,但由于误操作,两条插入语句中间删除了一条数据,而这条数据是不应该删除的

Mysql增量备份与恢复_第11张图片  

进行增量备份,并查看二进制文件中保存的增量备份语句

mysqladmin -uroot -p flush-logs

mysqlbinlog --no-defaults --base-output=decode-rows -v mysql-bin.000003

二进制文件mysql-bin.000003中既包含了正确的插入语句,同时也保存了不应该执行的删除语句

二进制文件中对语句的执行时间和位置也进行了保存,

Mysql增量备份与恢复_第12张图片

Mysql增量备份与恢复_第13张图片

Mysql增量备份与恢复_第14张图片

模拟数据库损坏,删除info表

Mysql增量备份与恢复_第15张图片

(1)基于时间点的恢复

将某个起始时间的二进制日志导入数据库中,从而跳过某个发生错误的时间点实现数据的恢复。

使用mysqlbinlog命令加上以下两个选项:

--stop-datetime      表示在哪个时间点结束,后面误操作的语句不执行,

--start-datetime      表示执行后面的语句,结合使用它们就可以跳过误操作的语句,完成恢复工作。

需要注意的是,二进制文件中保存的日期格式需要调整为用“-”分割

mysql -uroot -p school

mysqlbinlog --no-defaults --stop-datetime='2018-09-03 21:45:39' mysql-bin.000003 | mysql -uroot -p

mysqlbinlog --no-defaults --start-datetime='2018-09-03 21:48:07' mysql-bin.000003 | mysql -uroot -p

删除语句执行的时间点是21:45:39,--stop-datetime设置为21:45:39与它相同,表示删除语句之前的语句执行,也就是第一条插入语句执行,而删除语句及第二条插入语句不执行。

--start-datetime设置为21:48:07指定的是第二条插入语句执行的时间点,也就是执行第二条插入语句。

所以只执行了两条插入语句,而误操作的删除语句不执行

Mysql增量备份与恢复_第16张图片

(2)基于位置的恢复:一种更为精确的恢复方式

--stop-position=2281  误操作的删除语句前面的位置是2281 ,表示执行到误操作之前的位置点结束

--start-position=2502  表示执行第二条插入语句,跳过了误操作的删除语句,达到了恢复数据的目的。

mysqlbinlog --no-defaults --stop-position=2281  mysql-bin.000003 | mysql -uroot -p

mysqlbinlog --no-defaults --start-position=2502  mysql-bin.000003 | mysql -uroot -p

Mysql增量备份与恢复_第17张图片

不进入mysql查看数据表info的恢复情况

mysql -uroot -p -e 'use school;show tables;select * from info;'   

Mysql增量备份与恢复_第18张图片