Содержание

Исправление таблиц базы, варианты решения проблем

Эта статья поможет Вам исправить ошибки MySQL, которые выглядят примерно так:

mysql error: Can't write to XXXXXX.FRM или XXXXXX.MYD
mysql error: Can't open file: XXXXXX.MYD или XXXXXX.MYI

Все остальные ошибки решаются иным способом; подробнее об ошибках, возникающих при работе с базами данных MySQL можно узнать в кратком справочнике по ошибкам MySQL.

Способы исправления ошибок

FIXME Написать универсальный скрипт для восстановления разрушенных индексов.

Решаем проблему одним из следующих способов:

С использованием скрипта от IBResource.ru

http://yourdomain.com/path_to_your_forum/repair.php?html=1&check=1

С использованием утилиты mysqlcheck (требуется MySQL 3.23.38 или выше)

mysqlcheck -r -u имя_пользователя -pпароль имя_базы

Здесь:

С использованием утилиты myisamchk (MySQL 3.23.38 или выше)

myisamchk -r -u имя_пользователя -pпароль имя_базы

Здесь:

С использованием phpMyAdmin

Запускаем в phpMyAdmin следующий запрос:

REPAIR TABLE имя_базы;

С использованием Admin Control Panel

Выполнить в панели администратора последовательность действий:

Автоматическое исправление

Ошибки, описанные выше, связаны с недоработками в скриптах 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 написать и проверить код