MySQL. General error: 2006

Опубликовано admin в

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_nameValue
connect_timeout30
delayed_insert_timeout300
innodb_lock_wait_timeout50
innodb_rollback_on_timeoutOFF
interactive_timeout28800
lock_wait_timeout31536000
net_read_timeout30
net_write_timeout60
slave_net_timeout3600
wait_timeout28800

Эти значения являются относительно нормальными значениями 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

Но имейте ввиду что увеличение буфера приведет и к потреблению оперативной памяти сервера

Источник

Рубрики: mySql