ERROR 1146 (42S02): Table ‘xxxxxxx‘ 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 恢复步骤

  1. 停止应用,防止再有数据写入数据库
  2. 查看fullback中binlog文件及Master_log_ID号
  3. 根据Master_log_ID从binlog文件中恢复binlog.sql
  4. 删除binlog.sql中引发错误的语句
  5. 导入全备数据
  6. 导入binlog数据
  7. 完成恢复,验证完毕后启动应用.

5.2 恢复结果

  1. 被删除的students表中原来的数据及全备之后新增的数据都正常恢复.
  2. 没有被删除,但在全备后有更新及students表被删除后更新的数据也被正常恢复.

至此数据恢复完成,启动应用即可恢复业务.
在这里插入图片描述
删库须谨慎,没事练跑步!

5.3 相关法律条款

刑法第二百八十六条 “破坏计算机信息系统罪”
违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的,处五年以上有期徒刑。

猜你喜欢

转载自blog.csdn.net/qq_29974229/article/details/119989114