ERROR 1146 42S02: Table doesn't exist模拟删表删库恢复
0. 事件概要
每天8:20通过脚本对数据库进行全备,备份目录/backup/
备份完成后数据库发生了一系列变更
8:30时某位同学误操作删除了一张重要的表
此时应用任然处于工作状态,又有一系列变更发生
直到8:35运维同学发现了数据库异常,并通知用户进行临时停机维护
8:50完成数据恢复工作,并开发应用访问
1.准备工作
1.1 确保binlog配置文件
/etc/my.cnf.d/mysql-server.cnf
或/etc/my.cnf,/etc/my.cnf.d/任意配置文件[mysqld]
[mysqld]
log-bin=/data/binlog/mysql-bin
binlog_format=row
1.2 建立binlog目录
建立binlog目录,并赋权给mysql用户
mkdir /data/binlog/;chown mysql.mysql /data/binlog/
1.3 重启Mysqld服务使配置生效
systemctl restart mysqld
2. 数据库备份
2.1 备份数据库脚本
#!/bin/bash
PATH=/opt/httpd/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
User=root
Passwd=123456
Filename=/backup/fullback_`date +%F`.sql
mysqldump -u$User -p$Passwd -A -F -E -R --triggers --single-transaction --master-data=1 --flush-privileges --default-character-set=utf8 --hex-blob > $Filename
2.2计划任务
20 8 * * * /root/mysqlbackup.sh
8:20时备份脚本被任务计划调度
查看备份文件可以知道,备份截止的binlog文件是mysql-bin.000003,masterlog号156
记住这个156,一会要用
3. 数据库持续更新
3.1 此后数据库发生了一系列变更
insert into teachers values(null,"Zhu GeLiang",34,"M");
insert into teachers values(null,"Zhou Yu",36,"M");
insert into teachers values(null,"Lu Su",42,"M");
insert into teachers values(null,"Cai WenJi",18,"F");
insert into students values(null,"A HuiNan",21,"M",8,7);
insert into students values(null,"Li Dian",19,"M",9,8);
insert into students values(null,"Xiao Qiao",19,"F",9,8);
3.2 删表操作
8:30时某高官误操作删除了students表
3.3 数据表持续被更新
8:31students表任然陆续有记录被更新
insert into teachers values(null,"Ma Chao",26,"M");
insert into teachers values(null,"Ma Dai",25,"M");
insert into teachers values(null,"Ma Tie",23,"M");
insert into teachers values(null,"Zhen Fu",17,"F");
update teachers set name="Liu Bei" where tid=6;
3.4 发现异常
8:35时发现了students库被删除.此时通知用户进行系统维护,并关闭相关应用.
4. 数据恢复
4.1 备份binlog
156前的binlog都已经在fullbackup中了,所以只需要备份156之后的binlog
mysqlbinlog --start-position 156 /data/binlog/mysql-bin.000003 > /backup/binlog`date +%F`.sql
由于是表被删除基本可以判断是用了drop命令,用grep 过滤binlog备份,看到确实存在该命令.
4.2 删除引起的异常语句
用sed命令删除有DROP TABLE行
4.3 恢复全备数据
source /backup/fullback_2021-08-30.sql
4.4 恢复Binlog
source /backup/binlog2021-08-30.sql
4.5 数据验证
select *from students;
select *from teachers;
5. 总结
5.1 恢复步骤
- 停止应用,防止再有数据写入数据库
- 查看fullback中binlog文件及Master_log_ID号
- 根据Master_log_ID从binlog文件中恢复binlog.sql
- 删除binlog.sql中引发错误的语句
- 导入全备数据
- 导入binlog数据
- 完成恢复,验证完毕后启动应用.
5.2 恢复结果
- 被删除的students表中原来的数据及全备之后新增的数据都正常恢复.
- 没有被删除,但在全备后有更新及students表被删除后更新的数据也被正常恢复.
至此数据恢复完成,启动应用即可恢复业务.
删库须谨慎,没事练跑步!
5.3 相关法律条款
刑法第二百八十六条 “破坏计算机信息系统罪”
违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的,处五年以上有期徒刑。