一、查看是否开启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语句脚本将数据导入数据库