dbaplus社群

宕机的 MySQL 5.7,用 dbsake 和 ibd2sql 抢救回来了!

作者介绍

贺春旸,dbaplus社群金牌专家,凡普金科和爱钱进DBA团队负责人,《MySQL管理之道:性能调优、高可用与监控》第一&二版、《MySQL运维进阶指南》作者,曾任职于中国移动飞信、安卓机锋网。五次荣获dbaplus年度MVP,致力于MariaDB、MongoDB等开源技术的研究,主要负责数据库性能调优、监控和架构设计。

数据安全是企业的生命线,数据库一旦意外宕机将不堪设想,试想一下如果你遇到了这样一个棘手的情况: 

  • MySQL 未进行备份

  • MySQL 采用单点部署

  • MySQL 突然崩溃且无法启动

面对这种危机,如何抢救 MySQL 5.7 的数据?以下是一套不用递交辞呈的应急方案。

对于 MySQL 5.7 的数据恢复,我们可以借助两个强大的工具—— dbsake 和 ibd2sql 。这个方法不仅能还原表结构,更能恢复数据,堪称一个全面的拯救方案。接下来,让我们一步步探讨详细的操作流程。

第一步:使用 dbsake 恢复表结构

1、安装 dbsake:

# curl -s get.dbsake.net > dbsake# chmod 755 dbsake

2、使用 dbsake 从 frm 文件恢复表结构:

# ./dbsake frmdump /data/mysql/mysql57_1/data/test/t2.frm

Image

frm文件恢复表结构

这一步将为我们提供完整的表结构 SQL。

第二步:使用 ibd2sql 恢复数据

1、在全新的 MySQL 8.0 实例中,创建我们刚刚恢复的表结构。

2、获取并配置 ibd2sql 工具:

# wget https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip# unzip main.zip# cd ibd2sql-main# python3 main.py /data/mysql/mysql57_1/data/test/t2.ibd  \--sdi-table /data/mysql/mysql8/data/recover/t2.ibd      \--sql --ddl --complete-insert --mysql5

Image

ibd文件数据恢复

参数解释(以下指的是ibd2sql):

  • /data/mysql/mysql57_1/data/test/t2.ibd:指定需要恢复数据的 .ibd 文件路径。该文件位于 MySQL 5.7 数据目录下,属于 test 数据库中的 t2 表。

  • --sdi-table /data/mysql/mysql8/data/recover/t2.ibd:指定 dbsake 工具生成的中间文件(SDI 文件)的存放路径。SDI 文件包含了从 .ibd 文件中提取的表结构和数据信息。

  • --sql:指示 dbsake 工具生成 SQL 语句,用于重建表结构和插入数据。

  • --ddl:指示 dbsake 工具生成创建表的 DDL 语句(CREATE TABLE)。

  • --complete-insert:指示 dbsake 工具生成完整的 INSERT 语句,包含所有列的值。

  • --mysql5:指定源数据库的版本为 MySQL 5,这有助于 dbsake 工具正确解析 .ibd 文件格式。

回车后,MySQL 5.7 的 ibd 文件就会转化为可执行的 SQL 语句,至此我们的数据抢救行动画上圆满的句号,不仅挽救了宝贵的数据,更是拯救了自己的职业生涯!

Image

Image