1

我有一个带有很多孤立表的 MySQL 服务器。根据手册,我需要:

在数据库目录中,重命名#sql-*.frm 文件以匹配孤立中间表的基本名称

我拥有的文件(其中一些)如下:

#sql-15655_a541c.frm
#sql-15655_a541e.frm
#sql-15655_a543a.frm
#sql-15655_a543c.frm
#sql-15655_a543d.frm
#sql-15655_a543e.frm
#sql-15655_a5440.frm
#sql-15655_a5442.frm
#sql-15655_a5443.frm
......

并且 ibd 文件是(嗯......其中一些!):

#sql-ib2015-2421921804.ibd
#sql-ib2016-2421921806.ibd
#sql-ib2017-2421921808.ibd
#sql-ib2020-2421921814.ibd
#sql-ib2021-2421921816.ibd

因此,我的意图是从终端执行以下操作:

mv \#sql-15655_a541c.frm \#sql-ib2015-2421921804.frm

我刚刚拿起第一个 frm 并将其移动到第一个 ibd 文件,方法是保留带有 frm 扩展名的 ibd 名称。所以,我将对第二个,第三个等文件做同样的事情。然后我将删除带有#mysql50#前缀的表。

顺序重要吗?如果我用第五个 ibd 文件的文件名重命名第一个“frm”文件怎么办?这会导致数据库损坏/损坏吗?你怎么知道如何将 frm 与 ibd 文件关联起来?我需要停止mysql服务器吗?

谢谢你的时间!

4

1 回答 1

0

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 |
+----------+---------+----------+------+----------+---------+-------+
于 2019-03-02T19:16:12.607 回答