j0celyn/ibd2mysql

用于恢复损坏的 MySQL 数据库或 MySQL 服务器中的 InnoDB 表的工具

安装: 34

依赖: 0

建议者: 0

安全: 0

星星: 5

关注者: 2

分支: 2

开放问题: 2

类型:项目

v1.0.1 2023-08-11 14:36 UTC

This package is auto-updated.

Last update: 2024-09-11 17:01:18 UTC


README

Latest Packagist release Latest Packagist release Latest Packagist release

描述

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及更高版本。