Получение данных из поврежденной таблицы mysql

Я пытаюсь получить некоторые данные из таблицы mysql, которая помечена как аварийная. Я работаю над восстановленной резервной копией машины, поэтому мне не о чем беспокоиться.

Когда я пытаюсь выполнить mysqldump таблицы (к сведению, я использую --where, чтобы указать, какие записи мне нужны), я получаю сообщение об ошибке:

mysqldump: Got error: 144: Table './[db]/[table]' is marked as crashed and last (automatic?) repair failed when doing LOCK TABLES

Если я использую --lock-tables=false, я получаю ту же ошибку (но сбой при выполнении SHOW FIELDS).

Если я попытаюсь просто ВЫБРАТЬ первую запись из таблицы, я получу ту же ошибку.

Если я запускаю CHECK TABLE [table], я получаю следующие предупреждения/ошибки:

warning  | 1 client is using or hasn't closed the table properly |
warning  | Size of indexfile is: 1991678976      Should be: 1024 |
error    | Record-count is not ok; is 30030697   Should be: 0    |
warning  | Found 141967876 deleted space.   Should be 0          |
warning  | Found 3101578 deleted blocks       Should be: 0       |
warning  | Found 34721783 key parts. Should be: 0                |
error    | Corrupt                                               |

Это означает, что если я сделаю ремонт таблицы, я потеряю все данные! Там должно быть 30030697 записей....

Есть ли способ получить эти данные?


person Ben Holness    schedule 08.03.2013    source источник
comment
Это выглядит как повреждение индекса MyISAM. Восстановление таблицы приведет к перестроению индекса. Прежде чем что-либо делать, вы должны сделать физическую резервную копию всех файлов вашей базы данных.   -  person ESG    schedule 08.03.2013
comment
@TheVedge, хотя он говорит, что считает, что количество записей должно быть равно 0? Я беспокоюсь, что ремонт исправит таблицу, чтобы в ней не было записей, но я попробую (думаю, это займет некоторое время с 30-метровыми записями).   -  person Ben Holness    schedule 08.03.2013


Ответы (1)


Чтобы восстановить рассматриваемую таблицу, введите команду

myisamchk --recover /var/lib/mysql/DATABASENAME/TABLE_NAME.myi

(Где DATABASENAME — это имя базы данных, с которой вы работаете, а TABLE_NAME — это имя проверяемой таблицы.)

Если это не восстановит таблицу полностью, вы можете повторно запустить команду, заменив –recover на –safe-recover, что медленнее и тщательнее.

Они делают такой дамп только в случае серьезного конфликта во время блокировки на уровне строки или плохой записи (плохой сектор).

person Hituptony    schedule 08.03.2013
comment
Спасибо. Я был обеспокоен тем, что, поскольку CHECK TABLE сказал, что должно быть 0 записей, он восстановит таблицу и оставит меня без записей, но я попробовал, и это сработало. Обратите внимание, что вместо -recover должно быть --recover - person Ben Holness; 08.03.2013
comment
Я думаю, что эти числа (0 записей) относятся к содержимому индекса, а не к самой таблице, но сообщению нужно немного больше ясности... - person ESG; 08.03.2013