Удаление потерянных таблиц в MySQL (Orphan Temporary Tables)

Иногда во время выполнения определенных операций над таблицами (ALTER TABLE) может произойти аварийное завершение процесса mysqld, после запуска MySQL таблица над которой производилась операция становится потерянной (осиротевшей). Такие таблицы могут занимать дисковое пространство и висеть мертвым грузом.

Давайте разберемся как их удалять.

Исходные данные: Oracle MySQL v5.7.23

Документация по MySQL говорит нам, что имена всех потерянных таблиц начинаются с префикса #sql- (например: #sql-543_6). На диске эти таблицы будут иметь такие же имена файлов с расширением .frm и .ibd (например: #sql-543_6.frm и #sql-543_6.ibd).

Если в каталоге базы данных нет файла .frm для потерянной таблицы, то его нужно будет воссоздать, он должен иметь ту же структуру, что и потерянная таблица (имена столбцов, типы, размер и индексы).

Для проверки наличия потерянных (осиротевших) таблиц можно выполнить такой запрос:

mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql%';
+----------+---------------------+------+--------+--------+-------------+------------+---------------+------------+
| TABLE_ID | NAME                | FLAG | N_COLS | SPACE  | FILE_FORMAT | ROW_FORMAT | ZIP_PAGE_SIZE | SPACE_TYPE |
+----------+---------------------+------+--------+--------+-------------+------------+---------------+------------+
|   716340 | mydb/#sql-314e_1acd |    1 |      7 | 716310 | Antelope    | Compact    |             0 | Single     |
+----------+---------------------+------+--------+--------+-------------+------------+---------------+------------+
1 row in set (0.00 sec)

Здесь мы видим, что у нас есть 1 потерянная таблица в базе mydb.

Проверим наличие файлов данных этой таблицы:

# ls -l /var/lib/mysql/mydb | grep sql-314e_1acd
-rw-r-----  1 mysql mysql       8708 Sep  2 02:51 #sql-314e_1acd.frm
-rw-r-----  1 mysql mysql  171966464 Sep  2 02:50 #sql-314e_1acd.ibd

Файлы .frm и .ibd есть, значит мы можем удалить эту потерянную таблицу. Занимает она конечно немного места, но были случаи когда потерянные таблички занимали по несколько гигабайт, а на платных VDS каждый гигабайт стоит денег, так что экономия на лицо.

Для удаления потерянной таблицы используется привычная команда DROP TABLE, но с дополнительным префиксом #mysql50# перед именем таблицы, который указывает MySQL, что нужно игнорировать небезопасную кодировку в имени файла. Имя таблицы должно быть заключено в обратные кавычки, это так же важно, т.к. в имени таблицы присутствует специальный символ #

Выполняем:

mysql> use mydb;
Database changed

mysql> DROP TABLE `#mysql50##sql-314e_1acd`;
Query OK, 0 rows affected (0.13 sec)

Потерянная табличка успешно удалена. Вы можете проверить наличие файлов данных и запрос к INFORMATION_SCHEMA.INNODB_SYS_TABLES указанный выше, они покажут что больше у нас нет потерянных таблиц.

На этом все, до скорых встреч. Если у Вас возникли вопросы или Вы хотите чтобы я помог Вам, то Вы всегда можете связаться со мной разными доступными способами.


Хотите оставить комментарий?