Схвалено кращими українськими програмістами

A.2.2 Помилка MySQL server has gone away

Все викладене в даному розділі відноситься також і до спорідненої помилку Lost connection to server during query.

Найбільш часто помилка MySQL server has gone away виникає в результаті тайм-ауту з'єднання і його закриття сервером. За замовчуванням сервер закриває з'єднання через 8 годин бездіяльності. Можна змінити ліміт часу, встановивши при запуску mysqld змінну wait_timeout.

Іншою поширеною причиною отримання помилки MySQL server has gone away є видача команди "закриття" на з'єднанні MySQL з подальшою спробою виконати запит на закритому з'єднанні.

Якщо це отримано в скрипті, то досить просто повторити запит від клієнта, щоб з'єднання автоматично відновилося.

Зазвичай в цьому випадку видаються наступні коди помилки (який з них ви отримаєте, залежить від ОС):

Клієнт не може послати запит серверу.

Клієнт не отримав помилки при передачі запиту серверу, але він не отримав також повної відповіді (або хоч якоїсь відповіді) на запит.

Помилка буде також видана, якщо хто-небудь знищить виконується потік за допомогою kill номерпотока.

Перевірити, що MySQL на ходу, можна, запустивши mysqladmin version і вивчивши час роботи (uptime). Якщо проблема в аварійному завершенні mysqld. то необхідно зосередитися на пошуку причини аварії. В цьому випадку слід спочатку перевірити, чи не буде знищений MySQL знову при повторному завданні запиту (see section A.4.1 Що робити, якщо робота MySQL супроводжується постійними збоями).

Ці помилки будуть також видаватися при посилці сервера невірного або занадто довгого запиту. Якщо mysqld отримує неправильний або занадто великий пакет, то сервер передбачає, що з клієнтом щось не так, і закриває з'єднання. Якщо необхідно виконувати об'ємні запити (наприклад, при роботі з великими стовпцями типу BLOB), можна збільшити граничний розмір запиту, запустивши mysqld з опцією -O max_allowed_packet = # (за замовчуванням 1 Mб). Додаткова пам'ять виділяється на вимогу, так що mysqld буде використовувати більше пам'яті тільки в разі, коли виданий великий запит або коли mysqld повинен повернути велику рядок результату!

Якщо у вас виникне бажання зробити звіт про помилку з цієї проблеми, то не забудьте включити в нього такі відомості:

  • Інформацію про те, впав MySQL чи ні (це можна визначити по файлу hostname.err (see section A.4.1 Що робити, якщо робота MySQL супроводжується постійними збоями).
  • Якщо певний запит знищує mysqld. а використовувані в ньому таблиці перед виконанням запиту перевірялися за допомогою CHECK TABLE. то бажано скласти контрольний тест (see section E.1.6 Створення контрольного прикладу при пошкодженні таблиць).
  • Значення змінної wait_timeout в сервері (це значення видає mysqladmin variables).
  • Інформацію про те, чи пробували ви запускати mysqld з --log і перевіряти, чи з'являється виданий запит в журналі.

Схожі статті