mysql如过不小心删除某行数据,或者修改了某行数据,可以通过binlog日志快速恢复
从navicat工具中打开数据库(test),查看有多少张表
SELECT A.TABLE_SCHEMA '数据库', A.TABLE_NAME '表名', A.TABLE_ROWS '表记录行数', A.CREATE_TIME '创表时间', A.TABLE_COMMENT '表备注' FROM INFORMATION_SCHEMA.TABLES A WHERE A.TABLE_SCHEMA = 'test'
可以看到test数据库下面有3张表
此时我们手动删除表stu2,执行 drop table stu2。
开始紧急恢复!!!
恢复前置条件
如果想要恢复mysql数据,请务必开启binlog日志,否则无法恢复!神仙来了也救不了
1.查看是否开启binlog
show variables like '%log_bin%';
此项务必是ON(开启)
2.如果未开启,那么本次就无法回复了。赶紧开启吧,下次就可以恢复了。
在linux上执行:vi /etc/my.cnf
在/etc/my.cnf中的[mysqld]下面直接增加内容
server_id=1 log_bin=mysql-bin binlog_format=mixed
退出并保存
如果你的mysql默认开启了binlog,那就开始恢复吧!
第一步:锁表并且停掉应用
从navicat工具中打开数据库(test),把所有表给锁住,不让写入!
SELECT A.TABLE_SCHEMA '数据库', A.TABLE_NAME '表名', A.TABLE_ROWS '表记录行数', A.CREATE_TIME '创表时间', A.TABLE_COMMENT '表备注' FROM INFORMATION_SCHEMA.TABLES A WHERE A.TABLE_SCHEMA = 'test'
可以看到test数据库下面有2张表
2.接着执行如下语句(test为数据库,stu为表名):
lock tables test.stu read; lock tables test.stu3 read;
此时该库的所有表已经被锁住了(只读),不能写入或者修改。
第二步:搜索mysql日志文件(二进制)
1.查找binlog日志文件:
show master logs
由此可以看到,mysql-bin.000099就是最新的日志文件
2.登录你的mysql所在服务器,找到mysql的二进制分析工具(mysqlbinlog),我用的是centos
然后调用该二进制分析(start-datetime是其实日期,stop-datetime为结束日期,最后一个是你的mysql二进制文件,一般就在mysql目录下):
./mysqlbinlog --start-datetime="2021-02-18 15:30:00" --stop-datetime="2021-02-18 15:57:00" ../../data/mysql-bin.000099
接着会打印一大堆东西,不用管,只要找到删除语句所在的位置(pos)
可以看到,我们手贱删除表的记录,是在41037793这个位置。为了直观一点,我们直接在navicat上查一下
show binlog events in 'mysql-bin.000099' from 41037793
确认无疑,开始恢复,只要恢复到41037793这个位置就行!
第三步:开始恢复指定的库
1.恢复前可以先备份下库,以防操作失误导致影响其他库(如果有信心,也可以省略)
./mysqldump -u root -p数据库密码 -h 127.0.0.1 --all-databases > ./all.sql
2.开始真正恢复test数据库!(--stop-position表示恢复到这个记录点)
先解锁表:
use test; UNLOCK TABLES
然后执行恢复操作:
./mysqlbinlog -d test --stop-position='41037793' ../../data/mysql-bin.000099 | mysql -uroot -p数据库密码
等待一段时间之后,你会发现,删除的表stu2又回来了!!!