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