首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL干净的孤立表innoDB

MySQL干净的孤立表innoDB
EN

Stack Overflow用户
提问于 2019-03-01 11:37:07
回答 1查看 2K关注 0票数 1

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

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

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

代码语言:javascript
运行
复制
#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文件是(它们的well...some!):

代码语言:javascript
运行
复制
#sql-ib2015-2421921804.ibd
#sql-ib2016-2421921806.ibd
#sql-ib2017-2421921808.ibd
#sql-ib2020-2421921814.ibd
#sql-ib2021-2421921816.ibd

因此,我打算在终点站做以下工作:

代码语言:javascript
运行
复制
mv \#sql-15655_a541c.frm \#sql-ib2015-2421921804.frm

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

命令重要吗?如果我用第五个ibd文件的文件名重命名第一个'frm‘文件呢?这会导致数据库崩溃/损坏吗?您如何知道如何将frm与ibd文件关联起来?我需要停止mysql服务器吗?

谢谢你抽出时间!

EN

回答 1

Stack Overflow用户

发布于 2019-03-02 19:16:12

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

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

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

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

您应该很快就可以使用下载MySQL实用程序了,因为Oracle似乎已经不推荐这些工具了。这些工具的一些特性是作为MySQL Shell的一部分重新实现的,但我预计.frm文件的任何特性都将不受支持,因为MySQL 8.0不再使用.frm文件。

我刚刚尝试在我的Macbook上使用mysqlfrm,但我得到了以下错误:

代码语言:javascript
运行
复制
ERROR: Cannot find location of mysql_system_tables.sql.

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

这只是故事的一半。您仍然需要知道每个.ibd文件的表结构,以便将其与正确的.frm文件匹配。您可以将这些INFORMATION_SCHEMA表中的信息拼凑在一起:

  • INNODB_SYS_TABLES
  • INNODB_SYS_COLUMNS
  • INNODB_SYS_INDEXES

例如,在我的测试模式中有一个简单的表:

代码语言:javascript
运行
复制
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表:

代码语言:javascript
运行
复制
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 |
+----------+---------+----------+------+----------+---------+-------+
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54943867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档