我有一个带有孤儿表的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 |
+----------+---------+----------+------+----------+---------+-------+