Lỗi MySQL 1153 - Có một gói lớn hơn byte 'max_allowed_packet'


430

Tôi đang nhập một kết xuất MySQL và nhận được lỗi sau.

$ mysql foo < foo.sql 
ERROR 1153 (08S01) at line 96: Got a packet bigger than 'max_allowed_packet' bytes

Rõ ràng có các tệp đính kèm trong cơ sở dữ liệu, tạo ra các phần chèn rất lớn.


Đây là trên máy cục bộ của tôi, máy Mac có MySQL 5 được cài đặt từ gói MySQL.

Tôi max_allowed_packetphải thay đổi ở đâu để có thể nhập bãi chứa?

Có điều gì khác tôi nên thiết lập?

Chỉ cần chạy mysql --max_allowed_packet=32M …dẫn đến lỗi tương tự.



@Muleskinner, câu hỏi này đã được đăng 3 năm trước khi bạn đề cập và tôi chỉ ra điều này 4 năm sau bình luận của bạn. : p
tiomno

2
Webyog.com liên kết bị phá vỡ: 404
Pha-trốt

Ở đây , một lỗi tương tự, "Gói cho truy vấn lớn (5526600> 1048576).", Do lỗi nhập mật khẩu, khi kết nối với cơ sở dữ liệu MySQL bằng DataGrip 2016.1 của JetBrains và đã được giải quyết khi được chỉnh sửa (sử dụng đúng mật khẩu tương ứng với người dùng cơ sở dữ liệu MySQL).
nyedidikeke

Câu trả lời:


589

Bạn có thể phải thay đổi nó cho cả máy khách (bạn đang chạy để thực hiện nhập) VÀ mysqld daemon đang chạy và chấp nhận nhập.

Đối với máy khách, bạn có thể chỉ định nó trên dòng lệnh:

mysql --max_allowed_packet=100M -u root -p database < dump.sql

Ngoài ra, thay đổi tệp my.cnf hoặc my.ini trong phần mysqld và đặt:

max_allowed_packet=100M

hoặc bạn có thể chạy các lệnh này trong bảng điều khiển MySQL được kết nối với cùng một máy chủ đó:

set global net_buffer_length=1000000; 
set global max_allowed_packet=1000000000;

(Sử dụng giá trị rất lớn cho kích thước gói.)


Tôi có một máy chủ với 16 GB RAM, có phải là một ý tưởng tồi khi đặt max_allowed_packetthành 100 MB không?
Webnet

11
FYI - nó đã giúp tôi giải quyết một lỗi KHÁC BIỆT - "Máy chủ # 2006 đã biến mất"
itho

37
Xin lưu ý rằng việc sử dụng "set global" hoạt động cho đến khi dịch vụ mysql tiếp theo khởi động lại.
Sẽ cạo râu

2
Bỏ qua "thiết lập toàn cầu" và cuối cùng ";" khi thêm các giá trị này vào tệp my.ini hoặc my.cnf. Ví dụ: "net_buffer_length = 1000000" trong my.conf.
Rustavore

3
Trên CentOS 5, my.cnf được đặt tại
/etc/my.cnf

124

Như michaelpryor đã nói, bạn phải thay đổi nó cho cả máy khách máy chủ mysqld daemon.

Giải pháp của ông cho dòng lệnh máy khách là tốt, nhưng các tệp ini không phải lúc nào cũng thực hiện thủ thuật, tùy thuộc vào cấu hình.

Vì vậy, hãy mở một thiết bị đầu cuối, nhập mysql để nhận lời nhắc mysql và đưa ra các lệnh sau:

set global net_buffer_length=1000000; 
set global max_allowed_packet=1000000000; 

Giữ lời nhắc mysql mở và chạy thực thi SQL dòng lệnh của bạn trên thiết bị đầu cuối thứ hai ..


2
Giải quyết vấn đề cho tôi; quá trình nhập mà tôi đang thực hiện là một lần và tôi không thể dễ dàng thay đổi cấu hình. Điều này đã làm việc tuyệt vời. : D
Rob Howard

39

Điều này có thể được thay đổi trong my.initệp của bạn (trên Windows, nằm trong \ Program Files \ MySQL \ MySQL Server) trong phần máy chủ, ví dụ:

[mysqld]

max_allowed_packet = 10M

5
trên mac, tập tin rõ ràng nằm ở nơi khác.
kch

2
chắc chắn, nhưng cấu hình vẫn ở đâu đó mặc dù tôi không biết chính xác vị trí
GHad

Đối với tôi trong Fedora 20 với MariaDB, việc đặt cài đặt đó ở cuối /etc/my.cnf.d/server.cnf đã thực hiện thủ thuật này. Tôi đã phải khởi động lại dịch vụ tất nhiên ... sudo nano systemctl khởi động lại mariadb.service
Ray Foss

Tệp có nhiều khả năng là "my.cnf" và trên các hệ thống nix, thường là trong / etc / hoặc / usr / local / etc. Khi bạn chỉnh sửa, hãy chắc chắn khởi động lại máy chủ mysql để áp dụng thay đổi.
Chris

17

Re my.cnf trên Mac OS X khi sử dụng MySQL từ bản phân phối gói dmg mysql.com

Theo mặc định, my.cnf không được tìm thấy.

Bạn cần phải sao chép một trong những /usr/local/mysql/support-files/my*.cnfđể /etc/my.cnfvà khởi động lại mysqld. (Bạn có thể làm gì trong ngăn tùy chọn MySQL nếu bạn đã cài đặt nó.)


Cấu hình mặc định thay thế cho OSX dường như là my-Medium.cnf, mặc dù kích thước max_allowed_packet giống nhau trong my-Large.cnf ... cho đến khi bạn bắt đầu thay đổi mọi thứ :)
Chris Burgess

Trong trường hợp của tôi /usrl/local/mysql/my.cnf không hoạt động cho đến khi tôi sao chép nó vào /etc/my.cnf.
VG

14

Trong etc / my.cnf hãy thử thay đổi max_allowed và net_buffer_length thành

max_allowed_packet=100000000
net_buffer_length=1000000 

nếu điều này không hiệu quả thì hãy thử đổi thành

max_allowed_packet=100M
net_buffer_length=100K 

12

Cách khắc phục là tăng max_allowed_packet của MySQL daemon. Bạn có thể làm điều này với một daemon đang chạy bằng cách đăng nhập là Super và chạy các lệnh sau.

# mysql -u admin -p

mysql> set global net_buffer_length=1000000;
Query OK, 0 rows affected (0.00 sec)

mysql> set global max_allowed_packet=1000000000;
Query OK, 0 rows affected (0.00 sec)

Sau đó, để nhập bãi chứa của bạn:

gunzip < dump.sql.gz | mysql -u admin -p database

Phiên bản MySQL nào bạn đang chạy này?
crmpicco 7/10/2015

6

Trên CENTOS 6 /etc/my.cnf, trong phần [mysqld], cú pháp đúng là:

[mysqld]
# added to avoid err "Got a packet bigger than 'max_allowed_packet' bytes"
#
net_buffer_length=1000000 
max_allowed_packet=1000000000
#

4

Sử dụng một max_allowed_packetbiến ban hành một lệnh như

mysql --max_allowed_packet=32M -u root -p database < dump.sql


2
đã thử, không làm việc. toàn bộ bãi chứa trong 272mb, đã cố gắng với tối đa cao hơn thế.
kch

4

Hơi không liên quan đến vấn đề của bạn, vì vậy đây là một cho Google.

Nếu bạn không mysqldump SQL, có thể SQL của bạn bị hỏng.

Tôi vừa gặp lỗi này do vô tình có một chuỗi ký tự không rõ ràng trong mã của tôi. Những ngón tay luộm thuộm xảy ra.

Đó là một thông báo lỗi tuyệt vời để có được một chuỗi chạy, cảm ơn vì MySQL đó!


1
Tôi cũng gặp lỗi này vì SQL bị hỏng. Cụ thể hơn, bảng của tôi có các ràng buộc null và mã của tôi đã CHỌN các giá trị null. Thay vì cho tôi một lỗi thông tin, MySQL đã trả lại max_allowed_packetlỗi. Nếu nó giúp ích cho những người trong tương lai, tôi đã CHỨNG MINH bằng cách sử dụng API gấu trúcdf.to_sql(...)
Alex Petralia

1

Đôi khi loại cài đặt:

max_allowed_packet = 16M

trong my.ini không hoạt động.

Hãy thử xác định my.ini như sau:

set-variable = max_allowed_packet = 32M

hoặc là

set-variable = max_allowed_packet = 1000000000

Sau đó khởi động lại máy chủ:

/etc/init.d/mysql restart

1

Đó là một rủi ro bảo mật để có max_allowed_packetgiá trị cao hơn, vì kẻ tấn công có thể đẩy các gói có kích thước lớn hơn và làm sập hệ thống.

Vì vậy, Giá trị tối ưu của max_allowed_packetđược điều chỉnh và thử nghiệm.

Nó là tốt hơn để thay đổi khi được yêu cầu (sử dụng set global max_allowed_packet = xxx) hơn là để nó là một phần của my.ini hoặc my.conf .


0

Tôi đang làm việc trong một môi trường lưu trữ được chia sẻ và tôi đã lưu trữ một trang web dựa trên Drupal. Tôi không thể chỉnh sửa my.initập tin hoặc my.conftập tin quá.

Vì vậy, tôi đã xóa tất cả các bảng có liên quan Cachevà do đó tôi có thể giải quyết vấn đề này. Tôi vẫn đang tìm kiếm một giải pháp / cách hoàn hảo để xử lý vấn đề này.

Chỉnh sửa - Xóa các bảng đã tạo ra sự cố cho tôi, vì Drupal đang mong đợi rằng các bảng này sẽ tồn tại. Vì vậy, tôi đã làm trống nội dung của các bảng này để giải quyết vấn đề.


0

Lỗi:

LRI 1153 (08S01) ở dòng 6772: Có một gói lớn hơn byte 'max_allowed_packet' Thao tác thất bại với mã thoát 1

TRUY VẤN:

SET GLOBAL max_allowed_packet=1073741824;
SHOW VARIABLES LIKE 'max_allowed_packet'; 

Giá trị tối đa:

Default Value (MySQL >= 8.0.3)  67108864
Default Value (MySQL <= 8.0.2)  4194304
Minimum Value   1024
Maximum Value   1073741824

-1

Đặt max_allowed_packet thành (hoặc nhiều hơn) so với khi bạn kết xuất nó với mysqldump. Nếu bạn không thể làm điều đó, hãy tạo lại bãi chứa với giá trị nhỏ hơn.

Đó là, giả sử bạn đã đổ nó với mysqldump. Nếu bạn đã sử dụng một số công cụ khác, bạn sẽ tự mình làm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.