PDA

Показать полную графическую версию : Ломание таблиц в РНР


Andji
27-12-2009, 15:05
Всем добрый.....

Форум РНРВВ, база MySQL, тип MyISAM.
5 месяцев все было нормально, потом начали ломаться таблицы (определение хостера), вплоть до полного отключения форума. Через РМА все восстановил, но теперь приходится несколько раз в день проводить оптимизацию, т.к. из-за дефрагментации перестают работать некоторые важные функции форума.
Вопросы:
как избежать постоянных дефрагментаций (из-за чего они происходят)?
может ли эта проблема быть по вине хостера?

Sham
28-12-2009, 14:35
попробуйте repair table (http://www.mysql.ru/docs/man/REPAIR_TABLE.html) - для начала только индексы...
REPAIR TABLE `table` QUICK

Surround
28-01-2010, 10:15
вот у меня тоже стала наблюдаться регулярно эта проблема ломания таблиц. Как можно профилактику провести?

skyfish
28-01-2010, 13:59
Surround, простого рецепта, помимо указанного Sham, нет. Я могу лишь добавить несколько пояснений:

Фрагментация:

Любая MyISAM база со временем фрагментируется. Это особенности её архитектуры и её ахиллесова пята — даже единичный row может быть размазан по десятку мест. За MyISAM, увы, пока нужно просто следить как за ребёнком-аутистом.


Коррупция:

1. Не является обязательно прямым следствием фрагментации.
2. В подавляющем большинстве случаев ломаются только индексы, что упрощает процедуру восстановления.
3. Из неестественных причин коррупции — главным можно назвать убийство/рестарт демона во время записи (напрямую или вследствие некорректного рестарта системы). Поищите в логе ошибок restarted mysqld, может ваш хостер перезагружается как неандерталец.
4. Реже причиной является модификация таблицы внешней программой (скажем, myisamchk) во время модификации её демоном.
5. Ещё реже причиной являются железные проблемы — память и диск.
6. Довольно редко — сочетание кривого кода и старой, с коррумпирующими багами, версии MySQL.
7. Крайне редко — просто безумный код.

Это основные моменты и факторы, на которые следует обратить внимание в профилактическом смысле. Оперативное лечение — по рецепту Sham выше.

Surround
28-01-2010, 16:08
ну оперативное решение - это понятно. Просто неприятно, что оно возникает и возникает регулярно.
Началось на форуме на vBulletin. На сервере есть еще БД, на них такого не наблюдалось ниразу...

Andji
30-01-2010, 03:02
А можно ли установить скрипт у хостера, который автоматически проводит оптимизацию через определенный промежуток времени? Если да, то есть ли готовые решения?

Surround
30-01-2010, 17:06
можно. и запускать по cron (многие хостеры предоставляют такую фишку)
например, код такой:

<?php
$db_host = '127.0.0.1';
$db_user = 'mysql';
$db_pass = 'mysql_password';
$db_name = 'myBase'

set_time_limit(0);

mysql_connect($db_host, $db_user, $db_pass) or die(mysql_error() . "\n\n");
mysql_select_db($db_name) or die(mysql_error() . "\n\n");

$r = mysql_query("SHOW TABLES");

$q = "LOCK TABLES";

while($row = mysql_fetch_row($r))
{
$table[] = $row[0];
$q .= " " . $row[0]." WRITE,";
}
$q = substr($q,0,strlen($q)-1);
mysql_query($q);

foreach($table as $value)
{
$q = "OPTIMIZE TABLE ".$value;
print $q; flush();
mysql_query($q) or die("QUERY: \"$q\" " . mysql_error() . "\n\n");
}
mysql_query("UNLOCK TABLES");
?>




© OSzone.net 2001-2012