Mysql数据库误删除数据恢复方案
一、查看binlog是否开启并锁表
#进入mysqlmysql -uroot -p#查看binlog是否开启show variables like '%log_bin%'; #如果log_bin显示为ON则开启成功#锁表,防止数据被污染lock tables test read;
二、查询目前在哪个binlog日志
#列出binlog列表show binary logs;#查询最新的binlogshow master status;
三、导出删除日期范围内的binlog日志
在mysql的bin目录下使用mysqlbinlog,如果是docker容器则使用find命令查找到mysqlbinlog命令所在文件,进入执行即可
mysqlbinlog -uroot -proot --base64-output=decode-rows --start-datetime="-01-13 08:00:00" --stop-datetime="-01-14 10:00:00" --read-from-remote-server -vv mysql-bin.000002 | sed -n '/### DELETE FROM `test`.`test`/, /COMMIT/p' > /var/lib/mysql/row.sql;#--base64-output=decode-rows 表示导出格式为row#--start-datetime="-01-13 08:00:00" 表示查询的开始时间#--stop-datetime="-01-14 10:00:00" 查询的结束时间#--read-from-remote-server 表示用于备份远程服务器的binlog。如果不指定该选项,则会查找本地的binlog。-vv 表示显示sql 语句加 字段类型#sed -n '/### DELETE FROM `test`.`test`/, /COMMIT/p' 表示过滤规则# > /var/lib/mysql/row.sql 表示输出路径
四、过滤刚刚导出的binlog日志
#先进入导出binlog的路径, docker可以去到容器外挂载路径cd /var/lib/mysqlcat delete.txt | sed -n '/###/p' | sed 's/### //g;s/\/\*.*/,/g;s/DELETE FROM/INSERT INTO/g;s/WHERE/SELECT/g;' | sed -r 's/(@3.*),/\1;/g' | sed 's/@[1-9]=//g' > rollback.sql;#sed -r 's/(@3.*),/\1;/g'#这里的@3代码过滤出的binlog的最后一行,替换掉最后的逗号变为;
在mysql中使用unlock tables;解锁表
再执行sql文件即可。