Ошибка пилонов - «сервер MySQL ушел» - PullRequest
14 голосов
/ 11 августа 2008

Я использую Pylons (инфраструктуру Python) для обслуживания простого веб-приложения, но время от времени он, похоже, умирает, и это в журнале ошибок: (2006, 'MySQL server has gone away')

Я немного проверил и увидел, что это связано с тем, что соединения с MySQL не обновлялись. Это не должно быть проблемой, потому что sqlalchemy.pool_recycle в файле конфигурации должен автоматически поддерживать его. По умолчанию было 3600, но я набрал его обратно 1800 из-за этой проблемы. Это немного помогло, но 3600 должно быть в порядке в соответствии с документами. Ошибки все еще случаются полурегулярно. Хотя я не хочу слишком сильно снижать его и DOS - моя собственная база данных:).

Может быть, что-то в моем конфиге MySQL глупо? Не уверен, где именно искать.

Другие соответствующие данные:

  Python 2.5
  Pylons: 0.9.6.2 (w/ sql_alchemy)
  MySQL: 5.0.51

Ответы [ 2 ]

6 голосов
/ 05 сентября 2008

Кажется, я это исправил. Оказывается, у меня была простая ошибка конфигурации. Мой INI-файл читается:

sqlalchemy.default.url = [connection string here]
sqlalchemy.pool_recycle = 1800

Проблема в том, что мой файл environment.py объявил, что механизм будет отображать только ключи с префиксом: sqlalchemy.default, поэтому pool_recycle был проигнорирован.

Решение состоит в том, чтобы просто изменить вторую строку в ini на:

sqlalchemy.default.pool_recycle = 1800
2 голосов
/ 19 августа 2008

Вы можете проверить переменные тайм-аута MySQL:

show variables like '%timeout%';

Возможно, вы заинтересованы в wait_timeout (менее вероятно, но возможно: interactive_timeout). В Debian и Ubuntu значения по умолчанию - 28800 (MySQL убивает соединения через 8 часов), но, возможно, по умолчанию для вашей платформы они другие или тот, кто администрирует сервер, настроил все по-другому.

AFAICT, pool_recycle на самом деле не поддерживает соединения живыми, их срок действия истекает сам по себе, прежде чем MySQL их убивает. Я не знаком с пилонами, но если периодически вызывать соединения, то SELECT 1; - вариант, который будет поддерживать их работу за счет, по сути, отсутствия нагрузки на сервер и минимального сетевого трафика. Одна заключительная мысль: вам как-то удается использовать соединение, которое, по мнению пилонов, истекло?

...