четверг, 20 сентября 2012 г.

MySQL error "Can't create new tempfile" при восстановлении таблицы.


В логах mysql много ошибок подобного рода.
120920  9:25:28 [ERROR] /usr/sbin/mysqld: Table './old_sm/phones' is marked as crashed and last (automatic?) repair failed
Поскольку автоматическое исправление не сработало, то будем исправлять вручную.
Перед любым таким действием настоятельно рекомендуется сделать резервное копирование данных.
Заходим в командную строку mysql.
Запускаем проверку таблицы.

mysql> check table phones;
+-----------------------+-------+----------+--------------------------------------------+
|           Table                 | Op      | Msg_type | Msg_text                                          |
+-----------------------+-------+----------+--------------------------------------------+
|             old_sm.phones | check | warning     | Table is marked as crashed and last repair failed |
|             old_sm.phones | check | error         | Found 6833 keys of 3930951                        |
|             old_sm.phones | check | error         | Corrupt                                           |
+-----------------------+-------+----------+--------------------------------------------+
3 rows in set (0.37 sec)

Запускаю восстановление таблицы.

mysql> repair table phones;
+-----------------------+--------+----------+-------------------------------------------+
|           Table                 | Op        | Msg_type | Msg_text                                                 |
+-----------------------+--------+----------+-------------------------------------------+
|             old_sm.phones | repair    | error        | Can't create new tempfile: './old_sm/phones.TMD' |
|             old_sm.phones | repair    | status       | Operation failed                                         |
+-----------------------+--------+----------+-------------------------------------------+
2 rows in set (0.01 sec)

Т.е. при запущенном mysql-сервере восстановлению не подлежит. Останавливаю mysql
service mysql stop
Запускаю восстановление с помощью myisamchk. Данный метод будем работать с таблицами на движке MyISAM. Если у вас таблицы на движке InnoDB может помочь пересоздание таблицы с заливкой старых данных.
root@112-1:/var/lib/mysql/old_sm# myisamchk -r -f phones.MYI 
- recovering (with sort) MyISAM-table 'phones.MYI'
Data records: 3930951
- Fixing index 1
- Fixing index 2
- Fixing index 3
- Fixing index 4
- Fixing index 5

Запускаю mysql сервер
service mysql start
Ошибка пропала, что и требовалось.

1 комментарий: