记录mysql binlog日志回滚恢复

由于项目前期系统刚上线,有些bug,产生了些脏数据,然后通过修改bug,把这些脏数据给删除了,但是有一部分用户的数据客户还需要用到,由于没有记录日志, 所以只能通过mysql的binlog日志找回了。


提示:mysqlbinlog 命令工具需要在mysql的安装目录bin下找到mysqlbinlog工具,要在这个目录下执行才行

命令

想要使用mysql的binlog日志,那么就需要开启mysql的binlog日志记录

show variables like '%log_bin%';

可以查看到是否开启binlog日志记录, 如果是ON就是说明开启

MySQL浏览记录表反馈意见表 mysql查看回滚记录_sql


show master logs;

MySQL浏览记录表反馈意见表 mysql查看回滚记录_mysql_02


show binlog events in ‘bin.000078’;

mysql> show binlog events in 'bin.000078';
+------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                                                     |
+------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------+
| bin.000078 |   4 | Format_desc |         1 |         120 | Server ver: 5.6.45-log, Binlog ver: 4                                    |
| bin.000078 | 120 | Query       |         1 |         211 | BEGIN                                                                    |
| bin.000078 | 211 | Query       |         1 |         351 | use `usercenter`; DELETE FROM `usercenter`.`sms_vercode` WHERE `id` = 36 |
| bin.000078 | 351 | Xid         |         1 |         382 | COMMIT /* xid=48 */                                                      |
+------------------+-----+-------------+-----------+-------------+--------------------------------------------------------------------------+

可以使用grep命令查找需要查找的关键字的时间节点或者position:
然后通过命令输出对应的sql文件:下面我通过了几个命令输出,我是通过把这些日志文件复制到对应的/usr/local/目录下进行分析输出的

## 这个是输出整个binlog日志的sql并且还没有解码的, 
mysqlbinlog --no-defaults --skip-gtids=true  /usr/local/bin.000078 > /usr/local/resultsql-new.sql
## 这个是输出时间段的binlog日志的sql并且还没有解码的
mysqlbinlog --no-defaults --skip-gtids=true --start-datetime="2022-04-12 11:55:48" --stop-datetime="2022-04-12 11:59:48" -v /usr/local/bin.000078 > /usr/local/resultsql-new.sql
## 这个是输出整个binlog日志的sql并且已经解码的
mysqlbinlog --no-defaults --base64-output=decode-rows --skip-gtids=true -v  /usr/local/bin.000078 > /usr/local/resultsql-new.sql
## 这个是输出整个binlog日志的sql并且已经解码的,并且是指定delete语句的日志
mysqlbinlog --no-defaults --base64-output=decode-rows --skip-gtids=true -v  /usr/local/bin.000078 | sed -n '/### DELETE FROM `bpms-runtime`.`f_tb_resident_info`/,/COMMIT/p' > /usr/local/resultsql-new.sql
-- 这个是输出时间段的binlog日志的sql并且已经解码的,并且是指定delete语句的日志
mysqlbinlog --no-defaults --base64-output=decode-rows --skip-gtids=true --start-datetime="2022-04-12 11:55:48" --stop-datetime="2022-04-12 11:59:48" -v  /usr/local/bin.000078 | sed -n '/### DELETE FROM `bpms-runtime`.`f_tb_resident_info`/,/COMMIT/p' > /usr/local/resultsql-new.sql

注意: 前面两条命令是没有解码的,我们没办法查看真正的sql文件,如果使用前面两条的话,还得进行解码操作,所以建议拿后面两条命令来解码,拿到解码文件后的sql, 可以导下来到本地通过编辑器按照规则进行替换成需要的sql即可,或者通过Linux的sed 命令进行替换(这个命令我还没研究,需要的同学可以研究下)

cat resultsql-new.sql | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' | sed -r 's/(@4.*),/\1;/g' | sed 's/@[1-30]=//g' > t1.sql

我是根据规则,通过编辑器的整理出来的sql,然后跑到数据库即可。

MySQL浏览记录表反馈意见表 mysql查看回滚记录_MySQL浏览记录表反馈意见表_03


整理后的sql

MySQL浏览记录表反馈意见表 mysql查看回滚记录_sql_04

总结

记录下生产数据回滚