it-swarm.com.de

MySQL: Fehler beim Lesen der Kommunikationspakete

Ich bekomme diese Warnung in MySQL,

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

Ich habe einige Themen in Google durchlaufen und nach einem Vorschlag habe ich die max_allowed_packet von 128 to 512 to 1024 immer noch das gleiche Verhalten.

Ich verwende Drupal 7, und ja, es gibt viele Blob-Datentypen, aber 1024 Mb von max_allowed_packet sollte meiner meinung nach ausreichen.

Gibt es eine andere Problemumgehung, um diese Warnung zu überwinden?

BEARBEITEN:

Einige Einstellungen als @ Rolandos Vorschläge/Antwort hinzugefügt, ich erhalte immer noch die gleiche Warnung.

Meine MySQL-Konfiguration sieht folgendermaßen aus:

[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

Meine Anwendung verwendet nur InnoDB, aber es gibt nur wenige Datenbanken wie MySQL, die mit den Standard-MySQL-Installationen geliefert wurden. Sie verwenden nur den MyISAM-Engine-Typ. Ich denke, das sollte nicht mein Anliegen sein.

Wie Sie sehen können, habe ich auch eine Replikation. Die Warnung ist auch auf dem replizierten Server dieselbe, dessen Konfiguration mit dieser identisch ist.

14
user18530

Ich bin froh, dass Sie gesagt haben, dass alle Ihre Daten InnoDB sind, sodass ich wie folgt antworten kann: Wenn max_allowed_packet bei 1G und maximal ist Sie haben immer noch Probleme, es gibt wirklich nur zwei Orte zu suchen:

  1. innodb_log_buffer_size : Die Größe des Puffers in Byte, den InnoDB zum Schreiben in die Protokolldateien auf der Festplatte verwendet. Der Standardwert ist 8 MB. Ein großer Protokollpuffer ermöglicht die Ausführung großer Transaktionen, ohne dass das Protokoll vor dem Festschreiben der Transaktionen auf die Festplatte geschrieben werden muss. Wenn Sie also große Transaktionen haben, spart das Vergrößern des Protokollpuffers Festplatten-E/A.
  2. innodb_log_file_size : Die Größe jeder Protokolldatei in einer Protokollgruppe in Byte. Die kombinierte Größe von Protokolldateien muss weniger als 4 GB betragen. Der Standardwert ist 5 MB. Die zulässigen Werte reichen von 1 MB bis 1/N-Tausendstel der Größe des Pufferpools, wobei N die Anzahl der Protokolldateien in der Gruppe ist. Je größer der Wert ist, desto weniger Checkpoint-Flush-Aktivität ist im Pufferpool erforderlich, wodurch Festplatten-E/A gespeichert werden. Größere Protokolldateien bedeuten jedoch auch, dass die Wiederherstellung im Falle eines Absturzes langsamer ist.

Ich habe vor ungefähr 2 Jahren etwas angesprochen

VORSCHLÄGE

Sie müssen die InnoDB-Transaktionsprotokolle erhöhen . Hier sind die Schritte zum sicheren Erhöhen von innodb_log_buffer_size und innodb_log_file_size :

Schritt 01: Fügen Sie diese zu /etc/my.cnf

[mysqld]
innodb_log_buffer_size = 32M
innodb_log_file_size = 2047M

Schritt 02: Führen Sie dies in MySQL aus

mysql> SET GLOBAL innodb_fast_shutdown = 0;

Schritt 03: Herunterfahren von MySQL

service mysql stop

Schritt 04: Verschieben Sie die alten Protokolle beiseite

mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak

Schritt 05: Starten Sie MySQL

service mysql start

Das ist es.

Die InnoDB-Infrastruktur sollte jetzt über genügend Protokollspeicherplatz für BLOBs unterschiedlicher Größe verfügen.

Versuche es !!!

10
RolandoMySQLDBA

Nachdem ich im Januar 16 den Kommentar von @ user19292 zu dieser alten Frage gelesen hatte, habe ich ein Upgrade von 5.7.9 auf 5.7.12 durchgeführt und das Problem ist behoben.

1
IsraelWebDev

Ich habe gerade 5-6 Stunden damit verbracht, Optionen zu ändern und verschiedene Versionen von MySQL auszuprobieren. Ich habe immer den Fehler bekommen.

Ich denke, es ist eider, weil:

  • mein PHP Code schließt die Datenbankverbindung nicht richtig (es ist eine Warnung, kein Fehler), mysql_close() oder gleichwertig.
  • oder weil der Nginx-Cache/Proxy-Server so konfiguriert ist, dass die Verbindung geschlossen wird, wenn der Client sie schließt, wartet der Cache/Proxy-Server nicht auf den Origin-Server (wo sich auch MySQL befindet).
0
adrianTNT