MySQL: ошибка чтения пакетов связи

14

Я получаю это предупреждение в MySQL,

[Warning] Aborted connection 21 to db: 'MyDB' user: 'MyUser' host: 'localhost' (Got an error reading communication packets)

Я прошел через несколько тем в Google и по некоторым предположениям я увеличил max_allowed_packetс 128 to 512 to 1024того же поведения.

Я использую Drupal 7, и да, есть много типов данных BLOB-объектов, но , по моему мнению , 1024 Mbэтого max_allowed_packetдолжно быть достаточно.

Любой другой обходной путь, как преодолеть это предупреждение?

РЕДАКТИРОВАТЬ:

Добавлены некоторые настройки в качестве предложений / ответа @ Rolando, но я получаю то же предупреждение.

Мой конфиг mysql выглядит так:

[client]
port        = 3306
socket      = /tmp/mysql.sock
default-character-set = utf8

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 16K 
max_allowed_packet = 1024M 
table_open_cache = 128 
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 192K
# Query cache disabled
thread_cache_size = 8
myisam-recover = BACKUP
max_connections = 100
thread_concurrency = 10
tmp_table_size = 128M
max_heap_table_size = 128M
log_error                = /var/log/mysql/mysql-error.log
log_slow_queries        = /var/log/mysql/mysql-slow.log
long_query_time = 2

log_warnings = 2

server-id   = 1
binlog-format = row
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
log_bin = mysql-bin
log-slave-updates
relay-log=mysqld-relay-bin
expire_logs_days        = 10
max_binlog_size         = 100M

innodb_data_home_dir = /var/db/mysql
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /var/db/mysql
innodb_buffer_pool_size = 8G
character-set-server = utf8
#innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 2047M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 2
innodb_thread_concurrency = 8
innodb_lock_wait_timeout = 50
innodb_flush_method = O_DIRECT

[mysqldump]
quick
quote-names
max_allowed_packet = 16M
default-character-set = utf8

[mysql]
default-character-set = utf8

[myisamchk]
key_buffer_size = 32M
sort_buffer_size = 32M

[mysqlhotcopy]
interactive-timeout

[mysqld_save]
syslog

Мое приложение использует только InnoDB, но есть несколько баз данных, подобных mysql, которые поставляются со стандартными установками mysql, и только те, которые используют тип движка MyISAM, я думаю, это не должно меня беспокоить.

Как вы видите, у меня тоже есть репликация, предупреждение тоже самое и на реплицированном сервере, конфигурация которого такая же.


источник
Все ваши столы InnoDB?
RolandoMySQLDBA
@RolandoMySQLDBA, Привет, Да, все таблицы innodb, я сделал в соответствии с вашим ответом на какой-то другой вопрос, как этот на этом сайте, но я все еще получаю предупреждение.
@RolandoMySQLDBA, я отредактировал свой вопрос и сделал то, что вы предложили, я все еще получаю это предупреждение. У меня есть mysql.cnf здесь, не могли бы вы взглянуть на него, я могу что-то
Я начал получать эту ошибку на MySQL 5.5.35 с Drupal 6. Я никогда не понимал проблему, но она ушла при обновлении до 5.7.7. Теперь он вернулся с 5.7.9. Я выделил запрос вставки (менее 6000 символов текста), который выполняется на 5.7.7, но вызывает прерывание на 5.7.9. Это происходит только при удаленном, а не локальном выполнении. Итак, один и тот же клиент, обе версии сервера работают бок о бок на одной и той же машине, одинаковый sql_mode, одинаковый набор символов, огромный max_allowed_packet. Я лисица Вы когда-нибудь решали это?
user19292

Ответы:

10

Я рад, что вы сказали, что все ваши данные - InnoDB, поэтому я могу ответить следующим образом: Если max_allowed_packet увеличен до 1G, и у вас все еще есть проблемы, на самом деле есть только два места для поиска:

  1. innodb_log_buffer_size : размер в байтах буфера, который InnoDB использует для записи в файлы журналов на диске. Значение по умолчанию составляет 8 МБ. Большой буфер журналов позволяет выполнять большие транзакции без необходимости записи журнала на диск до фиксации транзакций. Таким образом, если у вас большие транзакции, увеличение размера буфера журнала экономит дисковый ввод-вывод.
  2. innodb_log_file_size : размер в байтах каждого файла журнала в группе журнала. Общий размер файлов журнала должен быть менее 4 ГБ. Значение по умолчанию составляет 5 МБ. Разумные значения варьируются от 1 МБ до 1 / N-го размера пула буферов, где N - количество файлов журнала в группе. Чем больше значение, тем меньше операций очистки контрольных точек требуется в пуле буферов, что экономит дисковый ввод-вывод. Но большие файлы журнала также означают, что восстановление происходит медленнее в случае сбоя.

Я обратился что-то около 2 лет назад

SUGGESTIONS

Вам необходимо увеличить журналы транзакций InnoDB . Вот шаги для безопасного увеличения innodb_log_buffer_size и innodb_log_file_size :

Шаг 01: Добавьте это к /etc/my.cnf

[mysqld]
innodb_log_buffer_size = 32M
innodb_log_file_size = 2047M

Шаг 02: Запустите это в MySQL

mysql> SET GLOBAL innodb_fast_shutdown = 0;

Шаг 03: Выключение MySQL

service mysql stop

Шаг 04: отодвиньте старые бревна в сторону

mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak

Шаг 05: Запустите MySQL

service mysql start

Вот и все.

Инфраструктура InnoDB теперь должна иметь достаточно места для ведения журнала для BLOB-объектов различного размера.

Попробуйте!

RolandoMySQLDBA
источник
Большое спасибо за ответ, я отредактировал свой вопрос, чтобы добавить mysql.cnfфайл. Я сделал, как вы предложили, но все равно получил предупреждения. Я могу видеть , max_allowed_packetв mysqldumpэто просто , 16Mbно я думаю , что это не причина. key_buffer_sizeпросто 16Kbи снова это должно быть что-то с, MyISAMи я не использую MyISAMдвижок хранения в приложении.
Кроме того - для тех, кто сталкивается с этим при работе с сервером Apache, мне также пришлось перезапустить эту службу. Большое спасибо за это - я был невежественен.
КГВР
1

Прочитав комментарий @ user19292 в январе '16 по этому старому вопросу, я обновился с 5.7.9 до 5.7.12, и проблема исчезла.

IsraelWebDev
источник
2
Я использую 5.7.23 и у меня та же проблема
Иисус Узканга
1
То же самое здесь, ошибка существует с 5.7.26. В вашем случае обновление, вероятно, также сбросит настройки, так что это могло бы решить вашу проблему.
Sliq
0

Я просто потратил около 5-6 часов, меняя опции и пробуя разные версии MySQL, я всегда получал ошибку.

Я думаю, что это eider, потому что:

  • мой код PHP неправильно закрывает соединение с БД (это предупреждение, а не ошибка) mysql_close()или эквивалентный.
  • или поскольку кеш / прокси-сервер nginx настроен на закрытие соединения, если клиент закрыл его, кеш / прокси-сервер не ожидает исходный сервер (где также находится mysql).
adrianTNT
источник