====== Исправление таблиц базы, варианты решения проблем ====== Эта статья поможет Вам исправить ошибки 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 написать и проверить код