Таблице MyISAM довольно легко выйти из строя.
В заголовке каждой таблицы MyISAM есть счетчик, который отслеживает, сколько дескрипторов открытых файлов имеется в таблице.
Если вы запустите mysql, а число в заголовке не совпадает с количеством фактических дескрипторов файла, mysqld рассматривает таблицу как сбойную.
Если простой REPAIR TABLE mdl_user
заставляет его снова работать каждый раз без потери данных, это может означать, что у вас есть сайт с очень высокой посещаемостью, который пишет на mdl_user
.
Если этого требуют десятки таблиц REPAIR TABLE
, я бы преобразовал все таблицы в InnoDB. Однако, если mdl_user
таблица является единственной таблицей с этой проблемой, есть кое-что, что вы можете сделать (для этого примера, скажем, база данных moodle
);
Если вы хотите, чтобы все таблицы оставались как MyISAM
ШАГ 01: Создание сценария ремонтной таблицы
echo "REPAIR TABLE moodle.mdl_user;" > /var/lib/mysql/MoodleStartUp.sql
ШАГ 02: Объявите сценарий восстановления как файл запуска
Добавьте это в /etc/my.cnf
[mysqld]
init-file=/var/lib/mysql/MoodleStartUp.sql
ШАГ 03: Перезапустите MySQL
Каждый перезапуск mysql вызовет скрипт восстановления таблицы
Если вы хотите, чтобы все таблицы стали InnoDB
Запустите этот код, чтобы создать сценарий массового преобразования таблиц MyISAM в InnoDB, и просмотрите его.
MYSQL_USER=root
MYSQL_PASS=password
MYSQL_CONN="-u${MYSQL_USER} -p ${MYSQL_PASS}"
echo "SET SQL_LOG_BIN = 0;" > /root/ConvertMyISAMToInnoDB.sql
mysql ${MYSQL_CONN} -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > /root/ConvertMyISAMToInnoDB.sql
less /root/ConvertMyISAMToInnoDB.sql
Если вы удовлетворены содержимым скрипта преобразования, запустите его
mysql ${MYSQL_CONN} < /root/ConvertMyISAMToInnoDB.sql
ОБНОВЛЕНИЕ 2012-03-15 14:00 ПО ВОСТОЧНОМУ ВРЕМЕНИ
@Kevin , при использовании MyISAM, что если у вас недостаточно свободного места на диске?
Вот что нужно учитывать: в соответствии с MySQL 5.0 Certification Study Guide ,
пункт № 11 говорит следующее на страницах 408, 409, раздел 29.2:
Если при добавлении строк в таблицу MyISAM не хватает места на диске, ошибки не возникает. Сервер приостанавливает операцию до тех пор, пока не освободится место, а затем завершает операцию.
Когда у вас заканчивается свободное место на диске, не просто завершите работу или убейте mysql. Количество дескрипторов открытых файлов в любых используемых в настоящее время MyISAM не будет очищено. Таким образом, таблица MyISAM помечена как сбойная. Если вы можете освободить дисковое пространство в томе данных, когда mysqld все еще работает, mysqld займется защитой, как только освободится дисковое пространство.