mysql干净的孤儿表Innodb



我有一个带有孤儿表的MySQL Server。根据手册,我需要:

在数据库目录中,重命名#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 Server吗?

谢谢您的时间!

https://dev.mysql.com/doc/refman/5.6/en/innodb-troubleshooting-datadict.html说:

.frm文件必须具有与孤儿中间表(必须具有相同的列和索引)相同的表格架构,并且必须放置在孤儿中间表的数据库目录中。

如果.frm文件必须具有相同的列和索引,那么是的,您必须与右边的.ibd文件匹配右边的.frm文件。我不知道这些临时文件名是如何生成的。似乎没有任何明确的相关性,因此几乎不可能知道哪一个与另一个同行。

您可以使用MySQL实用程序中的mysqlfrm工具从.FRM文件中转移原始表结构。有一个不错的博客在此处显示如何执行此操作:https://www.percona.com/blog/2014/01/02/recover-table-structure-frm-frm-files-mysql-utilities/

您应该尽快下载MySQL实用程序,因为Oracle似乎已弃用了这些工具。这些工具的某些功能作为MySQL Shell的一部分进行了重新完成,但我希望不支持.frm文件的任何功能,因为MySQL 8.0不再使用.frm文件。

我刚刚尝试在MacBook上使用mysqlfrm,但是我会遇到此错误:

ERROR: Cannot find location of mysql_system_tables.sql.

我想那是因为MySQL在MacBook上安装在/usr/local下。也许在Linux服务器上会更成功,但是我没有安装MySQL实用程序的Linux安装。

这只是故事的一半。您仍然需要知道每个.IBD文件的表结构,以将其与右边的.FRM文件匹配。您也许可以从这些信息_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 |
+----------+---------+----------+------+----------+---------+-------+

最新更新