Таблиця 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 EDT
@Kevin , використовуючи MyISAM, що робити, якщо у вас вичерпано місце на диску?
Ось що слід врахувати: Відповідно до посібника з вивчення сертифікації MySQL 5.0 ,
bulletpoint № 11 на Стор. 408 409 Розділ 29.2 говорить наступне:
Якщо у вас не вистачає місця на диску, додаючи рядки до таблиці MyISAM, помилка не виникає. Сервер призупиняє операцію, поки не стане доступним простір, а потім завершить операцію.
Коли у вас не вистачає місця на диску, не просто вимикайте та не вбивайте mysql. Кількість ручок відкритого файлу в будь-якому використовуваному в даний час MyISAM не буде очищено. Таким чином, таблиця MyISAM позначена крашкою. Якщо ви можете звільнити місце на диску в обсязі даних, коли mysqld все ще запущений, mysqld виведе на екран, коли доступний простір на диску.