Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Постоянное выпадение в лог, ошибки DBD driver... 
:(
    Опции темы
Grond
Дата 21.5.2013, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.

по указанному месту в файле такой кусок прописан:

Код

$DataBase->{'AutoCommit'}=1;
  };
  if($@){
   die "$@" if $RepeatInit;
   $RepeatInit=1;
   warn '['.localtime()."] [error] RAC=$RollbackAndContinue, DB=${$DataBaseVarRef} in $@";
   undef $RollbackAndContinue;
   undef ${$DataBaseVarRef};
   redo ReInit;


Что это может быть и как исправить?
PM MAIL   Вверх
arto
Дата 21.5.2013, 07:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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.
...
PM MAIL ICQ   Вверх
Grond
Дата 21.5.2013, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 17.5.2013

Репутация: нет
Всего: нет



У нас ситуация обратная - сбой происходит не при отключении, а при включении автокоммита. Кроме того, при сбое происходит закрытие перлового потока, и база отсоединяется, потом создаётся новое подключение, и на нём снова происходит сбой установки автокоммита.
PM MAIL   Вверх
arto
Дата 21.5.2013, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



попробуйте устанавливать AutoCommit при коннекте к базе.
PM MAIL ICQ   Вверх
Grond
Дата 21.5.2013, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 17.5.2013

Репутация: нет
Всего: нет



 При коннекте у нас и так он выставляется, но периодически его надо снимать для проведения нескольких запросов единой транзакцией и, соответственно, восстанавливать после проведения транзакции перед продолжением работы. По идее, в случае успешного завершения транзакции, это делает DBI, а вот в случае ошибки восстановление делается нами вручную - в этот-то момент и возникает периодический сбой. Вообще, код у нас немножко кривоват в этом плане - он пытается восстанавливать автокоммит всегда, независимо от его состояния. Однако это всегда работало без проблем, да и должно работать без проблем, если не сломался объект обращения к БД.
PM MAIL   Вверх
arto
Дата 21.5.2013, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



Я не понял вашей логики -- после падения коннекта, кто восстанавливает его?
mysql_auto_reconnect или вы сами?

А вообще, ошибка может говорить, это у вас DBD::mysql старый.
PM MAIL ICQ   Вверх
Grond
Дата 21.5.2013, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 17.5.2013

Репутация: нет
Всего: нет



восстанавливает mysql_auto_reconnect
PM MAIL   Вверх
arto
Дата 21.5.2013, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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.

PM MAIL ICQ   Вверх
Grond
Дата 22.5.2013, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 17.5.2013

Репутация: нет
Всего: нет



кусок кода на самом  верху топика.

$DataBase->{'AutoCommit'}=1;
PM MAIL   Вверх
arto
Дата 23.5.2013, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



если я правильно понял, у вас отваливается во время транзакции, когда $DataBase->{'AutoCommit'} == 0?
или всё не так?
PM MAIL ICQ   Вверх
Grond
Дата 23.5.2013, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 17.5.2013

Репутация: нет
Всего: нет



Отваливается, когда, по идее, не было запросов, требующих выключения автокоммита. Сейчас на сервере вообще единственная нагрузка - это попытки горе-хакеров подобрать http-запросы типа "/php-admin". При таковых запросах в цикле mod_perl проходит стадия проверки базы на подключённость и либо производится подключение (с включённым по умолчанию автокоммитом), либо следует проверка на отсутствие открытой транзакции (с целью сделать rollback в случае незавершённого действия). Далее в любом случае делается попытка установить автокоммит в 1, и как раз в этом месте в некоторые моменты времени начинается сбой, идентифицируемый как "отсутствие аргумента AutoCommit у объекта DBD". Возникновение таких сбоев продолжается некоторое время, после чего так же самопроизвольно прекращается.
PM MAIL   Вверх
ginnie
Дата 23.5.2013, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Grond, а не пробовали включить Tracing в DBI, чтобы посмотреть, что происходит, гадать тут сложновато.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Grond
Дата 6.6.2013, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 17.5.2013

Репутация: нет
Всего: нет



вот результат трассировки:


Код

mysql.xs do() use_server_side_prepare 0
mysql_st_internal_execute MYSQL_VERSION_ID 50148
>parse_params statement SET NAMES 'utf8'
    <- do= '0E0' at DC_DB.pm line 29 via  at DC_DB.pm line 58
    -> STORE for DBD::mysql::Db (DBI::Db=HASH(0x7f91b1de18f8)~INNER 'AutoCommit' 1) thr#7f91b146b1c0
    <- STORE= 1 at DC_DB.pm line 32 via  at DC_DB.pm line 31
    -> FETCH for DBD::mysql::Db (DBI::Db=HASH(0x7f91b1de1e20)~INNER 'AutoCommit') thr#7f91b146b1c0
    <- FETCH= 1 at DC_DB.pm line 21 via  at DC_DB.pm line 64
    -> STORE for DBD::mysql::Db (DBI::Db=HASH(0x7f91b1de1e20)~INNER 'AutoCommit' 1) thr#7f91b146b1c0
  --> do_error
Turning on AutoCommit failed error 21 recorded: Turning on AutoCommit failed
  <-- do_error
    STORE DBI::Db=HASH(0x7f91b1de1e20) 'AutoCommit' => 1
AutoCommit crashed



по логу получается, что оно падает исключительно при новых коннектах. То есть, сбоят не старые, отработавшие подключения, а только создаваемые заново - видимо, создаваемые как-то криво. Почему криво - в трейсе не видно.

какие идеи это исправить есть? Подскажите!

Это сообщение отредактировал(а) Grond - 8.6.2013, 01:02
PM MAIL   Вверх
Grond
Дата 20.6.2013, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 17.5.2013

Репутация: нет
Всего: нет



Что? Никто не знает никакого способа поправить?
PM MAIL   Вверх
Pilat66
Дата 4.7.2013, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 27.1.2009

Репутация: 1
Всего: 1



Мне кажется, у Вас идеологически неправильно построено. Если работают транзакции, то надо отключать mysql_auto_reconnect , если AutoCommit=1, то так и надо всё время работать, не переключаясь в AutoCommit=0; "происходит закрытие перлового потока" - а это что вообще? У Вас многопоточное приложение? 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1197 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.