我有一个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文件是(它们的well...some!):
#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文件中,方法是将ibd名称保留在frm扩展名上。所以,我会做同样的第二,第三等文件。然后,我将删除带有#mysql50#前缀的表。
命令重要吗?如果我用第五个ibd文件的文件名重命名第一个'frm‘文件呢?这会导致数据库崩溃/损坏吗?您如何知道如何将frm与ibd文件关联起来?我需要停止mysql服务器吗?
谢谢你抽出时间!
发布于 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,但我得到了以下错误:
ERROR: Cannot find location of mysql_system_tables.sql.我想这是因为MySQL安装在我的Macbook上的/usr/local下。也许它在Linux服务器上会更成功,但我没有安装MySQL实用程序的方便安装。
这只是故事的一半。您仍然需要知道每个.ibd文件的表结构,以便将其与正确的.frm文件匹配。您可以将这些INFORMATION_SCHEMA表中的信息拼凑在一起:
例如,在我的测试模式中有一个简单的表:
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 |
+----------+---------+----------+------+----------+---------+-------+https://stackoverflow.com/questions/54943867
复制相似问题