这篇文章上次修改于 449 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

某天,有个客户找过来说平台里面的数据都没了,一通排查日志后发现是被他们自己删除掉了,于是问能不能给他们恢复一下,我看了下,万幸服务器的mysql上开启了binlog记录,还有的救,于是按照教程搞一下,特此记录

查看binlog功能是否开启

show variables like '%log_bin%';


mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------+
| Variable_name                   | Value                        |
+---------------------------------+------------------------------+
| log_bin                         | ON                           |
| log_bin_basename                | /data/binlog/mysql-bin       |
| log_bin_index                   | /data/binlog/mysql-bin.index |
| log_bin_trust_function_creators | OFF                          |
| log_bin_use_v1_row_events       | OFF                          |
| sql_log_bin                     | ON                           |
+---------------------------------+------------------------------+
6 rows in set (0.18 sec)

log_bin结果为ON,可以进行数据恢复

查看数据文件存放路径

[root@ZJHZ-XS6F-5GSL-03 ~]# cat /etc/my.cnf|grep binlog
log_bin=/data/binlog/mysql-bin
binlog_format=row
binlog_cache_size=2M
max_binlog_cache_size=8M
max_binlog_size=512M

通过mysqlbinlog 恢复删除的数据日志记录

通过查询日志可以知道,删除语句是在2023-11-22 10:18:49左右执行的,通过start和end时间精确获取该段时间内的删除操作记录

/usr/local/mysql/bin/mysqlbinlog --no-defaults --base64-output=decode-rows  -v --database=xxx --start-datetime="2023-11-22 10:18:48" --stop-datetime="2023-11-22 10:18:50" /data/binlog/mysql-bin.000026 > mysqllog.sql

备注:

mysqlbinlog 命令的参数说明
--base64-output=decode-rows //数据转换正常的字符,如果不设置这个参数将显示base64的数据
--database=DBName  //数据库名(一个mysql数据库比较多,指定方便恢复)
--start-datetime="2023-11-22 10:18:48"  //恢复起始时间
--stop-datetime="2023-11-22 10:18:50"  //恢复结束时间
/data/binlog/mysql-bin.000026  //为数据恢复的日志文件
mysqllog.sql    //恢复以后我们需要的文件名

把mysqllog的DELETE转换为INSERT语句

cat mysqllog.sql | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/;INSERT INTO/g;s/WHERE/SELECT/g;'| sed 's/@1=//g'| sed 's/@[1-9]=/,/g' | sed 's/@[1-9][0-9]=/,/g' > mysqllogOK.sql

删除第一行多出来的分号

使用myql导入sql文件

/usr/local/mysql/bin/mysql -uroot -p xxx < ./mysqllogOK.sql 

大功告成

总结

mysql的binlog功能还是很有用的,记得开启