Глюки или неустойчивая работа MySQL...

Arhat109

Ситуация:Сервер 3 гигагерца, 2 ядра, 8 гектаров, Raid-0 (upto 160 Mb/sec read);MySQL 5.1.48 (кажется), движок в основном InnoDb, но есть отдельные таблички и на MyISAM (сознательно). На сервере крутится 5 баз (340 таблиц = 7.5гб; 75 таблиц = 500Мб; 40 таблиц = 1Гб, 50 таблиц = 2.5Гб - статистика прирост 150Мб/сутки, есть ещё с десяток баз эпизодического использования и небольшого размера 5-15Мб каждая), одна из которых (первая) в режиме slave репликации принимается с другого сервера непрерывно.демон мускуля на сервере держит около 60-70 процессов практически постоянно.mysql работает в связке с PHP 5.2 и Zend Framework 1.7.8 (перейти на более поздний нет возможности)С неделю назад, после того как доправил весь код на предмет вставки реакции на многие ошибки (до этого народ считал что "всё пишется как надо"?!?), обнаружилось что достаточно регулярно выскакивает ошибка HY093, типа неверная привязка параметров к запросу... часто в тех случаях когда параметров у запроса нет как факта - весь запрос одна строка и подается в PDO адаптер напрямую.Это приводит к пропуску записи, которая потом вылезает "боком" в интерфейсах пользователей... долго не могли понять откуда лезут глюки... вот и пришлось рефакторить.Пока нашел одну устойчивую ситуацию: HY093 точно вылетает при попытке слешованной записи текста при наличии только одной кавычки в строке... слешуется, но все равно ошибка вылетает, но почему-то не всегда.Кто нибудь может пояснить что-то?
24 ответа

Arhat109

Arhat109,Дополню:Нагрузка на чтение: около 120-160тыс запросов к PHP части в сутки, на каждый в среднем делается 3-10 запрсов к мускулю в несколько БД (в основном 4 первых). Текущие записи логов в статистику (на те самые 120-160тыс шт, до десятка на каждую) идут через INSERT LOW_PRIORITY, массовые обновления идут по крону в ночное время, при этом PHP часть - отключается.


Arhat109

обнаружилось что достаточно регулярно выскакивает ошибка HY093, типа неверная привязка параметров к запросу... часто в тех случаях когда параметров у запроса нет как факта - весь запрос одна строка и подается в PDO адаптер напрямую.
PDO я, увы не знаю, но могу предположить, что в самом PDO-объекте остается параметр/bind-переменная от какого-то из предыдущих запросов. А в самом SQL-запросе этого параметра нет. Вот расхождение и случается.


Arhat109

Arhat109,Кстати, а небольшой фрагмент кода, устойчиво генерящий ошибку, можете показать?


Arhat109

Arhat109,Проверьте SQL_MODE - может влиять на слеш.


Arhat109

RXL,упс... а где проверять? в части подключения PDO - такого параметра нет, >mysql show SQL_MODE; - синтаксическая ошибка...на конфигурационных файлах пошарится? Чего? К ним доступ у меня - ограничен...


Arhat109

RXL,упс... а где проверять? в части подключения PDO - такого параметра нет, >mysql show SQL_MODE; - синтаксическая ошибка...на конфигурационных файлах пошарится? Чего? К ним доступ у меня - ограничен...
You can retrieve the current global or session sql_mode value with the following statements:SELECT @@GLOBAL.sql_mode;SELECT @@SESSION.sql_mode;


Arhat109

miksoft,Вот этот кусок ПХП кода:
$sql = 'INSERT INTO t1 ('.
					'`ph_id`,`g_id`,`gname`,'.StatUtils::getFields().
				') VALUES('.
					(int)$ph_id.','.(int)$row['g_id'].',"'.$row['gname'].'",'.StatUtils::getValues($row).
				') '.StatUtils::OnDuplicateString($orderBy).';'
			;
			$db->query($sql);
подробнее не могу. Обе функции возвращают строки с перечнем полей и значений...Вываливаются ошибки HY093 типа таких:Exception 'Zend_Db_Statement_Exception' with message 'SQLSTATE[HY093]: Invalid parameter number: no parameters were bound' in .../Pdo.php:238Stack trace:...---not saving in ...имя_базы...: Array( [page] => 1 [good_id] => 9964 [gname] => Нитроксолин... [phrase] => Нитроксолин\" антибиотик или нет?)Это запись из лога ошибок. Понятно, что с сокращениями...


Arhat109

miksoft,оба запроса дают пустой результат.


Arhat109

подробнее не могу.
Что мешает сохранить значение переменной $sql в файл или вывести в HTML-странице?


Arhat109

Arhat109,Еще вопрос - вижу в доке по PDO создание bind-переменных, но не вижу их удаления. И не вижу описания их срока жизни. Можете просветить по этому вопросу?


Arhat109

Arhat109,Блин, не посмотрел... надо было бы отформатировать... а как редактировать пост - не нашел.Там стоит try catch, который перехватывает ошибку, выводит в лог оригинальное сообщение и дополняет его текстом в какую базу не воткнул запись и что было в данных... элемент массива phrase - результат слешевания в ПХП. Непосредственно этот текст и втыкается в запись... вывод оператором echo printr_r($row, true);


Arhat109

Arhat109,Блин, не посмотрел... надо было бы отформатировать... а как редактировать пост - не нашел.
Редактирования тут нет. Просто напишите еще раз.


Arhat109

miksoft,не очень понял о каких переменных идет речь... если о $db - то это Зендовый PDO Adapter, создается при ответе на запрос и живет до конца работы скрипта.


Arhat109

miksoft,не очень понял о каких переменных идет речь... если о $db - то это Зендовый PDO Adapter, создается при ответе на запрос и живет до конца работы скрипта.
Речь о bind-переменных, они же параметры запроса. См. функции bindParam и bindValue.По моей гипотезе они у вас где-то создаются лишние или остаются жить от предыдущих SQL-запросов.


Arhat109

А еще в PDO есть функция debugDumpParams. Ей воспользоваться пробовали?


Arhat109

$sql = 'INSERT INTO t1 ('.
					'`ph_id`,`g_id`,`gname`,'.StatUtils::getFields().
				') VALUES('.
					(int)$ph_id.','.(int)$row['g_id'].',"'.$row['gname'].'",'.StatUtils::getValues($row).
				') '.StatUtils::OnDuplicateString($orderBy).';'
			;
			$db->query($sql);
исправьте этот бардак и все пройдет.


Arhat109

ScareCrow,пожалуйста поподробнее, где тут Вы увидели "бардак"?


Arhat109

Arhat109,
$sql = 'INSERT INTO t1 (' . '`ph_id`,`g_id`,`gname`,' . StatUtils::getFields() . ') VALUES(' .
	 (int)$ph_id . ',' . (int)$row['g_id'] . ',"' . $row['gname'] . '",' . StatUtils::getValues($row) .
	') ' . StatUtils::OnDuplicateString($orderBy) . ';'
;
$db->query($sql);


Arhat109

Arhat109,так лучше? ;)


Arhat109

StatUtils::OnDuplicateString($orderBy)
особенно хорошь вот этот кусок.http://framework.zend.com/manual/ru/zend.db.table.htmlчитать с "Добавление строк в таблицу" особенно пример
Пример #11 Пример добавления строк в таблицу

 $table = new Bugs();
 
 $data = array(
 'created_on' => '2007-03-22',
 'bug_description' => 'Something wrong',
 'bug_status' => 'NEW'
 );
 
 $table->insert($data);


Arhat109

ScareCrow,Ну и чем он лучше представленного? А 150 000 записей ТАКИМ способом не пгобовали вставлять??? По опыту, озвученная выше железяка, делает это несколько часов... около 8. :(


Arhat109

Ну и чем он лучше представленного?
тем что он работает а представленный - нет.
А 150 000 записей ТАКИМ способом не пгобовали вставлять
а вы документацию читать не пробовали? вам уже даже сслыку дали.


Arhat109

miksoft,Просмотрел. Нет они не создаются. Запрос делается через Zend_Db_Adapter::query(), которая имеет $bind = array() по умолчанию. И, даже если бы они создавались и/или оставались от предыдущих запросов, то оно никак не может вылетать исключительно 2-3 раза на 100 тыс. операций записи...Записи идут пачками по 500..1000шт. с последующим групповым $db->commit(); причем сразу парно: в местную БД и удаленную на второй сервер через второй адаптер $db2. Так вот "не вставлено" может быть как на один, так и на другой сервер... то есть на один - запись "канает", а на другой, такая же синхронная - уже нет.Собственно их нет, потому что начиная от вызова урла по крону, вся работа идет через адаптер с подачей запроса полностью сформированного строкой... по крайней мере для этого урла.Второй серев послабее, но он и меньше нагружен... так вот на нем ошибки вылетают, не в пример, чаще.Со вчерашнего дня наблюдаю такие же проблемы с потерей записи и на другом кроновом процессе:Записи ЧИТАЮТСЯ из таблицы, объединяются джойнами с регекспами, выделенные куски текста опознаются нормально, но при этом часть выбранного из словарей - тоже теряется... там ваще операции все завернуты в транзакции... обнаружилось также "случайно" в логах ошибок вставки... тоже HY093. Вставка внешних ключей из словарей... там ваще текстов нет... :(2 недели назад переставляли Мускуль (менялось железо - винты)... может чего не так в настройках? Неужели ни у кого таких проблем не было...


Arhat109

ScareCrow,наверное как-то "не по глазам"... может оттого, что уже практически наизусть выучил, совместно с кодом классов? Будьте так любезны, ткните в конкретное место озвученной ссылки, где указано, что ЭТО НЕ РАБОТАЕТ???Кстати, уже не помню, где конкретно, но описание Zend_Db там сильно расходится с текстами классов... предпочитаю смотреть классы вживую.