Восстановление таблицы mysql myisam с помощью «Repair Table» vs myisamchk

Я работаю над сценарием, который будет cronjob, который будет просматривать таблицы в базе данных и восстанавливать все, что в этом нуждается. Это таблицы myisam в базе данных mysql. Мой вопрос: есть ли причина использовать синтаксис myisamchk в командной строке вместо синтаксиса запроса REPAIR TABLE?

На странице документации myisam http://dev.mysql.com/doc/refman/5.0/en/myisamchk.html, они предоставляют это как способ восстановить все таблицы, которые в этом нуждаются.

myisamchk --silent --force --fast --update-state \
          --key_buffer_size=64M --sort_buffer_size=64M \
          --read_buffer_size=1M --write_buffer_size=1M \
          /path/to/datadir/*/*.MYI

будет ли это иметь другой результат, чем использование

REPAIR TABLE tablename

на всех моих столах? Я бы сделал это программно с помощью php и получил бы что-то вроде (псевдокод)

$tables=query("SELECT table from information_schema.tables where table_schema='myDBName'");
foreach($tables as $table)
{
    $result=query("REPAIR TABLE ".$table);
}

Несмотря на любые мнения о практичности того или иного способа, но будет ли фактический конечный результат другим? Спасибо.

Я могу предоставить рабочий (не псевдо) php-код, если это необходимо, но я не думаю, что это необходимо. Причина, по которой я использую псевдокод, заключается в том, что на работе мы используем собственную оболочку для доступа к базе данных.


person chiliNUT    schedule 23.10.2013    source источник


Ответы (1)


Вам не придется ремонтировать таблицы так часто, что потребуется автоматизация. Вероятно, вам вообще не следует использовать MyISAM. Но если вы настаиваете, ответы в основном со страницы, на которую вы ссылаетесь:

Осторожность

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

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

Важный

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

Таким образом, несмотря на то, что два способа восстановления таблиц основаны на общей базе кода, кажется, что вы должны использовать REPAIR TABLE, если только сервер не находится в автономном режиме. Обратите внимание, что эта команда также имеет параметры.

http://dev.mysql.com/doc/refman/5.6/en/repair-table.html


Обновление: я почти ненавижу добавлять это, потому что это совершенно анекдотично, но я давно подозревал, что восстановление таблицы MyISAM не всегда может найти все возможные проблемы с таблицей, заставляя вас думать, что она была исправлена, потому что это снова можно использовать. Что-либо, кроме использования полномасштабного расширенного восстановления, мне кажется, что вы идете на риск, и я был бы наиболее склонен фактически принудительно выполнить полную перестройку всей таблицы с чем-то вроде этого, если у вас возникнут проблемы. стол:

ALTER TABLE t1 ENGINE=InnoDB;
ALTER TABLE t1 ENGINE=MyISAM;

Это полностью удалит все следы прежнего стола и оставит вам блестящий новый. Сначала убедитесь, что для innodb_file_per_table задано значение 1, иначе вы выделите дисковое пространство для системного пространства имен ibdata1, которое нелегко будет освободить.

person Michael - sqlbot    schedule 24.10.2013
comment
Так вы говорите, что единственная разница в том, что я должен использовать myisamchk только тогда, когда сервер отключен? - person chiliNUT; 24.10.2013
comment
Это главное отличие, хотя myisamchk имеет больше возможностей. Вы также можете найти исходный код информативным. Или вы можете скопировать файл таблицы в другое место, восстановить его, а затем скопировать восстановленную версию обратно с помощью myisamchk..., обязательно очищая и блокируя таблицу каждый раз, когда файл копируется внутрь или наружу, используя FLUSH TABLES WITH READ LOCK. - person Michael - sqlbot; 24.10.2013
comment
Спасибо. Среди других причин я хочу сделать это с синтаксисом sql, чтобы я мог запускать код на другом сервере, подключенном к моему серверу БД, а не на самом сервере. Я регистрирую статус с помощью контрольной таблицы, а затем ремонтирую с помощью ремонта по мере необходимости. - person chiliNUT; 26.10.2013