这篇文章上次修改于 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功能还是很有用的,记得开启