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 Utilities в ближайшее время, потому что Oracle, похоже, устарел в этих инструментах.Некоторые функции этих инструментов переопределяются как часть MySQL Shell, но я ожидаю, что никакие функции для файлов .frm не будут поддерживаться, потому что MySQL 8.0 больше не использует файлы .frm.
Я только что попробовалиспользуя mysqlfrm
на моем Macbook, но я получаю эту ошибку:
ERROR: Cannot find location of mysql_system_tables.sql.
Я предполагаю, что это потому, что MySQL установлен в / usr / local на моем Macbook.Возможно, это будет более успешным на сервере Linux, но у меня нет удобной установки Linux, на которой установлены MySQL Utilities.
И это только половина истории.Вам все равно нужно знать структуру таблиц каждого файла .ibd, чтобы сопоставить его с правильным файлом .frm.Возможно, вам удастся собрать информацию вместе из этих таблиц INFORMATION_SCHEMA:
- INNODB_SYS_TABLES
- INNODB_SYS_COLUMNS
- INNODB_SYS_INDEXES
1034, *1033* 1034 *1033* 1033Вот простая таблица в моей тестовой схеме:
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 |
+----------+---------+----------+------+----------+---------+-------+