MySQL: Kesalahan membaca paket komunikasi

14

Saya mendapatkan peringatan ini di mysql,

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

Saya telah melalui beberapa topik di google dan menurut beberapa saran saya meningkatkan max_allowed_packetdari 128 to 512 to 1024masih perilaku yang sama.

Saya menggunakan Drupal 7, dan ya ada banyak jenis gumpalan data, tetapi 1024 Mbdari max_allowed_packetharus cukup menurut saya.

Adakah solusi lain untuk mengatasi peringatan ini?

EDIT:

Menambahkan beberapa pengaturan sebagai saran / jawaban @ Rolando, saya masih mendapatkan peringatan yang sama.

Konfigurasi mysql saya terlihat seperti ini:

[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

Aplikasi saya hanya menggunakan InnoDB, tetapi ada beberapa database seperti mysql, yang datang dengan instalasi standar mysql hanya yang menggunakan tipe mesin MyISAM, saya kira itu seharusnya tidak menjadi perhatian saya.

Seperti yang Anda lihat, saya juga memiliki replikasi, peringatannya juga sama di server yang direplikasi, yang konfigurasinya sama dengan ini.


sumber
Apakah semua meja Anda InnoDB?
RolandoMySQLDBA
@RolandoMySQLDBA, Hai, Ya semua tabel adalah innodb, saya lakukan sesuai dengan jawaban Anda dalam beberapa pertanyaan lain seperti ini di situs web ini, tapi saya masih mendapatkan peringatan.
@RolandoMySQLDBA, saya telah mengedit pertanyaan saya dan melakukan apa yang Anda sarankan, saya masih mendapatkan peringatan itu. Saya punya mysql.cnf di sini, dapatkah Anda melihatnya, saya mungkin kehilangan sesuatu
Saya mulai mendapatkan kesalahan ini pada MySQL 5.5.35 dengan Drupal 6. Saya tidak pernah mengerti masalah tetapi ia pergi untuk meningkatkan ke 5.7.7. Sekarang telah kembali dengan 5.7.9. Saya telah mengisolasi kueri sisipan (kurang dari 6000 karakter teks) yang berhasil pada 5.7.7 tetapi menyebabkan batal pada 5.7.9. Itu hanya gagal ketika dijalankan dari jarak jauh, bukan secara lokal. Jadi, klien yang sama, kedua versi server berjalan berdampingan di mesin yang sama, sql_mode yang sama, rangkaian karakter yang sama, max_allowed_packet besar. Saya rubah. Apakah Anda pernah menyelesaikan ini?
user19292

Jawaban:

10

Saya senang Anda mengatakan semua data Anda adalah InnoDB sehingga saya dapat menjawab sebagai berikut: Jika max_allowed_packet maks. 1G dan Anda masih mengalami masalah, hanya ada dua tempat untuk dilihat:

  1. innodb_log_buffer_size : Ukuran dalam byte buffer yang digunakan InnoDB untuk menulis ke file log pada disk. Nilai default adalah 8MB. Buffer log yang besar memungkinkan transaksi besar untuk berjalan tanpa perlu menulis log ke disk sebelum transaksi dilakukan. Jadi, jika Anda memiliki transaksi besar, membuat buffer log lebih besar menghemat disk I / O.
  2. innodb_log_file_size : Ukuran dalam byte dari setiap file log dalam grup log. Ukuran gabungan file log harus kurang dari 4GB. Nilai default adalah 5MB. Nilai yang masuk akal berkisar dari 1MB hingga 1 / N-th dari ukuran buffer pool, di mana N adalah jumlah file log dalam grup. Semakin besar nilainya, semakin sedikit aktivitas flush checkpoint diperlukan dalam buffer pool, menghemat disk I / O. Tetapi file log yang lebih besar juga berarti pemulihan lebih lambat jika terjadi kerusakan.

Saya membahas sekitar 2 tahun yang lalu

SARAN

Anda perlu menambah log transaksi InnoDB . Berikut adalah langkah-langkah untuk meningkatkan innodb_log_buffer_size dan innodb_log_file_size dengan aman :

Langkah 01: Tambahkan ini ke /etc/my.cnf

[mysqld]
innodb_log_buffer_size = 32M
innodb_log_file_size = 2047M

Langkah 02: Jalankan ini di mysql

mysql> SET GLOBAL innodb_fast_shutdown = 0;

Langkah 03: Matikan mysql

service mysql stop

Langkah 04: Pindahkan log lama ke samping

mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak

Langkah 05: Mulai mysql

service mysql start

Itu dia.

Infrastruktur InnoDB sekarang harus memiliki ruang logging yang cukup untuk berbagai ukuran BLOB.

Cobalah !!!

RolandoMySQLDBA
sumber
Terima kasih banyak atas tanggapannya, saya telah mengedit pertanyaan saya untuk menambahkan mysql.cnffile. Saya melakukan seperti yang Anda sarankan, tetapi masih mendapatkan peringatan. Aku bisa melihat max_allowed_packetdi mysqldumphanya 16Mbtapi saya rasa itu tidak penyebabnya. key_buffer_sizehanya 16Kbdan sekali lagi itu harus sesuatu dengan MyISAMdan saya tidak menggunakan MyISAMmesin penyimpanan dalam aplikasi.
Juga - bagi siapa saja yang mengalami ini saat bekerja dengan server apache, saya juga harus memulai kembali layanan itu. Terima kasih banyak untuk ini - saya tidak tahu apa-apa.
Makan
1

Setelah membaca komentar @ user19292 di Jan '16 pada pertanyaan lama ini, saya memutakhirkan dari 5.7.9 ke 5.7.12 dan masalahnya hilang.

IsraelWebDev
sumber
2
Saya menggunakan 5.7.23 dan memiliki masalah yang sama
Jesus Uzcanga
1
Sama di sini, ada kesalahan dengan 5.7.26. Dalam kasus Anda, peningkatan mungkin juga mengatur ulang konfigurasi, jadi ini mungkin telah memecahkan masalah Anda.
Sliq
0

Saya hanya menghabiskan waktu sekitar 5-6 jam untuk mengubah opsi dan mencoba berbagai versi MySQL, saya selalu mendapatkan kesalahan.

Saya pikir ini eider karena:

  • kode PHP saya tidak benar menutup koneksi db (itu adalah peringatan, bukan kesalahan), mysql_close()atau setara.
  • atau karena nginx cache / proxy server dikonfigurasikan untuk menutup koneksi jika klien menutupnya, cache / proxy server tidak menunggu server asal (di mana mysql juga berada).
adrianTNT
sumber