使用Mysql binlog恢复数据

前言

由于服务器异常宕机,导致Mysql数据库文件损坏,部分表数据丢失。

幸好MySQL 8.0默认开启了binlog,可以用它恢复数据。.

操作步骤

1.复制数据库文件

复制/var/lib/mysql目录下所有文件到其他目录备份,例如/tmp/mysql,避免binlog文件被误操作修改。

2.生成sql

使用mysqlbinlog命令将所有的binlog文件导出成sql,可以合并到一个文件中:

#第一个binlog文件
mysqlbinlog  /tmp/mysql/binlog.00000001  --verbose > dump.sql

#按顺序导出其他binlog,注意是>>
mysqlbinlog  /tmp/mysql/binlog.00000002  --verbose >> dump.sql

...

#直到最后一个binlog
mysqlbinlog  /tmp/mysql/binlog.xxx  --verbose >> dump.sql

3.恢复数据

另外找一台Mysql数据库服务器,在上面创建需要恢复数据的同名数据库。

由于我们只有部分表数据丢失,因此我们仅在同名数据库中创建指定的空表结构。

然后执行下列命令:

mysql  -f -u root -p   < dump.sql

-f的作用是忽略Sql执行错误。

输入root密码后,等待命令执行完成,既可看到表中数据已经恢复了。

最后,将恢复的数据导入回原始库既可。

结论

binlog还是很有用的,但在MySQL 8.0之前的版本中,默认情况下是禁用binlog的,建议手工配置启用它。