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

Эта статья поможет Вам исправить ошибки 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

  • Скачиваем скрипт;
  • Распаковываем скрипт 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 выполните команды: Управление SQLSQL Утилита → Починить выбранные таблицы.
  • Для поколения 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 написать и проверить код

 

sources/db/repair.txt · Последние изменения: 2007/08/14 12:01 (внешнее изменение)

Работает на DokuWiki
© 2002—2006 ibresource
e-mail: wikiteam@iblink.ru