![]() |
Модераторы: korob2001, ginnie |
![]() ![]() ![]() |
|
Grond |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2013 Репутация: нет Всего: нет |
Периодически падает мускул.
В лог выдает такие ошибки: [Fri May 17 08:06:30 2013] [error] RAC=1, DB=DBI:: db=HASH(0x7fc8f2439420) in DBD driver has not implemented the AutoCommit attribute at /home/dnc/pm/DC_DB.pm line 31. по указанному месту в файле такой кусок прописан:
Что это может быть и как исправить? |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
perldoc DBD::mysql
... * Switching AutoCommit mode from on to off or vice versa may fail. You should always check for errors, when changing AutoCommit mode. The suggested way of doing so is using the DBI flag RaiseError. If you don't like RaiseError, you have to use code like the following: $dbh->{'AutoCommit'} = 0; if ($dbh->{'AutoCommit'}) { # An error occurred! } * If you detect an error while changing the AutoCommit mode, you should no longer use the database handle. In other words, you should disconnect and reconnect again, because the transaction mode is unpredictable. Alternatively you may verify the transaction mode by checking the value of the server variable autocommit. However, such behaviour isn't portable. ... |
|||
|
||||
Grond |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2013 Репутация: нет Всего: нет |
У нас ситуация обратная - сбой происходит не при отключении, а при включении автокоммита. Кроме того, при сбое происходит закрытие перлового потока, и база отсоединяется, потом создаётся новое подключение, и на нём снова происходит сбой установки автокоммита.
|
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
попробуйте устанавливать AutoCommit при коннекте к базе.
|
|||
|
||||
Grond |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2013 Репутация: нет Всего: нет |
При коннекте у нас и так он выставляется, но периодически его надо снимать для проведения нескольких запросов единой транзакцией и, соответственно, восстанавливать после проведения транзакции перед продолжением работы. По идее, в случае успешного завершения транзакции, это делает DBI, а вот в случае ошибки восстановление делается нами вручную - в этот-то момент и возникает периодический сбой. Вообще, код у нас немножко кривоват в этом плане - он пытается восстанавливать автокоммит всегда, независимо от его состояния. Однако это всегда работало без проблем, да и должно работать без проблем, если не сломался объект обращения к БД.
|
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
Я не понял вашей логики -- после падения коннекта, кто восстанавливает его?
mysql_auto_reconnect или вы сами? А вообще, ошибка может говорить, это у вас DBD::mysql старый. |
|||
|
||||
Grond |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2013 Репутация: нет Всего: нет |
восстанавливает mysql_auto_reconnect
|
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
а как mysql_auto_reconnect может восстанавливать, если вы говорите, что AutoCommit => 0?
mysql_auto_reconnect This attribute determines whether DBD::mysql will automatically reconnect to mysql if the connection be lost. This feature defaults to off; however, if either the GATEWAY_INTERFACE or MOD_PERL envionment variable is set, DBD::mysql will turn mysql_auto_reconnect on. Setting mysql_auto_reconnect to on is not advised if 'lock tables' is used because if DBD::mysql reconnect to mysql all table locks will be lost. This attribute is ignored when AutoCommit is turned off, and when AutoCommit is turned off, DBD::mysql will not automatically reconnect to the server. It is also possible to set the default value of the "mysql_auto_reconnect" attribute for the $dbh by passing it in the "\%attr" hash for "DBI-"connect>. Note that if you are using a module or framework that performs reconnections for you (for example DBIx::Connector in fixup mode), this value must be set to 0. |
|||
|
||||
Grond |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2013 Репутация: нет Всего: нет |
кусок кода на самом верху топика.
$DataBase->{'AutoCommit'}=1; |
|||
|
||||
arto |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1495 Регистрация: 31.10.2004 Репутация: 38 Всего: 40 |
если я правильно понял, у вас отваливается во время транзакции, когда $DataBase->{'AutoCommit'} == 0?
или всё не так? |
|||
|
||||
Grond |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2013 Репутация: нет Всего: нет |
Отваливается, когда, по идее, не было запросов, требующих выключения автокоммита. Сейчас на сервере вообще единственная нагрузка - это попытки горе-хакеров подобрать http-запросы типа "/php-admin". При таковых запросах в цикле mod_perl проходит стадия проверки базы на подключённость и либо производится подключение (с включённым по умолчанию автокоммитом), либо следует проверка на отсутствие открытой транзакции (с целью сделать rollback в случае незавершённого действия). Далее в любом случае делается попытка установить автокоммит в 1, и как раз в этом месте в некоторые моменты времени начинается сбой, идентифицируемый как "отсутствие аргумента AutoCommit у объекта DBD". Возникновение таких сбоев продолжается некоторое время, после чего так же самопроизвольно прекращается.
|
|||
|
||||
ginnie |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 6.1.2008 Где: Москва Репутация: 38 Всего: 49 |
Grond, а не пробовали включить Tracing в DBI, чтобы посмотреть, что происходит, гадать тут сложновато.
-------------------- Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг) |
|||
|
||||
Grond |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2013 Репутация: нет Всего: нет |
вот результат трассировки:
по логу получается, что оно падает исключительно при новых коннектах. То есть, сбоят не старые, отработавшие подключения, а только создаваемые заново - видимо, создаваемые как-то криво. Почему криво - в трейсе не видно. какие идеи это исправить есть? Подскажите! Это сообщение отредактировал(а) Grond - 8.6.2013, 01:02 |
|||
|
||||
Grond |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2013 Репутация: нет Всего: нет |
Что? Никто не знает никакого способа поправить?
|
|||
|
||||
Pilat66 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 37 Регистрация: 27.1.2009 Репутация: 1 Всего: 1 |
Мне кажется, у Вас идеологически неправильно построено. Если работают транзакции, то надо отключать mysql_auto_reconnect , если AutoCommit=1, то так и надо всё время работать, не переключаясь в AutoCommit=0; "происходит закрытие перлового потока" - а это что вообще? У Вас многопоточное приложение?
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "Perl" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |