误删除数据恢复
把binglog解析为文本
mysqlbinlog --no-defaults --base64-output=decode-rows -v -v ./mysql-bin.001250 > mysql_bin_log.txt
- 如果确定时间范围,可以使用:
mysqlbinlog --no-defaults --database=test_db --start-datetime="2024-09-12 00:00:00" --stop-datetime="2024-09-13 00:00:00" ./mysql-bin.001250 > mysql_bin_log.txt
- 如果确定时间范围,可以使用:
过滤出 test_db.test_table 的删除内容
cat mysql_bin_log.txt | sed -n '/### DELETE FROM
test_db.
test_table/,/COMMIT/p'
确认好之后,保存到文件中:
cat mysql_bin_log.txt | sed -n '/### DELETE FROM
test_db.
test_table/,/COMMIT/p' >> mysql_delete.txt
把 DELETE 数据转换成 insert into 语句
1
2
3
4
5
6cat table_delete.txt \
| sed -n '/###/p' \
| sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' \
| gsed -r 's/(@22.*),/\1;/g' \
| sed 's/@.*=//g' > recovery.sql- 所以最后(4个sed)替换的操作为:
- 只保留包含 ### 的行
- 多重操作
i. 删除每行的前缀注释 ###
i. 删除 数据列 对应的 mysql注释
i. 替换 DELETE FROM 为 INSERT INTO
i. 替换 WHERE 为 SELECT - 按正则替换第 22 列(表一共22列)最后的 , 逗号为 ; 分号
- 删除 数据列 的前缀, 只保留对应的数据
- 所以最后(4个sed)替换的操作为:
注意:
gsed 是由于MAC系统自带的 sed 没有 -r 选项, 所以安装:
brew install gnu-sed
gsed -r 's/(@17.*),/\1;/g'
中的 @17 其实是 test_table 表的最后一列