MySQL: errore durante la lettura dei pacchetti di comunicazione


14

Ricevo questo avviso in mysql,

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

Sono stato con alcuni argomenti in Google e secondo qualche suggerimento ho aumentato la max_allowed_packetda 128 to 512 to 1024sempre lo stesso comportamento.

Sto usando Drupal 7, e sì, ci sono un sacco di tipi di dati blob, ma 1024 Mbdi max_allowed_packetdovrebbe essere sufficiente a mio parere.

Qualche altra soluzione alternativa come superare questo avviso?

MODIFICARE:

Aggiunte alcune impostazioni come suggerimenti / risposta di @Rolando, ricevo ancora lo stesso avviso.

La mia configurazione mysql si presenta così:

[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

La mia applicazione utilizza solo InnoDB, ma ci sono pochi database come mysql, forniti con le installazioni mysql standard che sono solo quelli che utilizzano il tipo di motore MyISAM, immagino che non dovrebbe essere la mia preoccupazione.

Come puoi vedere ho anche la replica, l'avviso è lo stesso anche nel server replicato, la cui configurazione è identica a questa.


Tutti i tuoi tavoli sono InnoDB?
RolandoMySQLDBA

@RolandoMySQLDBA, Ciao, Sì, tutti i tavoli sono innodb, l'ho fatto in base alla tua risposta in qualche altra domanda come questa in questo sito Web, ma ricevo ancora l'avviso.

@RolandoMySQLDBA, ho modificato la mia domanda e fatto quello che mi hai suggerito, sto ancora ricevendo quell'avvertimento. Ho mysql.cnf qui, puoi per favore darci un'occhiata, mi potrebbe mancare qualcosa

Ho iniziato a ricevere questo errore su MySQL 5.5.35 con Drupal 6. Non ho mai capito il problema, ma è andato via con l'aggiornamento a 5.7.7. Ora è tornato con 5.7.9. Ho isolato una query di inserimento (meno di 6000 caratteri di testo) che ha esito positivo su 5.7.7 ma provoca un'interruzione su 5.7.9. Non funziona solo se eseguito in remoto, non localmente. Quindi, stesso client, entrambe le versioni del server eseguite fianco a fianco sulla stessa macchina, stessa sql_mode, stesso set di caratteri, enorme max_allowed_packet. Sono volpe. hai mai risolto questo?
user19292

Risposte:


10

Sono contento che tu abbia detto che tutti i tuoi dati sono InnoDB, quindi posso rispondere come segue: Se max_allowed_packet è al massimo a 1G e hai ancora problemi, ci sono davvero solo due posti in cui cercare:

  1. innodb_log_buffer_size : la dimensione in byte del buffer che InnoDB utilizza per scrivere sui file di registro sul disco. Il valore predefinito è 8 MB. Un buffer di registro di grandi dimensioni consente l'esecuzione di transazioni di grandi dimensioni senza la necessità di scrivere il registro su disco prima del commit delle transazioni. Pertanto, se si hanno grandi transazioni, allargando il buffer di registro si risparmia l'I / O del disco.
  2. innodb_log_file_size : la dimensione in byte di ciascun file di registro in un gruppo di registri. La dimensione combinata dei file di registro deve essere inferiore a 4 GB. Il valore predefinito è 5 MB. I valori sensibili vanno da 1 MB a 1 / N-esima della dimensione del pool di buffer, dove N è il numero di file di registro nel gruppo. Maggiore è il valore, minore è l'attività di svuotamento del checkpoint nel pool di buffer, che consente di risparmiare l'I / O del disco. Ma i file di registro più grandi significano anche che il recupero è più lento in caso di crash.

Mi sono rivolto a qualcosa del genere circa 2 anni fa

SUGGERIMENTI

È necessario aumentare i registri delle transazioni di InnoDB . Ecco i passaggi per aumentare in modo sicuro innodb_log_buffer_size e innodb_log_file_size :

Step 01: aggiungi questi a /etc/my.cnf

[mysqld]
innodb_log_buffer_size = 32M
innodb_log_file_size = 2047M

Step 02: eseguilo in mysql

mysql> SET GLOBAL innodb_fast_shutdown = 0;

Passaggio 03: spegnimento mysql

service mysql stop

Passaggio 04: spostare i vecchi registri da parte

mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak

Passaggio 05: avvia mysql

service mysql start

Questo è tutto.

L'infrastruttura InnoDB dovrebbe ora disporre di spazio di registrazione sufficiente per BLOB di dimensioni diverse.

Provaci !!!


Grazie mille per la risposta, ho modificato la mia domanda per aggiungere il mysql.cnffile. Ho fatto come mi hai suggerito, ma ho ancora ricevuto gli avvisi. Posso vedere max_allowed_packetin mysqldumpè solo 16Mb, ma credo che non è la causa. key_buffer_sizeè giusto 16Kbe ancora dovrebbe essere qualcosa con MyISAMe non sto usando il MyISAMmotore di archiviazione nell'applicazione.

Inoltre, per chiunque lo incontri mentre lavora con un server Apache, ho anche dovuto riavviare quel servizio. Grazie mille per questo - ero all'oscuro.
lunedì

1

Dopo aver letto il commento di @ user19292 nel gennaio '16 su questa vecchia domanda, sono passato da 5.7.9 a 5.7.12 e il problema è scomparso.


2
Sto usando 5.7.23 e ho lo stesso problema
Jesus Uzcanga,

1
Lo stesso qui, l'errore esiste con 5.7.26. Nel tuo caso probabilmente l'aggiornamento ripristina anche le configurazioni, quindi questo potrebbe aver risolto il tuo problema.
Sliq,

0

Ho appena trascorso circa 5-6 ore cambiando opzioni e provando diverse versioni di MySQL, ho sempre avuto l'errore.

Penso che sia edider perché:

  • il mio codice PHP non sta chiudendo correttamente la connessione db (è un avvertimento, non un errore) mysql_close()o equivalente.
  • o poiché il server cache / proxy nginx è configurato per chiudere la connessione se il client la chiudeva, il server cache / proxy non attende il server di origine (dove si trova anche mysql).
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.