MySQL: İletişim paketlerini okuma hatası


14

Bu uyarıyı mysql'de alıyorum,

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

Ben google birkaç konular üzerinde olmuştur ve ben arttı bazı öneriye göre gelmiş max_allowed_packetdan 128 to 512 to 1024hala aynı davranışa.

Ben Drupal 7 kullanıyorum ve evet blob veri türlerinin sürü, ama 1024 Mbiçinde max_allowed_packetbence yeterli olmalı.

Bu uyarının üstesinden gelmek için başka bir çözüm var mı?

DÜZENLE:

@ Rolando'nun önerileri / cevabı gibi bazı ayarlar eklendi, hala aynı uyarıyı alıyorum.

My mysql config şuna benzer:

[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

Uygulamam sadece InnoDB kullanıyor, ancak standart mysql kurulumları ile gelen mysql gibi birkaç veritabanı var, sadece MyISAM motor tipini kullananlardır, sanırım endişem olmamalı.

Gördüğünüz gibi ben de çoğaltmam var, uyarı çoğaltılmış sunucuda da aynı, yapılandırması da aynı.


Tüm tablolarınız InnoDB mi?
RolandoMySQLDBA

@RolandoMySQLDBA, Merhaba, Evet, tüm tablolar innodb, bu web sitesinde böyle başka bir soruya cevabınıza göre yaptım, ancak hala uyarı alıyorum.

@RolandoMySQLDBA, sorumu düzenledim ve önerdiklerinizi yaptım, hala bu uyarıyı alıyorum. Burada mysql.cnf var, lütfen bir göz atabilir, bir şey eksik olabilir

Bu hatayı Drupal 6 ile MySQL 5.5.35'te almaya başladım. Problemi hiç anlamadım ama 5.7.7 sürümüne geçtim. Şimdi 5.7.9 ile geri döndü. 5.7.7 başarılı ancak 5.7.9 bir kürtaj neden ekleme sorgusu (6000'den az karakter karakter) izole ettim. Yerel olarak değil, yalnızca uzaktan yürütüldüğünde başarısız olur. Yani, aynı istemci, sunucunun her iki sürümü de aynı makinede yan yana çalışıyor, aynı sql_mode, aynı karakter kümesi, devasa max_allowed_packet. Tilki yaptım. Bunu hiç çözdün mü?
user19292

Yanıtlar:


10

Tüm verilerinizin InnoDB olduğunu söylediğinize sevindim, bu yüzden aşağıdaki gibi cevap verebilirim: max_allowed_packet 1G'de maksimumsa ve hala sorun yaşıyorsanız, bakmak için sadece iki yer var:

  1. innodb_log_buffer_size : InnoDB'nin diskteki günlük dosyalarına yazmak için kullandığı arabellek bayt cinsinden boyutu. Varsayılan değer 8 MB'dir. Büyük bir günlük arabelleği, büyük işlemlerin, işlemler yapılmadan önce günlüğü diske yazmaya gerek kalmadan çalışmasını sağlar. Böylece, büyük işlemleriniz varsa, günlük arabelleğini büyütmek disk G / Ç'den tasarruf sağlar.
  2. innodb_log_file_size : Bir günlük grubundaki her günlük dosyasının bayt cinsinden boyutu. Günlük dosyalarının birleştirilmiş boyutu 4 GB'tan küçük olmalıdır. Varsayılan değer 5 MB'dir. Duyarlı değerler, arabellek havuzunun boyutunun 1MB ile 1 / N-th arasında değişir; burada N, gruptaki günlük dosyalarının sayısıdır. Değer büyüdükçe, arabellek havuzunda disk G / Ç tasarrufu sağlayan daha az denetim noktası yıkama etkinliğine ihtiyaç duyulur. Ancak daha büyük günlük dosyaları, çökme durumunda kurtarma işleminin daha yavaş olduğu anlamına da gelir.

Yaklaşık 2 yıl önce bir şeye değindim

ÖNERİLER

InnoDB işlem günlüklerini artırmanız gerekir . İnnodb_log_buffer_size'yi güvenli bir şekilde artırmak için adımlar ve innodb_log_file_size şunlardır :

Adım 01: Bunları /etc/my.cnf

[mysqld]
innodb_log_buffer_size = 32M
innodb_log_file_size = 2047M

Adım 02: MySQL'de çalıştırın

mysql> SET GLOBAL innodb_fast_shutdown = 0;

Adım 03: MySQL'i Kapatma

service mysql stop

Adım 04: Eski günlükleri bir kenara koyun

mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak

Adım 05: MySQL'i başlatın

service mysql start

Bu kadar.

InnoDB Altyapısı artık farklı boyuttaki BLOB'lar için yeterli kayıt alanına sahip olmalıdır.

Bir şans ver !!!


Yanıtınız için çok teşekkür ederim, mysql.cnfdosya eklemek için sorumu düzenledim . Önerdiğin gibi yaptım, ama yine de uyarıları alıyorum. Görebildiğim max_allowed_packetiçinde mysqldumpadildir 16Mbama bu neden değil sanırım. key_buffer_sizeadil 16Kbve tekrar bir şey olmalı MyISAMve ben MyISAMuygulamada depolama motoru kullanmıyorum .

Ayrıca - bir apache sunucusuyla çalışırken karşılaşan herkes için de bu servisi yeniden başlatmak zorunda kaldım. Bunun için çok teşekkür ederim - clueless.
dgo

1

@ User19292'nin Ocak '16'daki bu eski soru hakkındaki yorumunu okuduktan sonra 5.7.9'dan 5.7.12'ye yükselttim ve sorun ortadan kalktı.


2
5.7.23 kullanıyorum ve aynı sorunu yaşıyorum
Jesus Uzcanga

1
Aynı şekilde, 5.7.26 ile hata var. Sizin durumunuzda yükseltme muhtemelen yapılandırmaları da sıfırlar, bu da sorununuzu çözmüş olabilir.
Sliq

0

Seçenekleri değiştirmek ve MySQL'in farklı sürümlerini denemek için yaklaşık 5-6 saat geçirdim, her zaman hatayı aldım.

Bence eider çünkü:

  • PHP kodum db bağlantısını düzgün kapatmıyor (bu bir uyarı, bir hata değil), mysql_close() veya eşdeğeri.
  • veya nginx önbellek / proxy sunucusu istemci kapatırsa bağlantıyı kapatacak şekilde yapılandırıldığından, önbellek / proxy sunucusu başlangıç ​​sunucusunu beklemez (burada mysql de bulunur).
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.