由于项目前期系统刚上线,有些bug,产生了些脏数据,然后通过修改bug,把这些脏数据给删除了,但是有一部分用户的数据客户还需要用到,由于没有记录日志, 所以只能通过mysql的binlog日志找回了。
提示:mysqlbinlog 命令工具需要在mysql的安装目录bin下找到mysqlbinlog工具,要在这个目录下执行才行
想要使用mysql的binlog日志,那么就需要开启mysql的binlog日志记录
show variables like '%log_bin%';
可以查看到是否开启binlog日志记录, 如果是ON就是说明开启
show master logs;
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,然后跑到数据库即可。
整理后的sql
记录下生产数据回滚