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 และใช่มีจำนวนมากของชนิดข้อมูลหยด แต่1024 Mbของmax_allowed_packetควรจะเพียงพอในความคิดของฉัน

วิธีหลีกเลี่ยงอื่น ๆ วิธีเอาชนะคำเตือนนี้หรือไม่

แก้ไข:

เพิ่มการตั้งค่าบางอย่างตามคำแนะนำ / คำตอบของ @ Rolando ฉันยังคงได้รับคำเตือนเดิม

config 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 ขนาดใหญ่ ฉันกำลังจิ้งจอก คุณเคยแก้ไขปัญหานี้หรือไม่?
user19292

คำตอบ:


10

ฉันดีใจที่คุณพูดว่าข้อมูลทั้งหมดของคุณคือ InnoDB ดังนั้นฉันจึงสามารถตอบได้ดังนี้: หากmax_allowed_packet maxed out ที่ 1G และคุณยังคงมีปัญหาอยู่มีเพียงสองที่เท่านั้นที่มอง:

  1. innodb_log_buffer_size : ขนาดเป็นไบต์ของบัฟเฟอร์ที่ InnoDB ใช้เพื่อเขียนไปยังล็อกไฟล์บนดิสก์ ค่าเริ่มต้นคือ 8MB บัฟเฟอร์บันทึกขนาดใหญ่ทำให้ธุรกรรมขนาดใหญ่สามารถรันได้โดยไม่จำเป็นต้องเขียนบันทึกลงดิสก์ก่อนทำรายการ ดังนั้นถ้าคุณมีการทำธุรกรรมขนาดใหญ่ทำให้บัฟเฟอร์การบันทึกที่มีขนาดใหญ่กว่าบันทึก I / O ของดิสก์
  2. innodb_log_file_size : ขนาดเป็นไบต์ของแต่ละไฟล์บันทึกในกลุ่มบันทึก ขนาดรวมของไฟล์บันทึกจะต้องน้อยกว่า 4GB ค่าเริ่มต้นคือ 5MB ค่าที่เหมาะสมจะอยู่ในช่วงตั้งแต่ 1MB ถึง 1 / N-th ของขนาดของบัฟเฟอร์พูลโดยที่ N คือจำนวนไฟล์บันทึกในกลุ่ม ยิ่งมีค่ามากขึ้นจำเป็นต้องใช้กิจกรรมการล้างจุดตรวจสอบน้อยลงในบัฟเฟอร์พูลบันทึกดิสก์ I / O แต่ไฟล์บันทึกขนาดใหญ่ก็หมายความว่าการกู้คืนจะช้าลงในกรณีที่เกิดความผิดพลาด

ฉันพูดอะไรบางอย่างประมาณ 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 และมีปัญหาเดียวกัน
Jesus Uzcanga

1
เหมือนกันที่นี่ข้อผิดพลาดอยู่กับ 5.7.26 ในกรณีของคุณการอัพเกรดอาจรีเซ็ตการกำหนดค่าด้วยดังนั้นสิ่งนี้อาจแก้ไขปัญหาของคุณได้
Sliq

0

ฉันใช้เวลาประมาณ 5-6 ชั่วโมงในการเปลี่ยนตัวเลือกและลองใช้ MySQL เวอร์ชันอื่นฉันได้รับข้อผิดพลาดเสมอ

ฉันคิดว่ามันเป็น eider เพราะ:

  • รหัส PHP ของฉันไม่ถูกต้องปิดการเชื่อมต่อฐานข้อมูล (มันเป็นคำเตือนไม่ใช่ข้อผิดพลาด) mysql_close()หรือเทียบเท่า
  • หรือเนื่องจากการกำหนดค่า nginx cache / proxy server เพื่อปิดการเชื่อมต่อหากไคลเอนต์ปิดลงแคช / พร็อกซีเซิร์ฟเวอร์จะไม่รอเซิร์ฟเวอร์ต้นทาง (โดยที่ mysql ก็เป็นเช่นนั้น)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.