[mysql] Удаление временной таблицы при crach’e

Один раз был крупный alter через репликацию на slave и он в этот момент ребутнулся по питанию. Сам mysql стартует нормально, но при попытке изменить одну из таблиц получаю сообщение:

ERROR 1050 (42S01): Table 'pirate/#sql-ib1293541' already exists

Захожу в папку базы pirate и вижу, что есть файлик #sql-ib1293541.ibd и больше ничего подозрительного. Пробую удалить разными методами:

mysq> drop table `#sql-ib1293541`
mysq> drop temporary table `#sql-ib1293541`

и ещё разные махинации с заэскейпить решётку, но ничего не выходит. После пару часов гугления, натолкнулся на старую заметку, в которой узрел интересный хак:

DROP TABLE `#mysql50##sql-ib1293541`;

Но что бы он получился, нужна полноценная таблица со структурой (а у меня только данные — файл #sql-ib1293541.idb). Я копирую структуру от нормальной таблицы:

# cp -p user_message.frm \#sql-ib1293541.frm

и дропаю таблицу «хаком»:

mysq> drop table `#mysql50##sql-ib1293541`;
Query OK, 0 rows affected (10.85 sec)

И чудо! Она дропнулась. На всякий случай, у меня mysql 5.6.17.

Так что же такое #mysql50# ? Ответ нашёл на этой странице :

If you have databases or tables from a version of MySQL older than 5.1.6 that contain special characters and for which the underlying directory names or file names have not been updated to use the new encoding, the server displays their names with a prefix of #mysql50# in the output from INFORMATION_SCHEMA tables or SHOWstatements. For example, if you have a table named a@b and its name encoding has not been updated, SHOW TABLES displays it like this:

SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| #mysql50#a@b   |
+----------------+

The #mysql50# prefix is intended only to be used internally by the server. You should not create databases or tables with names that use this prefix.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *