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. Я лисий. Ви коли-небудь вирішували це?
користувач19292

Відповіді:


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 роки тому

ПРОПОЗИЦІЇ

Потрібно збільшити журнали транзакцій 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 різних розмірів.

Спробувати !!!


Дуже дякую за відповідь, я відредагував своє запитання, щоб додати mysql.cnfфайл. Я зробив так, як ви запропонували, але все ж отримую попередження. Я можу бачити , max_allowed_packetв mysqldumpце просто , 16Mbале я думаю , що це не причина. key_buffer_sizeце 16Kbзнову і знову, це має бути щось, MyISAMі я не використовую MyISAMдвигун зберігання даних у додатку.

Також - для тих, хто стикається з цим під час роботи з сервером apache, мені також довелося перезапустити цю службу. Дуже дякую за це - я був незрозумілий.
dgo

1

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


2
Я використовую 5.7.23 і маю те саме питання
Ісус Узканга

1
Те саме, помилка існує з 5.7.26. У вашому випадку оновлення, ймовірно, також скидає конфігу, так що це може вирішити вашу проблему.
Sliq

0

Я щойно витратив приблизно 5-6 годин на зміну параметрів і пробуючи різні версії MySQL, я завжди отримував помилку.

Я думаю, що це ейдер тому, що:

  • мій PHP-код не належним чином закриває db-з'єднання (це попередження, а не помилка) mysql_close()або ін.
  • або тому, що кеш / проксі-сервер nginx налаштований на закриття з'єднання, якщо клієнт його закрив, кеш / проксі-сервер не чекає початкового сервера (де також є mysql).
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.