我有一个带有很多孤立表的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服务器吗?
谢谢您的时间!
答案 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表中整理信息:
例如,这是我的测试模式中的一个简单表:
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 |
+----------+---------+----------+------+----------+---------+-------+