วิธีเปลี่ยนขนาด max_allowed_packet


317

ฉันมีปัญหากับฟิลด์ BLOB ในฐานข้อมูล MySQL ของฉัน - เมื่ออัปโหลดไฟล์ที่มีขนาดใหญ่กว่าประมาณ 1MB ฉันได้รับข้อผิดพลาด Packets larger than max_allowed_packet are not allowed.

นี่คือสิ่งที่ฉันได้ลอง:

ใน MySQL Query Browser ฉันใช้งานได้show variables like 'max_allowed_packet'ซึ่งให้ฉัน 1048576

จากนั้นฉันเรียกใช้คิวรีset global max_allowed_packet=33554432ตามด้วยshow variables like 'max_allowed_packet'- มันให้ฉัน 33554432 ตามที่คาดไว้

แต่เมื่อฉันรีสตาร์ทเซิร์ฟเวอร์ MySQL มันกลับไปที่ 1048576 อย่างน่าอัศจรรย์ฉันทำอะไรผิดที่นี่

คำถามโบนัสเป็นไปได้หรือไม่ที่จะบีบอัดเขตข้อมูล BLOB


1
เขตข้อมูล BLOB เป็น Binary Large OBject มันเป็นเพียงส่วนน้อย ใช่แล้วคุณสามารถบีบอัดเนื้อหาและให้บิตอื่น ๆ (และหวังว่าน้อยกว่า) ที่คุณเก็บไว้ในเขตข้อมูล BLOB แทน มันแค่เปลี่ยนข้อมูลที่คุณใส่เข้าไป คุณจะต้องขยายเนื้อหา BLOB เมื่อคุณต้องการมันอีกครั้ง
Konerak

โอเคขอบคุณหวังว่าจะมีฟีเจอร์บีบอัดใน mysql อยู่
Muleskinner

คำตอบ:


407

เปลี่ยนในmy.iniหรือ~/.my.cnfไฟล์โดยรวมบรรทัดเดียวใต้[mysqld]หรือ[client]ส่วนในไฟล์ของคุณ:

max_allowed_packet=500M

จากนั้นเริ่มบริการ MySQL ใหม่อีกครั้ง

ดูเอกสารประกอบสำหรับข้อมูลเพิ่มเติม


1
ขอบคุณดูเหมือนว่าจะทำงานแม้ว่าฉันหวังว่ามันจะเป็นไปได้โดยไม่ต้องแก้ไขไฟล์ ini ด้วยตนเอง
Muleskinner

63
ผู้อ่าน FYI นี่เป็นวิธีแก้ปัญหาข้อผิดพลาด "MySQL ได้หายไปแล้ว"
djb

1
@ Konerak, ใครคือผู้ล่อลวง?
Pacerier

14
ดูเหมือนจะไม่มีประโยชน์ที่จะให้คำตอบกับใครสักคนแล้วบอกพวกเขาว่าควรไปตรวจสอบคำตอบจาก Google โดยเฉพาะอย่างยิ่งตั้งแต่ SO นั้นมีอยู่เสมอผลลัพธ์หลายด้านสำหรับคำถามที่เกี่ยวข้องกับการเขียนโปรแกรมที่เหมาะสม พูดคุยเกี่ยวกับการเขียนโปรแกรมลูปไม่มีที่สิ้นสุด !!! Google> SO> Google> ดังนั้น> Google> SO และอื่น ๆ
Phill Healey

5
ตรวจสอบให้แน่ใจว่าอยู่ภายใต้[mysqld]และไม่[mysql](คล้ายกันมาก) เสียค่าใช้จ่ายสักเล็กน้อยในการหาหัวผม
Halvor Holsten Strand

225

max_allowed_packetตัวแปรสามารถตั้งค่าได้ทั่วโลกโดยการเรียกใช้แบบสอบถาม

อย่างไรก็ตามหากคุณไม่เปลี่ยนแปลงในmy.iniไฟล์ (ตามที่แนะนำ dragon112) ค่าจะรีเซ็ตเมื่อเซิร์ฟเวอร์รีสตาร์ทแม้ว่าคุณจะตั้งค่าไว้ทั่วโลกก็ตาม

หากต้องการเปลี่ยนแพ็กเก็ตสูงสุดที่อนุญาตสำหรับทุกคนเป็น 1GB จนกว่าเซิร์ฟเวอร์จะรีสตาร์ท:

SET GLOBAL max_allowed_packet=1073741824;

7
ไม่ช่วย :(. จะแสดง "Query OK, 0 แถวที่ได้รับผลกระทบ (0.00 วินาที)"
artnikpro

15
@artnikpro มันใช้งานได้ "Query OK, 0 แถวที่ได้รับผลกระทบ (0.00 วินาที)" อาจทำให้เข้าใจผิด แต่ถูกต้อง
AnnTea

10
ไม่ได้ผลสำหรับฉัน SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'ยังคงแสดงค่าเก่า
Poma

50
มันแสดงค่าเก่าเพราะ max_allowed_packet ไม่เปลี่ยนแปลงสำหรับการเชื่อมต่อที่มีอยู่ หากคุณยกเลิกการเชื่อมต่อและเชื่อมต่ออีกครั้งคุณจะเห็นค่าที่อัปเดตแล้ว
Matt Crinklaw-Vogt

2
Matt Crinklaw-Vogt ถูกต้อง มันต้องการทางออกและเชื่อมต่ออีกครั้ง
makriria

89

หนึ่งในนักพัฒนารุ่นน้องของฉันมีปัญหาในการแก้ไขปัญหานี้ให้ฉันดังนั้นฉันคิดว่าฉันจะขยายรายละเอียดให้ผู้ใช้ linux:

1) เทอร์มินัลเปิด

2) ssh root @ YOURIP

3) ป้อนรหัสผ่านรูท

4) nano /etc/mysql/my.cnf (หากไม่รู้จักคำสั่งให้ทำสิ่งนี้ก่อนหรือลอง vi จากนั้นทำซ้ำ: yum install nano)

5) เพิ่มบรรทัด: max_allowed_packet = 256M (ชัดปรับขนาดสำหรับสิ่งที่คุณต้องการ) ภายใต้ส่วน [MYSQLD] เขาทำผิดพลาดในการวางไว้ที่ด้านล่างของไฟล์ก่อนจึงไม่ทำงาน

ป้อนคำอธิบายรูปภาพที่นี่

6) Control + O (บันทึก) จากนั้นกด ENTER (ยืนยัน) จากนั้นควบคุม + X (ไฟล์ออก)

7) mysqld บริการเริ่มต้นใหม่

8) คุณสามารถตรวจสอบการเปลี่ยนแปลงในส่วนตัวแปรได้ที่ phpmyadmin


สิ่งนี้ทำจริงบน CentosOS6 แน่นอนฉันเห็นด้วยกับการไม่ใช้การเข้าถึงรูท ssh
naw103

@tamasd distros GNU / Linux สองสามตัวที่ฉันใช้ (เช่น Debian 8 และ CentOS 6) ผลิตsudo: command not foundหรือthis incident will be reportedเพราะsudoยังไม่ได้ติดตั้งและกำหนดค่า จะเป็นการดีกว่าหากทิ้งคำตอบนี้ไว้พร้อมคำแนะนำในการตั้งค่าsudoเป็นครั้งแรก
Damian Yerrick

ไม่ใช่ root ssh เป็นปัญหา แต่การล็อกอินด้วยรหัสผ่านคือ บัญชีผู้ใช้ที่มีสิทธิ์ sudo เกือบจะไม่ปลอดภัยเหมือนรูท เพียงใช้การรับรองความถูกต้องตามคีย์ SSH
Martin Schneider

เรื่องของวิธีการเข้าสู่เครื่องเป็น OT เขารายงานอย่างถูกต้องในสูตรของเขาว่าคุณต้องเข้าสู่ระบบไม่ทางใดก็ทางหนึ่ง
devsmt

41

ฉันคิดว่าบางคนต้องการทราบวิธีค้นหาไฟล์ my.ini บนพีซีของคุณ สำหรับผู้ใช้ windows ฉันคิดว่าวิธีที่ดีที่สุดมีดังนี้:

  1. Win + R (ทางลัดสำหรับ 'เรียกใช้') พิมพ์services.msc , Enter
  2. คุณสามารถค้นหารายการเช่น 'MySQL56' คลิกขวาบนมันเลือก คุณสมบัติ
  3. คุณสามารถดู sth เช่น "D: / ไฟล์โปรแกรม / MySQL / MySQL เซิร์ฟเวอร์ 5.6 / bin \ mysqld" --defaults-file = "D: \ ProgramData \ เซิร์ฟเวอร์ MySQL \ MySQL \ MySQL 5.6 \ my.ini" MySQL56

ฉันได้รับคำตอบนี้จากhttp://bugs.mysql.com/bug.php?id=68516


2
สิ่งนี้สำคัญสำหรับ Windows หากมี MySQL เป็นบริการและแก้ไข my.ini ใน Workbench และคำตอบนี้ทำให้ฉันรู้ว่า MySQL เป็นบริการที่ใช้ my.ini อื่นจากนั้นเป็นคนที่ฉันแก้ไขใน Workbench
Robert Niestroj

20

ทำตามคำแนะนำทั้งหมดนี่คือสิ่งที่ฉันทำและทำงาน:

mysql> SELECT CONNECTION_ID();//This is my ID for this session.
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              20 |
+-----------------+
1 row in set (0.00 sec)

mysql> select @max_allowed_packet //Mysql do not found @max_allowed_packet
+---------------------+
| @max_allowed_packet |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet; //That is better... I have max_allowed_packet=32M inside my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                    33554432 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> **SET GLOBAL max_allowed_packet=1073741824**; //Now I'm changing the value.
Query OK, 0 rows affected (0.00 sec)

mysql> select @max_allowed_packet; //Mysql not found @max_allowed_packet
+---------------------+
| @max_allowed_packet |
+---------------------+
| NULL                |
+---------------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The new value. And I still have max_allowed_packet=32M inisde my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                  1073741824 |
+-----------------------------+
1 row in set (0.00 sec)

ดังนั้นอย่างที่เราเห็น max_allowed_packet ได้ถูกเปลี่ยนจาก my.ini ภายนอก

ให้ออกจากเซสชั่นและตรวจสอบอีกครั้ง:

mysql> exit
Bye

C:\Windows\System32>mysql -uroot -pPassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 21
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CONNECTION_ID();//This is my ID for this session.
+-----------------+
| CONNECTION_ID() |
+-----------------+
|              21 |
+-----------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The new value still here and And I still have max_allowed_packet=32M inisde my.ini
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                  1073741824 |
+-----------------------------+
1 row in set (0.00 sec)

Now I will stop the server
2016-02-03 10:28:30 - Server is stopped

mysql> SELECT CONNECTION_ID();
ERROR 2013 (HY000): Lost connection to MySQL server during query


Now I will start the server
2016-02-03 10:31:54 - Server is running


C:\Windows\System32>mysql -uroot -pPassword
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.6.26-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
|               9 |
+-----------------+
1 row in set (0.00 sec)

mysql> Select @@global.max_allowed_packet;//The previous new value has gone. Now I see what I have inside my.ini again.
+-----------------------------+
| @@global.max_allowed_packet |
+-----------------------------+
|                    33554432 |
+-----------------------------+
1 row in set (0.00 sec)

สรุปหลังจาก SET GLOBAL max_allowed_packet = 1073741824 เซิร์ฟเวอร์จะมี max_allowed_packet ใหม่จนกว่าจะรีสตาร์ทตามที่มีคนระบุไว้ก่อนหน้านี้


13

หากได้รับข้อผิดพลาดนี้ในขณะที่ประสิทธิภาพการสำรองข้อมูลmax_allowed_packetที่สามารถตั้งค่าในโดยเฉพาะอย่างยิ่งสำหรับmy.cnfmysqldump

[mysqldump]
max_allowed_packet=512M

ผมเก็บไว้รับข้อผิดพลาดนี้ในขณะที่การดำเนินการmysqldumpและผมไม่เข้าใจเพราะผมมีชุดนี้ในmy.cnfภายใต้[mysqld]ส่วน เมื่อฉันพบว่าฉันสามารถตั้งค่า[mysqldump]และฉันตั้งค่าการสำรองข้อมูลของฉันเสร็จสมบูรณ์โดยไม่มีปัญหา


10

สำหรับผู้ที่ใช้เซิร์ฟเวอร์ mysql wamp

ไอคอนถาด Wamp -> MySql -> my.ini

[wampmysqld]
port        = 3306
socket      = /tmp/mysql.sock
key_buffer_size = 16M
max_allowed_packet = 16M        // --> changing this wont solve
sort_buffer_size = 512K

เลื่อนลงไปจนจบจนกว่าคุณจะพบ

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

เพิ่มบรรทัดของpacket_sizeระหว่างนั้น

[mysqld]
port=3306
max_allowed_packet = 16M
explicit_defaults_for_timestamp = TRUE

ตรวจสอบว่ามันทำงานกับแบบสอบถามนี้

Select @@global.max_allowed_packet;

5

ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากข้อมูลของคุณมีค่าที่ใหญ่กว่า

เพียงแค่เขียนmax_allowed_packed=500M หรือคุณสามารถคำนวณ 500 * 1024k และใช้มันแทน 500M ถ้าคุณต้องการ

ตอนนี้เพิ่งรีสตาร์ท MySQL


2
ไป/etc/my.cnfเช่น MySQL, หรือ/etc/my.cnf.d/server.cnfสำหรับ MariaDB
Evgeny เดฟส์

5

ผู้ตอบหลายคนเห็นปัญหาและให้แนวทางแก้ไขแล้ว

ฉันแค่ต้องการแนะนำวิธีแก้ไขปัญหาอื่นซึ่งกำลังเปลี่ยนค่าตัวแปร Glogal จากภายในเครื่องมือ Mysql Workbenchมีเครื่องมือปรับแต่ง นั่นคือหลักสูตรถ้าคุณใช้ Workbench ที่ทำงานอยู่บนเซิร์ฟเวอร์ (หรือผ่านการเชื่อมต่อ SSH)

คุณเพิ่งเชื่อมต่อกับอินสแตนซ์ของคุณและไปที่เมนู:

เซิร์ฟเวอร์ -> ไฟล์ตัวเลือก -> ระบบเครือข่าย -> max_allowed_packed

คุณตั้งค่าที่ต้องการแล้วคุณต้องเริ่มบริการ MySqlใหม่


4

สำหรับทุกคนที่ใช้ MySQL บนบริการ Amazon RDS การเปลี่ยนแปลงนี้กระทำผ่านกลุ่มพารามิเตอร์กลุ่มพารามิเตอร์คุณต้องสร้าง PG ใหม่หรือใช้อันที่มีอยู่ (นอกเหนือจากค่าเริ่มต้นซึ่งเป็นแบบอ่านอย่างเดียว)

คุณควรค้นหาmax_allowed_packetพารามิเตอร์เปลี่ยนค่าของมันแล้วกดบันทึก

ย้อนกลับไปในอินสแตนซ์ MySQL ของคุณหากคุณสร้าง PG ใหม่คุณควรแนบ PG กับอินสแตนซ์ของคุณ (คุณอาจต้องรีบูต) หากคุณเปลี่ยน PG ที่แนบมากับอินสแตนซ์ของคุณแล้วการเปลี่ยนแปลงจะถูกนำไปใช้โดยไม่ต้องรีบูตให้อินสแตนซ์ทั้งหมดของคุณที่ติด PG นั้น


0

หากคุณต้องการอัปโหลดภาพขนาดใหญ่หรือข้อมูลในฐานข้อมูล 'BIG BLOB'เพียงแค่เปลี่ยนชนิดของข้อมูลที่จะ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.