[Предупреждение]: PDO :: __ construct (): сервер MySQL ушел - wait_timeout не причина? - PullRequest
3 голосов
/ 01 сентября 2011

Я надеюсь, что кто-то здесь может помочь с проблемой, возникшей у меня на веб-сервере. В настоящее время на сервере размещено веб-приложение, которое мы приобрели для службы поддержки. Каждые 8 ​​часов, когда кто-то переходит на страницу, ему сообщают об ошибке:

[Warning]: PDO::__construct(): MySQL server has gone away (Database/class.SWIFT_Database.php:334)

Я попытался установить для wait_timeout максимальное значение в файле /etc/my.cnf, т. Е.

wait_timeout=31536000

Также из mysql я установил глобальное wait_timeout на это значение и установил сеанс wait_time на то же самое.

Я заметил странное поведение, когда вы перезапускаете службу mysql, тайм-аут ожидания сбрасывается до значения по умолчанию 28800, несмотря на то, что он установлен в my.cnf. Я не могу найти другие файлы конфигурации для MySQL, хотя с удовольствием посмотрю, если кто-то может указать мне в этом направлении.

Также сегодня утром, когда я вошел на сервер и выполнил следующую команду, значение сеанса wait_timeout было возвращено!

mysql> select @@global.wait_timeout, @@session.wait_timeout;
+-----------------------+------------------------+
| @@global.wait_timeout | @@session.wait_timeout |
+-----------------------+------------------------+
|              31536000 |                  28800 |
+-----------------------+------------------------+
1 row in set (0.00 sec)

Я вижу, что это проблема для многих людей в Интернете с различными веб-приложениями, работающими на MySQL, но, похоже, никто не может решить эту проблему. Многие советы онлайн указывают на wait_timeout, но, похоже, это не меняет обнаруженную ошибку. Я опробовал исправления в руководстве по mysql об этой проблеме, но все еще не повезло (ссылка: http://dev.mysql.com/doc/refman/5.0/en/gone-away.html)

Любой совет будет принят с благодарностью. Подробности сервера и версии продукта ниже:

Сервер: OpenSuse 11.4 MySql версия: 5.1.53

Заранее большое спасибо!

Ответы [ 3 ]

6 голосов
/ 06 июня 2012

Хотя и не очень элегантно, следующий фрагмент помог мне избавиться от таймаутов и сохранить постоянные соединения. Он выдаст исключение, если соединение не сможет выполнить $ limit times подряд, хотя, если проблема заключается в тайм-аутах, вам понадобится не более 1 попытки.

$db = null;
$limit = 10;
$counter = 0;
while (true) {
    try {
        $db = new PDO('mysql:host=' . db_host . ';dbname=' . db_name, db_user, db_pass);
        $db->exec( "SET CHARACTER SET utf8" );
        $db->setAttribute( PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC ); 
        $db->setAttribute( PDO::ATTR_PERSISTENT, true );
        break;
    }
    catch (Exception $e) {
        $db = null;
        $counter++;
        if ($counter == $limit)
            throw $e;
    }
}
1 голос
/ 07 июля 2015

Существуют различные причины, по которым соединение закрывается.

Ссылка: https://dev.mysql.com/doc/refman/5.0/en/gone-away.html

Я тоже сталкивался с подобной проблемой при использовании PDO, когда администратор хостинга разрывает соединение, если оно спит большечем минуту.Следовательно, я придумал свой собственный класс, который обернет класс PDO.Это определит, закрыто ли соединение, и попытается переподключиться при выполнении запроса.

Ответ ниже

PDO: сервер MySQL отключен

1 голос
/ 17 февраля 2012

Эта статья на Drupal.org может оказаться полезной в вашей ситуации:

MySQL поставляется с конфигурацией ресурсов, которую он собирается использовать по умолчанию, указанной в «my.cnf» (Linux) или «my.ini» (Windows) во время установки MySQL.

В Linux этот файл находится по адресу /etc/my.cnf для установки глобальных параметров или /usr/local/var/mysql-data-dir/my.cnf для настройки параметров сервера.

В Windows этот файл по умолчанию расположен на C:\Program Files\MySQL\MySQL Server X.Y\my.ini.

Ресурсы, разрешенные конфигурацией по умолчанию, обычно недостаточны для запуска ресурсоемкого приложения. Необходимо изменить следующие спецификации ресурсов, если они доступны в исходном файле конфигурации, или добавить их в файл конфигурации, если они еще не указаны (поскольку некоторые из них отсутствуют по умолчанию):

Внимание! Не забудьте сохранить файлы резервных копий, прежде чем что-либо делать! Вам также придется перезагрузить службу MySQL после внесения изменений в эти файлы конфигурации.

Характеристики MyISAM:

[mysqld]
port = 3306
socket = /tmp/mysql.sock
skip-external-locking
key_buffer = 384M
max_allowed_packet = 64M
table_cache = 4096
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 64M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M

Характеристики InnoDB:

innodb_buffer_pool_size = 384M
innodb_additional_mem_pool_size = 20M
innodb_log_file_size = 10M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 180

Примечание: Здесь предполагается, что вы используете таблицы базы данных InnoDB, поскольку Drupal является ресурсоемким приложением. Если вы не используете таблицы базы данных InnoDB, попробуйте изменить это, принимая во внимание тот факт, что вы получаете предупреждение: сервер MySQL ушел - очевидно, это означает, что ваша установка требует значительных ресурсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...