Cách thay đổi kích thước max_allowed_packet


317

Tôi gặp sự cố với các trường BLOB trong cơ sở dữ liệu MySQL của mình - khi tải lên các tệp lớn hơn khoảng 1MB, tôi gặp lỗi Packets larger than max_allowed_packet are not allowed.

Đây là những gì tôi đã thử:

Trong Trình duyệt truy vấn MySQL, tôi đã chạy một show variables like 'max_allowed_packet'cái cho tôi 1048576.

Sau đó, tôi thực hiện truy vấn set global max_allowed_packet=33554432theo sau show variables like 'max_allowed_packet'- nó mang lại cho tôi 33554432 như mong đợi.

Nhưng khi tôi khởi động lại máy chủ MySQL, nó sẽ quay trở lại 1048576. Tôi đang làm gì sai ở đây?

Câu hỏi thưởng, có thể nén trường BLOB không?


1
Trường BLOB là một đối tượng lớn nhị phân. Nó chỉ là bit. Vì vậy, có, bạn có thể nén nội dung và nó cung cấp các bit khác (và hy vọng là ít hơn) mà bạn lưu trữ trong trường BLOB thay thế. Nó chỉ thay đổi dữ liệu bạn đặt trong đó. Bạn cũng sẽ phải giải nén nội dung BLOB khi bạn cần lại.
Konerak

Ok cảm ơn, đã hy vọng có một tính năng nén tích hợp vào mysql
Muleskinner

Câu trả lời:


407

Thay đổi trong my.inihoặc ~/.my.cnftệp bằng cách bao gồm một dòng dưới [mysqld]hoặc [client]phần trong tệp của bạn:

max_allowed_packet=500M

sau đó khởi động lại dịch vụ MySQL và bạn đã hoàn thành.

Xem tài liệu để biết thêm thông tin.


1
Cảm ơn dường như đang hoạt động mặc dù tôi đã hy vọng điều này có thể xảy ra mà không phải sửa đổi các tập tin ini bằng tay.
Muleskinner

63
Độc giả FYI, đây cũng là giải pháp cho lỗi "MySQL đã biến mất"
djb

1
@Konerak, Ai là người săn mồi?
Pacerier

14
Có vẻ khá vô nghĩa khi đưa ra câu trả lời cho ai đó và sau đó nói với họ rằng họ nên đi kiểm tra Google để tìm câu trả lời. Đặc biệt là, SO luôn chiếm một số kết quả hàng đầu cho bất kỳ câu hỏi liên quan đến lập trình phong nha nào. Nói về lập trình một vòng lặp vô hạn !!! Google> SO> Google> SO> Google> SO, v.v.
Phill Healey

5
Hãy chắc chắn rằng nó ở dưới [mysqld]và không [mysql](rất giống nhau). Chi phí cho tôi một vài phút của headscratching.
Halvor Holsten Strand

225

Biến max_allowed_packet có thể được đặt trên toàn cầu bằng cách chạy truy vấn.

Tuy nhiên, nếu bạn không thay đổi nó trong my.initệp (như dragon112 đã đề xuất), giá trị sẽ được đặt lại khi máy chủ khởi động lại, ngay cả khi bạn đặt nó trên toàn cầu.

Để thay đổi gói tối đa được phép cho mọi người thành 1GB cho đến khi máy chủ khởi động lại:

SET GLOBAL max_allowed_packet=1073741824;

7
Không giúp :(. Nó hiển thị "Truy vấn OK, 0 hàng bị ảnh hưởng (0,00 giây)"
artnikpro

15
@artnikpro Nó hoạt động, "Truy vấn OK, 0 hàng bị ảnh hưởng (0,00 giây)" có thể cảm thấy sai lệch nhưng điều đó là đúng.
AnnTea

10
không làm việc cho tôi. SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'vẫn hiển thị giá trị cũ
Poma

50
Nó hiển thị giá trị cũ vì max_allowed_packet không thay đổi cho các kết nối hiện có. Nếu bạn ngắt kết nối và kết nối lại, bạn sẽ thấy giá trị được cập nhật.
Matt Crinklaw-Vogt

2
Matt Crinklaw-Vogt đã đúng. Nó cần thoát và kết nối lại
makriria

89

Một trong những nhà phát triển cơ sở của tôi đã gặp sự cố khi sửa đổi điều này cho tôi vì vậy tôi nghĩ rằng tôi sẽ mở rộng điều này chi tiết hơn cho người dùng linux:

1) thiết bị đầu cuối mở

2) ssh root @ YOUIP

3) nhập mật khẩu root

4) nano /etc/mysql/my.cnf (nếu lệnh không được nhận ra, hãy thực hiện điều này trước hoặc thử vi sau đó lặp lại: yum cài đặt nano)

5) thêm dòng: max_allowed_packet = 256M (rõ ràng điều chỉnh kích thước cho bất cứ thứ gì bạn cần) trong phần [MYSQLD]. Anh ấy đã mắc lỗi khi đặt nó ở dưới cùng của tập tin trước để nó không hoạt động.

nhập mô tả hình ảnh ở đây

6) Control + O (lưu) rồi ENTER (xác nhận) rồi Control + X (thoát tệp)

7) khởi động lại dịch vụ mysqld

8) Bạn có thể kiểm tra sự thay đổi trong phần biến trên phpmyadmin


điều này thực sự đã được thực hiện trên CentosOS6, tất nhiên tôi đồng ý về việc không sử dụng quyền truy cập root ssh
naw103

@tamasd Một vài bản phân phối GNU / Linux mà tôi đã sử dụng (như Debian 8 và CentOS 6) tạo ra sudo: command not foundhoặc this incident will be reporteddo sudochưa được cài đặt và định cấu hình. Sẽ tốt hơn nếu xả rác câu trả lời này với hướng dẫn thiết lập sudolần đầu tiên?
Damian Yerrick

Không phải root ssh là vấn đề, nhưng mật khẩu đăng nhập là. Tài khoản người dùng có quyền sudo gần như không an toàn như root. Chỉ cần sử dụng xác thực dựa trên khóa SSH.
Martin Schneider

Vấn đề làm thế nào để đăng nhập vào máy là OT, anh ta đã báo cáo đúng trong công thức của mình rằng bạn phải đăng nhập, bằng cách này hay cách khác.
devsmt

41

Tôi nghĩ rằng một số người cũng muốn biết cách tìm tệp my.ini trên PC của bạn. Đối với người dùng windows, tôi nghĩ cách tốt nhất là như sau:

  1. Win + R (phím tắt cho 'run'), nhập services.msc , Enter
  2. Bạn có thể tìm thấy một mục như 'MySQL56', nhấp chuột phải vào nó, chọn thuộc tính
  3. Bạn có thể thấy sth như "D: / Tệp chương trình / MySQL / MySQL Server 5.6 / bin \ mysqld" --defaults-file = "D: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini" MySQL56

Tôi đã nhận được câu trả lời này từ http://bugs.mysql.com/orms.php?id=68516


2
Điều này rất quan trọng trên Windows. Có MySQL là một dịch vụ và đã chỉnh sửa my.ini trong Workbench và câu trả lời này khiến tôi nhận ra rằng MySQL là một dịch vụ sử dụng một my.ini khác sau đó là một dịch vụ mà tôi đã chỉnh sửa trong Workbench.
Robert Niestroj

20

Làm theo tất cả các hướng dẫn, đây là những gì tôi đã làm và làm việc:

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)

Vì vậy, như chúng ta có thể thấy, max_allowed_packet đã được thay đổi bên ngoài từ my.ini.

Hãy rời khỏi phiên và kiểm tra lại:

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)

Kết luận, sau khi SET GLOBAL max_allowed_packet = 1073741824, máy chủ sẽ có max_allowed_packet mới cho đến khi được khởi động lại, như ai đó đã nêu trước đó.


13

Nếu gặp lỗi này trong khi thực hiện sao lưu, max_allowed_packetcó thể được đặt my.cnfđặc biệt cho mysqldump.

[mysqldump]
max_allowed_packet=512M

Tôi liên tục nhận được lỗi này trong khi thực hiện mysqldumpvà tôi không hiểu vì tôi đã đặt phần này ở my.cnfdưới [mysqld]phần. Khi tôi nhận ra tôi có thể đặt nó [mysqldump]và tôi đặt giá trị, các bản sao lưu của tôi đã hoàn thành mà không gặp vấn đề gì.


10

Đối với những người chạy máy chủ mysql ướt

Biểu tượng khay ướt -> 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

Cuộn xuống cuối cho đến khi bạn tìm thấy

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

Thêm dòng pack_size ở giữa

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

Kiểm tra xem nó có hoạt động với truy vấn này không

Select @@global.max_allowed_packet;

5

Lỗi này là do dữ liệu của bạn chứa giá trị lớn hơn sau đó đặt giá trị.

Chỉ cần viết ra max_allowed_packed=500M hoặc bạn có thể tính toán 500 * 1024k và sử dụng thay vì 500M nếu bạn muốn.

Bây giờ chỉ cần khởi động lại MySQL.


2
đối /etc/my.cnfvới phiên bản MySQL hoặc /etc/my.cnf.d/server.cnfcho MariaDB
Evgeny Lebedev

5

Nhiều người trả lời đã phát hiện ra vấn đề và đã đưa ra giải pháp.

Tôi chỉ muốn đề xuất một giải pháp khác, đó là thay đổi giá trị biến Glogal từ bên trong công cụ Mysql Workbench . Đó là lý do NẾU bạn sử dụng Workbench chạy cục bộ trên máy chủ (hoặc thông qua kết nối SSH)

Bạn chỉ cần kết nối với cá thể của bạn và vào menu:

Máy chủ -> Tệp tùy chọn -> Mạng -> max_allowed_packed

Bạn đặt giá trị mong muốn và sau đó bạn cần khởi động lại Dịch vụ MySql .


4

Đối với bất kỳ ai chạy MySQL trên dịch vụ Amazon RDS, thay đổi này được thực hiện thông qua các nhóm tham số . Bạn cần tạo PG mới hoặc sử dụng PG hiện có (không phải mặc định, chỉ đọc).

Bạn nên tìm kiếm max_allowed_packettham số, thay đổi giá trị của nó và sau đó nhấn lưu.

Quay lại trường hợp MySQL của bạn, nếu bạn đã tạo PG mới, bạn nên đính kèm PG vào phiên bản của bạn (bạn có thể cần khởi động lại). Nếu bạn đã thay đổi PG đã được đính kèm với phiên bản của bạn, các thay đổi sẽ được áp dụng mà không cần khởi động lại, đối với tất cả các phiên bản có PG đó được đính kèm.


0

Nếu bạn muốn tải lên hình ảnh hoặc dữ liệu kích thước lớn trong cơ sở dữ liệu. Chỉ cần thay đổi kiểu dữ liệu thành 'BIG BLOB'.


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.