Почему таблицы MySQL разбиваются? Как я могу предотвратить это?

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

К счастью, простой REPAIR TABLE mdl_user заставил его снова работать. Дело в том, что я не знаю, почему он действительно разбился и сделал его непригодным, и я хочу убедиться, что в следующий раз я буду лучше подготовлен.

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

Я мог бы просто восстановить резервную копию, но я думаю, что есть способы предотвратить сбои.

Такими таблицами являются utf8_general_ci и использование MyISAM.

Почему столбец MySQL разбивается? Что я могу сделать, чтобы это не происходило?

10 голосов | спросил AeroCross 15 MarpmThu, 15 Mar 2012 18:41:48 +04002012-03-15T18:41:48+04:0006 2012, 18:41:48

3 ответа


11

Очень легко сбой таблицы 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 вызывает сценарий Repair Table

Если вы хотите, чтобы все таблицы стали 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, что, если закончится дисковое пространство это ваш isuue?

Вот что нужно рассмотреть: Согласно Учебное пособие по тестированию MySQL 5.0 > ,

введите описание изображения здесь>> </p>

<p> <strong> bulletpoint # 11 </strong> говорит следующее на страницах 408, 409 Раздел 29.2: </p>

<blockquote>
  <p> Если у вас заканчивается дисковое пространство при добавлении строк в таблицу MyISAM, нет
  возникает ошибка. Сервер приостанавливает работу до тех пор, пока не станет
  доступно, а затем завершает операцию. </p>
</blockquote>

<p> Когда вам не хватает места на диске, не просто выключение или убийство mysql. Количество открытых файлов в любом используемом MyISAM не будет очищено. Таким образом, таблица MyISAM отмечена сбой. Если вы можете освободить место на диске в томе данных, при котором mysqld все еще работает, mysqld будет солдатом на диске, доступное на диске. </p></body></html>

ответил RolandoMySQLDBA 15 MarpmThu, 15 Mar 2012 19:40:41 +04002012-03-15T19:40:41+04:0007 2012, 19:40:41
0

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

ответил Kevin 15 MarpmThu, 15 Mar 2012 21:44:01 +04002012-03-15T21:44:01+04:0009 2012, 21:44:01
-3

Я нашел одну хорошую строку для преобразования всех таблиц в InnoDB:

mysql -u root -p dbName -e "show table status where Engine='MyISAM';" | 
    awk 'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}'  | 
    mysql -u root -p dbName
ответил Dmitry 14 FebruaryEurope/MoscowbWed, 14 Feb 2018 11:10:44 +0300000000amWed, 14 Feb 2018 11:10:44 +030018 2018, 11:10:44

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132