跳转至

16. mysqldump+binlog故障恢复案例模拟

1. 背景环境

#1. 背景环境: 正在运行的网站系统,mysql数据库,数据量25G,日业务量10-15M
#2. 备份方式: 每天2300,计划任务调用mysqldump执行全备脚本
#3. 故障时间点:上午1000,误删除一个表

2. 恢复思路

1.挂出维护页面
2.找测试库
3.恢复全备到测试库
4.追加二进制日志到误删除时间点,恢复到测试库
5.验证数据,将故障表导出,导入生产库
6.开启业务

3. 模拟故障

3.1 模拟昨天23:00全备

mysqldump -uroot -p -A -R --triggers --master-data=2 --single-transaction > all.sql

3.2 模拟23:00-10:00业务

create database baidu chaset utf8;
use baidu;
create table t1 (id int);
insert into t1 values(1),(2),(3),(4),(5),(6);
commit;
update t1 set id=10 where id =1;
commit;
select * from t1;

3.3 模拟10:00误删除表

use baidu;
drop table t1;

4. 准备恢复数据

4.1 查找二进制日志起点终点

#查看全备文件第22行:找到二进制日志恢复起点
vim /backup/full.sql
#查看误删除时的位置信息,找到二进制日志恢复终点
mysql -root -p
show binlog events in 'mysql-bin.000001';

4.2 截取二进制日志

mysqlbinlog --start-position=425 --stop-position=1231 /data/mysql/mysql-bin.000001 >/backup/binlog.sql

5. 恢复数据到测试库

mysql -uroot -p

set sql_log_bin=0;
source /backup/full.sql
source /backup/binlog.sql
set sql_log_bin=1;

6. 验证数据

mysql -uroot -p

select * from baidu.t1;

7. 将t1表从测试库导出

mysqldump -uroot -p -R --triggers --master-data=2 --single-transaction baidu t1 >/backup/t1.sql

8. 在生产库中导入表

mysql -uroot -p

set sql_log_bin=0;
source /backup/t1.sql
set sql_log_bin=1;

9. 验证数据

mysql -uroot -p

select * from baidu.t1;

最后更新: 2022-02-20 08:44:07