mysql开启bin_log和恢复误删数据

一、查看是否开启bin_log

show variables like ‘%log_bin%’;

如果为log_bin为ON说明可以恢复,如果为OFF说明没有开启binlog

二、找到my.cnf文件

whereis my.cnf

三、在[mysqld]下添加以下语句

server_id=2
log_bin=mysql-bin
binlog_format=ROW

四、重启mysql服务

systemctl restart mysqld

五、/var/lib/mysql找到mysql-bin.000002类型最新文件

六、提取误操作日志

mysqlbinlog --no-defaults --start-datetime='2023-03-17 15:40:00' --stop-datetime='2023-03-17 15:50:00'  -vv mysql-bin.000002

七、提取误操作日志输出到文件

mysqlbinlog --no-defaults -vv binlog.000007 --start-position=10147088 --stop-position=109132975 | grep ^"###" >data_reload

mysqlbinlog --no-defaults --start-datetime='2023-03-17 15:40:00' --stop-datetime='2023-03-17 15:50:00' -vv mysql-bin.000002 |grep ^”###” >/var/lib/mysql/bin_data.sql

八、将binlog里的delete语句转化为insert语句

cat bin_data.sql | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/VALUES(/g;' |sed -r 's/(@9.*),/\1);/g' | sed 's/@[1-9]=//g' >data_reload.sql

命令参数说明:

1、sed -n ‘/###/p’:打印’###'开头的行。
2、sed ‘s/### //g;s//*./,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/VALUES(/g;’:
s/### //g;s//*.
/,/g; 把’### ’ 和//去掉; s/DELETE FROM/INSERT INTO/g; 把delete from换成insert into; s/WHERE/VALUES(/g; 把where换成values(。
3、sed -r ‘s/(@9.*),/\1);/g’:-r是正则表达式,在@9开头的一行末尾添加一个 ); ,(此处为最后一个字段后),即补全了 values(v1, ……, v9); 。
4、sed ‘s/@[1-9]=//g’:将@1-@9去除。
注:具体情况具体分析,根据不同数据库表结构来执行本条命令。

九、执行insert语句脚本将数据导入数据库

猜你喜欢

转载自blog.csdn.net/weixin_45336946/article/details/129624649
今日推荐