https://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting-datadict.html说:
.frm 文件必须与孤立中间表具有相同的表模式(它必须具有相同的列和索引),并且必须放在孤立中间表的数据库目录中。
如果 .frm 文件必须具有相同的列和索引,那么是的,您必须将正确的 .frm 文件与正确的 .ibd 文件匹配。我不知道这些临时文件名是如何生成的。似乎没有任何明确的相关性,因此几乎不可能知道哪个与另一个相配。
mysqlfrm
您可以使用MySQL Utilities 中的工具从 .frm 文件中转储原始表结构。有一个很好的博客在这里展示了如何做到这一点:https ://www.percona.com/blog/2014/01/02/recover-table-structure-frm-files-mysql-utilities/
您应该尽快下载 MySQL Utilities,因为 Oracle 似乎已弃用这些工具。这些工具的一些特性作为 MySQL Shell 的一部分重新实现,但我预计 .frm 文件的任何特性都将不受支持,因为 MySQL 8.0 不再使用 .frm 文件。
我刚刚尝试mysqlfrm
在我的 Macbook 上使用,但出现此错误:
ERROR: Cannot find location of mysql_system_tables.sql.
我猜那是因为 MySQL 安装在我的 Macbook 上的 /usr/local 下。也许它在 Linux 服务器上会更成功,但我手头没有安装 MySQL Utilities 的 Linux 安装。
这只是故事的一半。您仍然需要知道每个 .ibd 文件的表结构才能将其与正确的 .frm 文件匹配。您也许可以从这些 INFORMATION_SCHEMA 表中拼凑信息:
- INNODB_SYS_TABLES
- INNODB_SYS_COLUMNS
- INNODB_SYS_INDEXES
例如,这是我的测试模式中的一个简单表:
CREATE TABLE `A` (
`c1` int(11) NOT NULL DEFAULT '0',
`c2` int(11) DEFAULT NULL,
`c3` int(11) DEFAULT NULL,
PRIMARY KEY (`c1`),
KEY `c2` (`c2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
如果我查询 I_S 表:
mysql> select * from innodb_sys_tables where name = 'test/A';
+----------+--------+------+--------+-------+-------------+------------+---------------+
| TABLE_ID | NAME | FLAG | N_COLS | SPACE | FILE_FORMAT | ROW_FORMAT | ZIP_PAGE_SIZE |
+----------+--------+------+--------+-------+-------------+------------+---------------+
| 2126 | test/a | 1 | 6 | 2106 | Antelope | Compact | 0 |
+----------+--------+------+--------+-------+-------------+------------+---------------+
mysql> select * from innodb_sys_columns where table_id = 2126;
+----------+------+-----+-------+--------+-----+
| TABLE_ID | NAME | POS | MTYPE | PRTYPE | LEN |
+----------+------+-----+-------+--------+-----+
| 2126 | c1 | 0 | 6 | 1283 | 4 |
| 2126 | c2 | 1 | 6 | 1027 | 4 |
| 2126 | c3 | 2 | 6 | 1027 | 4 |
+----------+------+-----+-------+--------+-----+
mysql> select * from innodb_sys_indexes where table_id = 2126;
+----------+---------+----------+------+----------+---------+-------+
| INDEX_ID | NAME | TABLE_ID | TYPE | N_FIELDS | PAGE_NO | SPACE |
+----------+---------+----------+------+----------+---------+-------+
| 3875 | PRIMARY | 2126 | 3 | 1 | 3 | 2106 |
| 3876 | c2 | 2126 | 0 | 1 | 4 | 2106 |
+----------+---------+----------+------+----------+---------+-------+