利用mysqldump和binlog进行数据库备份和恢复操做

写在前面mysql

mysqldump用于备份数据,进行全库的全量备份,或者单库备份。sql

binlog用于增量备份,其增量备份的前提是创建在全量备份的基础之上的。数据库

即一次完整的恢复须要mysqldump备份文件+binlog才能正确还原回数据。测试

———————————————————————————————————————————————————————————spa

1、使用mysqldump备份全库+binlog备份并进行恢复。
备注:此处binlog的格式为Mixed的,本身感受设置为Mixed格式好一点。
一、首先建立test库和对应的表tb一、tb2
image.png
二、进行全库备份
image.png
三、此时咱们在往tb2表内添加一些数据,这时插入的记录记录在binlog中。
image.png
四、这时咱们模拟误删操做,对tb2进行全表update
image.png
五、查看当前binlog文件名称【此时建议刷新下binlog---> flush logs】,此次的update一样也记录到binlog中。我此次测试没有刷新binlog,若刷新了binlog,则对应的操做应该在上一个binlog文件内。
image.png
此时咱们进行数据恢复
、、、
恢复思路:从全库备份中恢复test库,在利用binlog进行数据的增量恢复。
、、、3d

一、全备中恢复指定库
从 mysqldump 全备中恢复指定库,使用--one-database 简写-o的参数,极大地方便了咱们恢复数据的灵活性
mysql -uroot -pTcdn@2007 -o test < all.sql日志

查看数据已经恢复到使用mysqldump备份前的状态了。
image.png
二、在使用binlog进行增量备份,恢复七、八、9字段的数据
登陆数据,查看binlog的events
image.png
image.pngcode

咱们看到在position位置为2304的时候进行了update操做,所以咱们从start-position=123到stop-position=2132这段时间恢复,即跳过update操做。把mysqldump到产生binlog的这段时间全部的操做在回放以便。
使用mysqlbinlog 指定起始pos和结束pos进行恢复。cdn

image.png

这样咱们就把数据恢复了。blog

2、如今咱们在测试使用mysqldump进行单库备份+binlog增量备份进行数据测试。

一、首先和前面同样,建立两个表tb一、tb2
image.png
二、而后咱们在进行单库备份
image.png
这样咱们就有了这样一个针对test库的一个备份(和生产环境备份策略一致)
三、一样咱们进行数据插入和全表update操做。
image.png

image.png
此时模拟误删操做了,而且此时咱们刷新下binlog(缘由为将误删操做截止到这个binlog,以便咱们查找信息)
四、下面咱们恢复数据。
image.png
此时看到已经恢复了部分数据,这是基于mysqldump的备份恢复的。
下来咱们在利用binlog日志进行数据恢复
五、登陆数据库内,查看binlog的events
image.png
image.png

咱们看到在position位置为7485的时候进行了update操做,所以咱们从start-position=123到stop-position=7313这段时间恢复,即跳过update操做。把mysqldump到产生binlog的这段时间全部的操做在回放以便。
使用mysqlbinlog 指定起始pos和结束pos进行恢复。
image.png
此时数据已经所有恢复了。

3、以上使用mysqldump备份数据的时候咱们都是备份的全库或者单库的。而在实际的生产环境中咱们通常也是这两种方式进行备份,我理解就是备份的比较粗略。没有细化到表。
可是通常咱们误删的操做基本都是针对表或表里面的字段进行操做的。
所以我这边测试下了,备份的时候使用备份单库,可是恢复的时候把有问题的表从库中抽出来,而后在恢复。最后结合binlog进行数据还原。
一、首先test库内有两张表tb一、tb2

image.png

二、此时咱们进行单库备份,即备份数据库test
image.png

三、在tb2表内插入数据,并进行数据误删操做(全表update)

image.png

image.png

此时刷新binlog
image.png

四、此时恢复咱们先从单库备份test.sql中把tb2这张表抽出来。使用sed -n便可

sed -n -e '/Table structure for table tb2/,/UNLOCK TABLES/p' test.sql > tb2_$(date +%F).sql

image.png

而后咱们在进行恢复(和前面同样的方式,只是后面的数据文件换了)

image.png

五、此时咱们在使用binlog这种方式进行增量恢复,进入到数据库内查看binlog的events。
mysql> show binlog events in "mysql-bin.000010";

image.png

咱们看到在position位置为16556的时候进行了update操做,所以咱们从start-position=123到stop-position=16384这段时间恢复,即跳过update操做。把mysqldump到产生binlog的这段时间全部的操做在回放以便。
使用mysqlbinlog 指定起始pos和结束pos进行恢复。
image.png
此时数据已经恢复了。

总结

数据库备份使用mysqldump+binlog的这种放手进行全量+增量的方式备份操做。

不管使用mysqldump的方式进行全库、单库、单表(此类型未测试,但感受能够)备份。都能恢复数据库。在加上binlog这种增量的备份进行增量还原便可完成数据库的迁移,即出现误操做的时候可使用这种方式尝试进行恢复。

相关文章
相关标签/搜索