(4.10)mysql备份还原——利用binlog+全备恢复误删表【推荐使用binlog2sql】

【1】【2】部分转载自:https://blog.csdn.net/zwjzqqb/article/details/80886107

【常用形式】

1】在test库redo某个binlog中的文件
mysqlbinlog binlog.000011 | mysql -uroot -p123456 test

【2】时间点恢复
mysqlbinlog --stop-datetime='2019-04-24 11:12:00' binlog.000011 | mysql -uroot -p123456 test

【3】时间点重做
mysqlbinlog --start-datetime='2019-04-24 11:30:00' --stop-datetime='2019-04-24 18:10' binlog.000011 | mysql -uroot -p123456 test

【4】读取多个binlog
mysqlbinlog --start-datetime='2016-02-25 00:00:00' --stop-datetime='2016-03-15 17:00:00' mysql-bin.000023 mysql-bin.000024 >a.

 

【1】全库+binlog增量 

# 依据全备文件,定位起始binlog日志文件和pos
cd /tmp/
head -30 Full_Backup.sql|grep CHANGE
# -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000002', MASTER_LOG_POS=268403;

# 抽取全备点之后的binlog日志
mysqlbinlog binlog.000002 --start-position=268403 >Full_binlog.sql
# 如果有其他binlog日志,则追加即可: # mysqlbinlog binlog.
000003 >>Full_binlog.sql # 全库恢复 mysql -uroot -pvincent < Full_Backup.sql
# 追加binlog,增量恢复
mysql -uroot -pvincent < Full_binlog.sql

  # 也可以如下,这样一个一个应用日志
# mysqlbinlog --stop-position=567 binlog.000002 |mysql -uroot -pvincent
# 测试:
mysql -uroot -pvincent
select max(id) from vincent1.test1;
select max(id) from vincent2.test1;
select User,Host from mysql.user where user!='root';
exit
# 3867
# 3757
# vincent1
# vincent2
# 因为是全库恢复,因此创建的账号和俩业务库全部恢复
# 业务库中的表数据和源端保持一致,增量恢复成功

【2】单库恢复

# 依据单备文件,定位起始binlog日志文件和pos
cd /tmp/
head -30 Vincent1_Backup.sql|grep CHANGE
# -- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000002', MASTER_LOG_POS=362938;

# 抽取全备点之后的binlog日志,使用参数-d只抽取vincent1库相关操作
mysqlbinlog binlog.000002 -d vincent1 --start-position=362938 >Vincent1_binlog.sql
# 如果有其他binlog日志,则追加即可: # mysqlbinlog
-d vincent1 binlog.000003 >>Vincent1_binlog.sql # 删除已经恢复的数据,做单库恢复 mysql -uroot -pvincent -e "drop database vincent1;" mysql -uroot -pvincent -e "drop database vincent2;" mysql -uroot -pvincent -e "drop user vincent1;" mysql -uroot -pvincent -e "drop user vincent2;" mysql -uroot -pvincent -e "flush privileges;" # 因为单库备份脚本没有使用-B参数,无建库语句,因此要手动建库,库名必须和故障时一样啊,不然binlog中的日志无法对应找到库名 mysql -uroot -pvincent -e "create database vincent1;" mysql -uroot -pvincent -o vincent1 < Vincent1_Backup.sql # 追加binlog,增量恢复 mysql -uroot -pvincent < Vincent1_binlog.sql # 测试: mysql -uroot -pvincent select max(id) from vincent1.test1; select max(id) from vincent2.test1; select User,Host from mysql.user where user!='root'; exit # 3867 # 表不存在 # 无root账号之外的账号 # 因为是单库恢复,因此创建的业务账号和第二个业务库全部没有恢复 # 业务库1中的表数据和源端保持一致,增量恢复成功

【3】案例

场景:不小心误删除某张表

解决方法:在另外一台机器,恢复全库+日志,然后导出删除的表,再插入会生产库。

案例演示:

案例描述:test1数据库,test1表
  1点全备,3点更新,4点删表。如何恢复?

模拟案例步骤如下:

(1)查看全备时的数据
    

(2)1点:进行全备

#切换到linux环境(mysqldump参考)

#备份所有数据库:mysqldump -F -R -uroot -p -A >/tmp/all_db.bak     # -F:刷新binlog日志,-R:存储过程及触发器。 -A:所有数据库

mysqldump -F -R -uroot -p  test1 >/tmp/test1_db.bak

(3)3点:更新表

update test1 set name = '赵更新' where id in (1,2); 

commit;

(4)4点:删除表

drop table test1;

(5)查看恢复时间点/恢复位置

a)查看当前binlog日志

show master status;

    

b)查阅binlog日志  #切换到linux环境下

  找到删除之前的点,就是567(时间点的话就是:2019-03-12 00:00:28)  

    

(6)在新机器上进行还原

【一个错误的假设】还原了test2,基于test1的全备,等下就用这个测试吧

#想利用全备恢复到本实例一个新的数据库名称,发现不行,binlog重做的时候,使用的还是原本的数据库名称。 #如果是上面的全库备份,可以使用
-o来指定所需要恢复数据库 mysql -uroot -p -o test2 </tmp/test1_db.bak mysql -uroot -p test2 </tmp/test1_db.bak
#如果是使用的全备可以用--database=test1,来指定只重做test1库的日志 mysqlbinlog --stop-position=567 --database=test1 binlog.000002 |mysql -uroot -p test2
 mysqlbinlog --stop-position=567 binlog.000002 |mysql -uroot -p test2

  

【实际可行策略】 

我这里就没有其他机器,我删掉库重建演示吧,如果有其他实例或者机器,那就不用删除了。

6.1)删除重建

   drop database test1;

   create database test1 default charset utf8; #一定要和原数据库一样的字符编码

6.2)还原数据

   mysql -uroot -p test1 </tmp/test1_db.bak

6.3)重做binlog日志

   mysqlbinlog --stop-position=567 binlog.000002 |mysql -uroot -p test1

6.4)核验--成功

   

6.5)备份表

  mysqldump -uroot -p test1 test1 >/tmp/test1_table.bak

6.6)还原表到test2库看看

  mysql -uroot -p test2 </tmp/test1_table.bak

    

 

posted @ 2019-04-24 22:12  郭大侠1  阅读(215)  评论(0编辑  收藏  举报