MySQL. General error: 2006
General error: 2006 MySQL server has gone away может возникать по многим причинам: https://dev.mysql.com/doc/refman/5.5/en/gone-away.html
И по факту она означает ««ваш SQL-запрос не сработал, потому что соединение с базой данных было отключено из-за «
Основные причины и их решения:
1. Сервер действительно недоступен.
Мы можем легко проверить это, посмотрев время безотказной работы сервера и журнал ошибок сервера.
mysql -uroot -p -e "show global status like 'uptime';"
Также можно псомотреть лог:
tail /var/log/mysql/error.log
170804 12:02:22 [Note] Event Scheduler: Purging the queue. 0 events
170804 12:02:24 InnoDB: Starting shutdown...
170804 12:02:27 InnoDB: Shutdown completed; log sequence number 338 3872664693
170804 12:02:27 [Note] /usr/libexec/mysqld: Shutdown complete
170804 12:02:27 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
170804 12:02:28 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
2. Соединение разорвано по причине таймаута
mysql -uroot -p -e "show global variables like '%timeout';"
Variable_name | Value |
connect_timeout | 30 |
delayed_insert_timeout | 300 |
innodb_lock_wait_timeout | 50 |
innodb_rollback_on_timeout | OFF |
interactive_timeout | 28800 |
lock_wait_timeout | 31536000 |
net_read_timeout | 30 |
net_write_timeout | 60 |
slave_net_timeout | 3600 |
wait_timeout | 28800 |
Эти значения являются относительно нормальными значениями MySQL по умолчанию. Если, однако, у вас очень короткие таймауты, вы можете получить эту ошибку. Вот только один пример.
mysql> SET SESSION wait_timeout=5;
## Wait 10 seconds
mysql> SELECT NOW();
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 132361
Current database: *** NONE ***
+---------------------+
| NOW() |
+---------------------+
| 2013-01-02 11:31:15 |
+---------------------+
1 row in set (0.00 sec)
3. Ваш оператор SQL был убит
Некоторые системы будут проактивно убивать SQL-запросы, которые слишком долго выполнялись. Вы можете легко проверить, может ли это быть проактивно, посмотрев, сколько команд KILL было выполнено.
$ mysql -uroot -p -e "show global status like 'com_kill'"
+---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_kill | 0 | +---------------+-------+
нет убитых SQL
4. Ваш SQL-запрос слишком велик. (очень распространенный)
Значение по умолчанию
mysql> show global variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name | Value |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
1 row in set (0.00 sec)
Вы можете увеличить, например, до 16M с помощью:
mysql> set global max_allowed_packet=1024*1024*16;
mysql> show global variables like 'max_allowed_packet';
+--------------------+----------+
| Variable_name | Value |
+--------------------+----------+
| max_allowed_packet | 16777216 |
+--------------------+----------+
1 row in set (0.00 sec)
Меняем значение тут:
#my.cnf
[mysqld]
max_allowed_packet = 16M
max_allowed_packet — Максимальный размер пакета для передачи данных. Данные между клиентом и сервером передаются пакетами. В начале создается пакет длиной net_buffer_length затем, если размер данных больше, то размер пакета увеличивается до необходимого значения, при этом его длина не может превысить значение max_allowed_packet.
Если используются поля BLOB большого размера, то рекомендуется увеличить значение этого параметра.
В идеале нужно присвоить этой переменной значение размера самого большого BLOB поля
5. Проблема с переполнением буфера для таблиц InnoDB
Стоит проверить эти переменные. По умолчанию для MySQL 8.0 они
show global variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+ | Variable_name | Value | +-------------------------+-----------+ | innodb_buffer_pool_size | 134217728 | +-------------------------+-----------+ 1 row in set (0.05 sec)
show global variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | innodb_lock_wait_timeout | 50 | +--------------------------+-------+ 1 row in set (0.00 sec)
Далее увеличиваем до следующих
innodb_buffer_pool_size = 256M innodb_lock_wait_timeout = 180 [mysqld] max_allowed_packet=256M
Но имейте ввиду что увеличение буфера приведет и к потреблению оперативной памяти сервера