|
|
|
|
|
|
|
|
|
|
Эта статья поможет Вам исправить ошибки MySQL, которые выглядят примерно так:
mysql error: Can't write to XXXXXX.FRM или XXXXXX.MYD
mysql error: Can't open file: XXXXXX.MYD или XXXXXX.MYI
Все остальные ошибки решаются иным способом; подробнее об ошибках, возникающих при работе с базами данных MySQL можно узнать в кратком справочнике по ошибкам MySQL.
Написать универсальный скрипт для восстановления разрушенных индексов.
Решаем проблему одним из следующих способов:
http://yourdomain.com/path_to_your_forum/repair.php?html=1&check=1
mysqlcheck -r -u имя_пользователя -pпароль имя_базы
Здесь:
myisamchk -r -u имя_пользователя -pпароль имя_базы
Здесь:
Запускаем в phpMyAdmin следующий запрос:
REPAIR TABLE имя_базы;
Выполнить в панели администратора последовательность действий:
Ошибки, описанные выше, связаны с недоработками в скриптах Invision Power Board. Дело в том, что движок форума не выполняет блокировку таблиц при выполнении нескольких последовательных операций записи в базу данных. В связи с этим, при одновременном постинге двоих или более пользователей форума происходит нарушение целостности индексных файлов MySQL.
Для исправления такой ошибки необходимо выполнить переиндексацию таблиц, о которой было рассказано выше. Но этот процесс можно автоматизировать! Для этого необходимо изменить скрипты Invision Power Board таким образом, чтобы они автоматически выполняли переиндексацию при ошибке mySQL №1016. Для разных поколений IPB это делается различными методами. Мы предлагаем следующие решения:
В этой линейке форума обработчик ошибки можно поместить в файл /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)
написать и проверить код
написать и проверить код
Работает на DokuWiki |