Назад | Перейти на главную страницу

Прерванное соединение (произошла ошибка чтения коммуникационных пакетов)

Mysql error.log показывает

[Warning] Aborted connection 320935 to db: '...' user: '...' host: '...' (Got an error reading communication packets)

А на стороне клиента:

Lost connection to MySQL server at 'reading initial communication packet', system error: 111
Lost connection to MySQL server at 'reading authorization packet', system error: 0
and after a while: Host '...' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'

Я читаю руководство по mysql об этом и много других тем. Поэтому я изменил некоторые значения в my.cnf

max_allowed_packet      = 512M
connect_timeout = 60
net_read_timeout = 120
innodb_buffer_pool_size = 5G

Посмотрел журнал запросов разорванного соединения:

22400 Connect user@host on dbname
22400 Query SELECT @@sql_mode
22400 Query     SET SESSION sql_mode=''
22400 Query     SET NAMES utf8
22400 Init DB   dbname
22400 Init DB   dbname

Проверено состояние таблицы. bind-address - это IP-адрес сервера, но мне нужно подключиться извне.

Aborted_connects is 196

Основываясь на ограниченных данных, мне интересно, есть ли у вас брандмауэр между клиентом и сервером MySQL (он может быть непосредственно на хостах), который разрешает 3306 серверу MySQL, но блокирует ответные пакеты на исходный запрос SYN.

Вы можете выполнить дамп пакета с обеих сторон, чтобы выяснить, что происходит на стороне TCP, и / или проверить любые межсетевые экраны, существующие между обеими сторонами.

Я подозреваю, что это не проблема mysql как таковая.

Убедитесь, что транспортный уровень в порядке. Можете ли вы получить TCP-соединение, используя telnet [db_server] 3306 ?

Согласны ли ваш клиент и сервер о том, следует ли использовать шифрование SSL?

Я не могу вспомнить много ситуаций, когда я хотел бы запустить соединение mysql через общедоступный Интернет, что, как я подозреваю, именно то, что вы имеете в виду под «возможностью подключения извне». В незашифрованном виде это огромный риск для безопасности, а накладные расходы на настройку SSL для каждого соединения слишком высоки для большинства применений. Возможно, вы захотите использовать какой-то постоянный зашифрованный туннель.

Прерванное соединение считается ошибкой соединения в MySQL, которая может не регистрироваться в журнале ошибок MySQL. Видеть разорванные TCP-соединения не регистрируются как ошибки, но приводят к блокированию узла.