MySQL чистые бесхозные таблицы innoDB - PullRequest
0 голосов
/ 01 марта 2019

У меня есть сервер 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 и переместил ее в первый файл ibd, сохранив имя ibd с расширением frm.Итак, я сделаю то же самое для второго, третьего и т.д. файлов.Затем я отброшу таблицы с префиксом #mysql50#.

Имеет ли значение порядок?Что если я переименую первый файл 'frm' с именем файла пятого файла ibd?Приведет ли это к сломанной / поврежденной БД?Как вы знаете, как связать frm с файлами ibd?Нужно ли останавливать сервер mysql?

Спасибо за потраченное время!

1 Ответ

0 голосов
/ 02 марта 2019

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 |
+----------+---------+----------+------+----------+---------+-------+
...