使用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的,建议手工配置启用它。