有时候我们可能因为手抖或者粗心,执行了一条delete语句,导致正常的业务数据被删除了。
别慌,也先别跑路。
有很多种方式可以恢复回来,这一篇文章就来聊聊使用my2sql工具解析出delete语句的回滚操作(也就是insert),来恢复delete误删除的数据。
my2sql工具Github地址:https://github.com/liuhr/my2sql
不过要想使用my2sql恢复数据,需要注意这些:
- binlog格式必须为row,且binlog_row_image=full(表示记录的二进制日志将包含所有列的值,包括旧值和新值)
- 只能回滚DML, 不能回滚DDL
- 8.0 用户密码认证必须是mysql_native_password才能解析
我们通过一个实验,来模拟误操作,并进行恢复。
1. 新建测试表和测试用户
创建测试表并写入数据
1 | create database d_recover; |
创建恢复用户
1 | CREATE USER `u_rollback`@`127.0.0.1` IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'IgdI8G_aUU'; |
2. 安装Binlog解析工具my2sql
下载my2sql
1 | mkdir /data/backup/rollback -pcd /data/backup/rollbackwget https://github.com/liuhr/my2sql/blob/master/releases/centOS_release_7.x/my2sql |
3. 模拟误操作
1 | delete from d_recover.del_t1; |
4. 把误操作事务所在的Binlog复制到新目录
1 | mkdir /data/backup/rollbackcp /data/mysql/binlog/mysql-bin.000012 /data/backup/rollback |
5. 查看误操作事务开始和结束的位点
解析误操作期间的Binlog,预估误操作大概的起止时间,范围可以稍微大一点。
1 | cd /data/backup/rollbackmysqlbinlog mysql-bin.000012 --start-datetime='2023-06-21 01:20:00' --stop-datetime='2023-06-21 01:40:00' --base64-output=decode-rows -v > operation.sql |
找到误操作的Binlog,并确定开始和结束的位点
比如上面解析出的Binlog,误操作开始的位点可以认为是3556,结束的位点是3719
6. 生成回滚SQL
1 | /data/backup/rollback |
查看并确认回滚SQL
1 | cat recover_01/rollback.12.sql |
7. 导入回滚的SQL
如果确定回滚的SQL没问题,把回滚SQL导入到误操作的库里
1 | mysql -uroot -p <recover_01/rollback.12.sql |
再进行数据确认
1 | select * from d_recover.del_t1; |
如果一切顺利,那误删除的数据(1,1),(2,2)就已经恢复回来了。