1、确认mysql开启了binlog日志
2、登录mysql服务器查看my.cnf找到datadir日志文件路径
3、根据删除数据时间执行mysqlbinlog命令:
// 这一步将执行delete语句的日志导出
mysqlbinlog --no-defaults /opt/local/data/mysql-bin.000014 --base64-output=decode-rows -v --start-datetime='2023-06-15 15:14:12' --stop-datetime='2023-06-15 15:14:14' --database=datax_web >/opt/delete.sql
//也可以根据position查找
mysqlbinlog --no-defaults -vv --start-position=857219053 --stop-position=857219526 /opt/local/data/mysql-bin.000206 >/opt/bin_data.sql
以上日志导出会包含原delete语句及涉及的每一条delete语句,@1代表表中第一个字段
然后导出数据涉及时间段所有的格式化日志文件:
mysqlbinlog --no-defaults -vv --start-datetime='2023-06-12 00:00:00' --stop-datetime='2023-06-15 12:50:00' --database=org_protal_release /opt/local/data/mysql-bin.000205 >/opt/delete.sql
再从日志文件中查找对应字段键值对,修改日志文件为insert语句
4、网上根据delete语句日志生成insert的最终字段不全:
cat /opt/bin_data.sql | sed -n '/###/p' | sed 's/### //g;s//*./,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' |sed -r 's/(@17.),/\1;/g' | sed 's/@[1-9]=//g' | sed 's/@[1-9][0-9]=//g' > /opt/delete2insert.sql
5、网上直接用mysqlbinlog命令恢复的执行后报错
mysqlbinlog --start-datetime="2023-06-15 11:52:53" --stop-datetime="2023-06-15 11:52:54" --database=org_protal_release /opt/local/data/mysql-bin.000206 | /opt/local/mysql -u root -p DAWQuw=hkc7amy -v org_protal_release
报错为:ERROR 1032 (HY000): Can't find record in ''
搜索可以修改my.cnf设置忽略此报错,需要重启未尝试
6、mysqlbinlog命令没有设置只查某个表的参数,可以加 | grep 'sat_doctor_satisfied_suggest_record' 设置但是这样只能按行过滤会丢失其他行的参数值,好像可以设置前几条后几条没找到命令未尝试
7、mysqlbinlog日志有存储天数设置,如果删除数据超出了保存天数可能不好恢复了,需要尝试第4种