场景
遇到后台数据批量误删,需要进行数据恢复。
准备
1、确定需要恢复数据的时间段
2、查看是否开启了binlog
(1)终端执行命令,连接mysql
mysql -h地址 -P端口号 -u账号 -p
输入密码后回车即可连接成功
(2)执行如下命令,查看binlog日志是否开启
mysql> show variables like 'log_%';
log_bin
如果为 ON 则为开启状态,如果开启了就可以继续操作了,如果没开启就GG
恢复数据
一、确认日志文件
查看下binlog日志列表
show master logs;
因为后台管理人员刚误删就反馈给我,00038 是最新的,所以确定我需要恢复的数据在 mysql-bin.000038 文件内。
也可以通过执行如下命令,查看文件最后一个操作事件 Position 结束点的值。
show master status;
二、导出日志文件
可以在终端工具中执行如下命令查看该文件内的内容,但是内容很多的情况下查看或者查询起来并不方便。
show binlog events in 'mysql-bin.000038'\G;
所以我们可以将该文件导出为 sql 或者 txt 文件:
1、进入到mysql的bin目录下:
// 这个是我使用宝塔的路径cd /www/server/mysql/bin
2、生成 sql 文件:
1、全部导出./mysqlbinlog --set-charset=utf8 /www/server/data/mysql-bin.000038 > tmp.sql;2、指定一个时间区间来导出./mysqlbinlog --base64-output=decode-rows -v --database=数据库名 --start-datetime="2021-12-04 16:50:00" --stop-datetime="2021-12-04 17:10:10" /www/server/data/mysql-bin.000038 > tmp.sql
3、下载生成的 sql 文件:
可以在刚刚执行命令的目录下看到生成的 sql 文件:
根据查看导出的 sql 文件,精准确定是哪一步执行的删除语句,然后记录好时间区间和 pos 点的区间,进行如下的数据恢复。
二、根据文件恢复数据
1、按pos点./mysqlbinlog --start-position=开始点 --stop-position=结束点 --database=数据库 /binlog路径/mysql-bin.000001 | ./mysql -u用户名 -p密码 -v 数据库2、按时间./mysqlbinlog--start-datetime="2022-12-30 10:00:00" --stop-datetime="2022-12-30 18:00:00" --database=demo5_p2p7_cn /www/server/data/mysql-bin.000038 | ./mysql -uroot -p12345 -v datebase;例子:./mysqlbinlog --stop-position=6731921 --database=demo5_p2p7_cn /www/server/data/mysql-bin.000038 | ./mysql -uroot -p12345 -v datebase;
命令执行完成后,即可完成数据的恢复。
PS:我是直接通过导出的 sql 文件进行恢复的,数据量少可以这样操作,数据量大还是需要根据 pos 点或者时间区间进行恢复