j0celyn / ibd2mysql
用于恢复损坏的 MySQL 数据库或 MySQL 服务器中的 InnoDB 表的工具
Requires
- php: >=8.0.0
- ext-pdo: *
README
描述
MySQL 提供了配置标志 innodb_force_recovery,以帮助您修复几种类型的错误。
您应首先检查它是否可以帮助您解决问题。
ibd2mysql 是一个实用工具,用于在以下条件下尝试恢复 InnoDB 表
- MySQL 服务器 v8.0.0 或更高版本
- 您的表使用 InnoDB 引擎
- innodb_file_per_table 在您遇到问题之前已在 MySQL 服务器配置中启用
(在 MySQL 数据目录中,您应该看到至少每个表都有一个 IBD 文件) - MySQL 数据字典已损坏或丢失(尽管 IBD 文件仍然存在,但服务器不再知道每个数据库包含哪些表)
功能
- 从 IBD 数据文件中批量提取 SDI 信息
- 批量重新创建表的 SQL 结构
- 批量重新创建数据库和表,使用您的 IBD 数据文件
注意:此实用工具无法恢复 MySQL 触发器、MySQL 事件和 MySQL 用户创建的程序(函数和过程)。
要求
- PHP 8
- MySQL 8
安装
此 composer 命令将在 ibd2mysql 目录中创建一个新的目录并安装文件
composer create-project j0celyn/ibd2mysql ibd2mysql
设置
⚠️ IBD 文件格式随着每个 MySQL 版本而发展,强烈建议您使用创建要恢复的 IBD 文件的 MySQL 服务器版本运行此脚本。
如果您使用不同的 MySQL 版本,您可能仍然可以提取 SDI 信息并创建 SQL 文件。但是,在将 IBD 文件导入 MySQL 服务器时,--repair 选项可能会因为致命错误而失败。
将 config-empty.php
重命名为 config.php
,然后编辑其值
- DB_HOST: 您的 MySQL 服务器主机
- DB_PORT: 您的 MySQL 服务器端口
- DB_USER: 您的 MySQL 服务器用户
- DB_PASSWORD: 您的 MySQL 服务器密码
- MYSQL_DATA_DIR: 服务器 MySQL 数据目录的完整路径
- IBD2SDI_PATH: 持有 ibd2sdi 程序的目录的完整路径。它很可能与您的 MySQL 服务器一起安装
- BACKUP_DIR: 备份 IBD 文件的目录的完整路径(包含您的 MySQL 数据的 IBD 文件)
- OUTPUT_DIR: 此脚本将创建 SDI 和 SQL 文件的目录的完整路径
用法
以下是可用选项
-
--sdi: 从 IBD 文件中提取 SDI 信息。
注意:现有的 SDI 文件将被覆盖。 -
--sql: 从 SDI 文件创建 MySQL 文件(表列、索引、分区和外键)
注意:现有的 SQL 文件将被覆盖。 -
--repair: 对于每个表
-
运行 MySQL 文件以创建表
-
将 IBD 文件移动到替换空表空间的您的已保存表空间
-
如有必要,优化表以修复一些问题
注意:现有的 MySQL 表将不会更改。
-
当脚本被调用时带有多个选项,它们将始终以相同的顺序运行: sdi sql repair
要运行脚本,请使用一个或多个选项。
示例
php convert.php --sdi
php convert.php --sdi --sql
php convert.php --sdi --sql --repair
为什么使用这个工具?
在我升级本地MySQL服务器时,我选择了错误的选项,从而初始化了一个新的MySQL字典,这导致了当前MySQL字典的丢失。
由于我使用了innodb_file_per_table,我知道我的表仍然存在,但MySQL服务器已经不再了解它们。
对于我大部分的本地数据库,我都有备份,可以从备份中恢复。
有几个数据库不包含有价值的信息,如果它们丢失了,也没有关系。
还有一些没有备份的数据库,我想要尝试恢复,如果可能的话。
我试图寻找现有的命令或工具来恢复我的数据库,但未能找到任何东西。
配置标志innodb_force_recovery对我的问题无济于事。MySQL服务器提供的工具ibd2sdi很有用,可以从表中获取SDI数据(以JSON格式的表信息)...但没有工具可以将这些SDI数据转换为可以运行的正确MySQL语句以重新创建一个表。
然后我决定创建这个工具。
ibd2mysql已经与MySQL 8.0.23创建的IBD文件进行了测试(在我执行更新并破坏MySQL字典之前使用的版本)。我成功地恢复了所有文件
- 30个MySQL数据库
- 总共有超过11600个表
只要SDI文件格式没有重大变化,这个工具可能适用于MySQL Server 8.0.23及更高版本。