MySQL清理孤立表innoDB

时间:2019-03-01 11:37:08

标签: mysql innodb orphan

我有一个带有很多孤立表的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,并通过保留带frm扩展名的ibd名称将其移动到第一个ibd文件。因此,我将对第二个,第三个etc文件执行相同的操作。然后,我将删除带有#mysql50#前缀的表。

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

谢谢您的时间!

1 个答案:

答案 0 :(得分:0)

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

  

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

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

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

您应该download the MySQL Utilities很快,因为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文件匹配。您可能可以从以下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 |
+----------+---------+----------+------+----------+---------+-------+