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张表

mysqlbinlog 恢复数据时中文乱码 mysqlbinlog 恢复指定表_表名

此时我们手动删除表stu2,执行 drop table stu2。

开始紧急恢复!!!

恢复前置条件

如果想要恢复mysql数据,请务必开启binlog日志,否则无法恢复!神仙来了也救不了

1.查看是否开启binlogshow variables like '%log_bin%';

此项务必是ON(开启)

mysqlbinlog 恢复数据时中文乱码 mysqlbinlog 恢复指定表_mysql stop position_02

2.如果未开启,那么本次就无法回复了。赶紧开启吧,下次就可以恢复了。

在linux上执行:vi /etc/my.cnf

在/etc/my.cnf中的[mysqld]下面直接增加内容server_id=1

log_bin=mysql-bin

binlog_format=mixed

退出并保存

mysqlbinlog 恢复数据时中文乱码 mysqlbinlog 恢复指定表_数据库_03

如果你的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张表

mysqlbinlog 恢复数据时中文乱码 mysqlbinlog 恢复指定表_数据库_04

2.接着执行如下语句(test为数据库,stu为表名):lock tables test.stu read;

lock tables test.stu3 read;

此时该库的所有表已经被锁住了(只读),不能写入或者修改。

第二步:搜索mysql日志文件(二进制)

1.查找binlog日志文件:show master logs

由此可以看到,mysql-bin.000099就是最新的日志文件

mysqlbinlog 恢复数据时中文乱码 mysqlbinlog 恢复指定表_mysql stop position_05

2.登录你的mysql所在服务器,找到mysql的二进制分析工具(mysqlbinlog),我用的是centos

mysqlbinlog 恢复数据时中文乱码 mysqlbinlog 恢复指定表_mysql stop position_06

然后调用该二进制分析(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)

mysqlbinlog 恢复数据时中文乱码 mysqlbinlog 恢复指定表_数据库_07

可以看到,我们手贱删除表的记录,是在41037793这个位置。为了直观一点,我们直接在navicat上查一下show binlog events in 'mysql-bin.000099' from 41037793

mysqlbinlog 恢复数据时中文乱码 mysqlbinlog 恢复指定表_表名_08

确认无疑,开始恢复,只要恢复到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又回来了!!!

mysqlbinlog 恢复数据时中文乱码 mysqlbinlog 恢复指定表_表名_09