====== Исправление таблиц базы, варианты решения проблем ======
Эта статья поможет Вам исправить ошибки MySQL, которые выглядят примерно так:
mysql error: Can't write to XXXXXX.FRM или XXXXXX.MYD
mysql error: Can't open file: XXXXXX.MYD или XXXXXX.MYI
Все остальные ошибки решаются **иным** способом; подробнее об ошибках, возникающих при работе с базами данных MySQL можно узнать в [[sources:db:errors|кратком справочнике по ошибкам MySQL]].
===== Способы исправления ошибок =====
FIXME Написать универсальный скрипт для восстановления разрушенных индексов.
Решаем проблему одним из следующих способов:
==== С использованием скрипта от IBResource.ru ====
* Скачиваем [[http://www.ibresource.ru/forums/index.php?act=Attach&type=post&id=56|скрипт]];
* Распаковываем скрипт repair.php;
* Закачать в корневую папку форума на хосте;
* Запускаем скрипт из браузера таким образом:
http://yourdomain.com/path_to_your_forum/repair.php?html=1&check=1
==== С использованием утилиты mysqlcheck (требуется MySQL 3.23.38 или выше) ====
* Закрываем форум через ACP;
* Выполняем команду на локальной системе (обычно с помощью ssh или telnet сеанса):
mysqlcheck -r -u имя_пользователя -pпароль имя_базы
Здесь:
* **имя_пользователя**: ваше имя пользователя для работы с базой данных //«имя_базы»//.\\
* **пароль**: пароль пользователя; обратите внимание, что пароль нужно указывать сразу после **-p** без каких-либо разделяющих символов.\\
* **имя_базы**: база, которую следует восстанавливать.
==== С использованием утилиты myisamchk (MySQL 3.23.38 или выше) ====
* Закрываем форум через ACP;
* Выполняем команду на локальной системе (обычно с помощью ssh или telnet сеанса):
myisamchk -r -u имя_пользователя -pпароль имя_базы
Здесь:
* **имя_пользователя**: ваше имя пользователя для работы с базой данных //«имя_базы»//.\\
* **пароль**: пароль пользователя; обратите внимание, что пароль нужно указывать сразу после **-p** без каких-либо разделяющих символов.\\
* **имя_базы**: база, которую следует восстанавливать.
==== С использованием phpMyAdmin ====
Запускаем в phpMyAdmin следующий запрос:
REPAIR TABLE имя_базы;
==== С использованием Admin Control Panel ====
Выполнить в панели администратора последовательность действий:\\
* Для **поколения 1.x.x** выполните команды: Управление SQL -> Утилита -> Восстановить выбранные таблицы.\\
* Для **поколения 2.0.x** выполните команды: Управление SQL -> SQL Утилита -> Починить выбранные таблицы.\\
* Для **поколения 2.1.x** выполните команды: ПРОЧЕЕ -> Управление SQL -> Утилита -> Восстановить выбранные таблицы.\\
====== Автоматическое исправление ======
Ошибки, описанные выше, связаны с недоработками в скриптах Invision Power Board. Дело в том, что движок форума не выполняет блокировку таблиц при выполнении нескольких последовательных операций записи в базу данных. В связи с этим, при одновременном постинге двоих или более пользователей форума происходит нарушение целостности индексных файлов MySQL.
Для исправления такой ошибки необходимо выполнить переиндексацию таблиц, о которой было рассказано выше. Но этот процесс можно автоматизировать! Для этого необходимо изменить скрипты Invision Power Board таким образом, чтобы они автоматически выполняли переиндексацию при ошибке mySQL №1016. Для разных поколений IPB это делается различными методами. Мы предлагаем следующие решения:
===== Пример автоматического обработчика ошибки (IPB 1.x.x)=====
В этой линейке форума обработчик ошибки можно поместить в файл /sources/Drivers/mySQL.php, конкретно — в метод fatal_error() класса db_driver:
// BEGIN (repair tables if indexes are broken)
if ( mysql_errno() == 1016 )
{
$query_id = mysql_query("SHOW TABLES", $this->connection_id) or die("SQL Error! Please contact administrator.");
$sql_row = array();
$table_list = array();
while ( ! ( ( $sql_row = mysql_fetch_row($query_id) ) === false ) ) $table_list[] = $sql_row[0];
foreach($table_list as $table_name)
{
mysql_query('REPAIR TABLE `'.$table_name.'`', $this->connection_id) or die("SQL Error! Please contact administrator");
}
if ( !headers_sent() )
{
header("Location: ".$_SERVER['REQUEST_URI']);
}
else
{
die("Repair completed. Please reload page...");
}
}
// END (repair tables if indexes are broken)
===== Пример автоматического обработчика ошибки (IPB 2.0.x)=====
FIXME написать и проверить код
===== Пример автоматического обработчика ошибки (IPB 2.1.x)=====
FIXME написать и проверить код