今天测试数据 然后不小心误删数据 当时慌的要死 当时学过mysql的binlog日志 第一时间就想起来binlog日志但是呢 没有实际操作过 也不知道怎么操作 还是很慌 在博客找了一圈有很多 但是遇到很多问题 现在修复完成 特别记录一下 分享给有需要的人
修复过程
1. 在mysql console中输入命令:
show variables like 'log_bin';
result:
Variable_name | Value |
log_bin | ON |
- 结论: 如果是OFF那就G准备拎包走人吧 现在是支持从binlog恢复。
- 还有一点要知道就是需要binlog记录了你的操作 也就是binlog需要把你的DROP操作已经刷新到binlog里
2. 找到binlog路径
show variables like '%datadir%';
result:
Variable_name | Value |
datadir | /var/lib/mysql/ |
- 这个路径需要在下面4.3中用到,当然了,如果是docker方式的mysql,那么需要根据docker编排的volumes来获取binlog路径。
3. 查看当前binlog
show master logs;
Log_name | File_size | Encrypted |
mysql-bin.000001 | 278849903 | No |
- 确定当前的binlog是mysql-bin.000001
4. 确定mysql-bin.000001中需要恢复的起止位置
4.1. 将mysql-bin.000001中的事件导出到文本文件out.txt
mysql -h <mysql IP> --port <mysql 端口> -uroot -p show binlog events in 'mysql-bin.000001' > out.txt
ps:上面的命令可以使用但是有点问题 可能我对linux不太熟悉 所以失败了很多次 我这边尝试了很久找到一个简单的方法可以参考一下
4.1.1 第一种navicat方式
4.1.2 第二种方式是使用datagrip 更加便捷
4.1.1.1 以update的sql方式输出
4.1.1.2 以tsv方式输出 需要notpad++等工具阅读
二者选其一即可
4.2. 定位最后一条
grep,或者用less、sed、awk……都行,看自己习惯
搜索关键词:
DROP DATABASE `mysql-binlog-test`
CREATE DATABASE `mysql-binlog-test`
grep -E 'CREATE DATABASE `mysql-binlog-test`|DROP DATABASE `mysql-binlog-test`' out.txt |
结果如下:
Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
mysql-bin.000001 | 120 | Query | 2 | 293 | '/* ApplicationName=DataGrip 2022.1 */ CREATE DATABASE `mysql-binlog-test`'; |
mysql-bin.000001 | 650146 | Query | 2 | 650315 | '/* ApplicationName=DataGrip 2022.1 */ drop schema `mysql-binlog-test`'; |
|
|
|
|
|
|
找到其中需要的的 CREATE DATABASE的Pos: 120和 DROP DATABASE的Pos:650146
4.3. 用mysqlbinlog恢复
如果没有mysqlbinlog(docker),那么安装mysql-client,此处忽略。
mysqlbinlog --start-position=120 --stop-position=650146 --database=mysql-binlog-test <binlog 路径>/mysql-bin.000001 | mysql -h <mysql IP> --port <mysql 端口> -uroot -p -v ;