Cara mengubah ukuran max_allowed_packet

317

Saya mengalami masalah dengan bidang BLOB di database MySQL saya - ketika mengunggah file yang lebih besar dari kira-kira 1MB saya mendapatkan kesalahan Packets larger than max_allowed_packet are not allowed.

Inilah yang saya coba:

Di MySQL Query Browser saya menjalankan show variables like 'max_allowed_packet'yang memberi saya 1048576.

Lalu saya menjalankan kueri set global max_allowed_packet=33554432diikuti oleh show variables like 'max_allowed_packet'- itu memberi saya 33554432 seperti yang diharapkan.

Tetapi ketika saya me-restart server MySQL, ajaibnya kembali ke 1048576. Apa yang saya lakukan salah di sini?

Pertanyaan bonus, apakah mungkin untuk mengompres bidang BLOB?

Muleskinner
sumber
1
Bidang BLOB adalah Binary Large OBject. Itu hanya bit. Jadi ya, Anda bisa mengompres isinya, dan itu memberikan bit lain (dan mudah-mudahan, lebih sedikit) yang Anda simpan di bidang BLOB. Itu hanya mengubah data yang Anda masukkan ke dalamnya. Anda harus mendekompresi konten BLOB saat Anda membutuhkannya lagi.
Konerak
Ok terima kasih, berharap fitur kompres membangun ke mysql ada
Muleskinner

Jawaban:

407

Ubah file my.iniatau ~/.my.cnfdengan memasukkan satu baris di bawah [mysqld]atau [client]bagian dalam file Anda:

max_allowed_packet=500M

kemudian restart layanan MySQL dan Anda selesai.

Lihat dokumentasi untuk informasi lebih lanjut.

Manuel
sumber
1
Terima kasih tampaknya berfungsi meskipun saya berharap ini akan mungkin tanpa harus memodifikasi file ini secara manual.
Muleskinner
63
Pembaca FYI, ini juga solusi untuk kesalahan "MySQL telah hilang"
djb
1
@Konerak, Siapa yang diejek?
Pacerier
14
Tampaknya tidak ada gunanya memberi seseorang jawaban dan kemudian memberi tahu mereka bahwa mereka harus memeriksa Google untuk mendapatkan jawaban. Terutama karena, SO selalu menempati beberapa hasil teratas untuk setiap pertanyaan terkait pemrograman yang layak. Bicara tentang pemrograman loop tak terbatas !!! Google> SO> Google> SO> Google> SO dan sebagainya.
Phill Healey
5
Pastikan berada di bawah [mysqld]dan tidak [mysql](sangat mirip). Habiskan biaya beberapa menit untuk headscratching.
Halvor Holsten Strand
225

The max_allowed_packet variabel dapat diatur secara global dengan menjalankan query.

Namun, jika Anda tidak mengubahnya dalam my.inifile (seperti yang disarankan dragon112), nilai akan diatur ulang ketika server restart, bahkan jika Anda mengaturnya secara global.

Untuk mengubah paket maksimum yang dibolehkan untuk semua orang menjadi 1GB hingga server memulai ulang:

SET GLOBAL max_allowed_packet=1073741824;
TehShrike
sumber
7
Tidak membantu :(. Menampilkan "Kueri OK, 0 baris terpengaruh (0,00 dtk)"
artnikpro
15
@artnikpro Tidak berfungsi, "Kueri OK, 0 baris yang terpengaruh (0,00 dtk)" mungkin terasa menyesatkan tetapi benar.
AnnTea
10
tidak bekerja untuk saya. SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'masih menunjukkan nilai lama
Poma
50
Ini menunjukkan nilai lama karena max_allowed_packet tidak berubah untuk koneksi yang ada. Jika Anda memutuskan dan menghubungkan kembali Anda akan melihat nilai yang diperbarui.
Matt Crinklaw-Vogt
2
Matt Crinklaw-Vogt benar. Perlu keluar dan terhubung lagi
makriria
89

Salah satu pengembang junior saya mengalami masalah dalam memodifikasi ini untuk saya jadi saya pikir saya akan memperluas ini secara lebih rinci untuk pengguna linux:

1) terminal terbuka

2) ssh root @ YOURIP

3) masukkan kata sandi root

4) nano /etc/mysql/my.cnf (jika perintah tidak dikenali lakukan ini dulu atau coba vi lalu ulangi: yum install nano)

5) tambahkan baris: max_allowed_packet = 256M (jelas sesuaikan ukuran untuk apa pun yang Anda butuhkan) di bawah bagian [MYSQLD]. Dia membuat kesalahan dengan meletakkannya di bagian bawah file terlebih dahulu sehingga tidak berfungsi.

masukkan deskripsi gambar di sini

6) Kontrol + O (simpan) lalu ENTER (konfirmasi) lalu Kontrol + X (file keluar)

7) service mysqld restart

8) Anda dapat memeriksa perubahan di bagian variabel di phpmyadmin

naw103
sumber
ini sebenarnya dilakukan pada CentosOS6, saya tentu saja setuju untuk tidak menggunakan akses root ssh
naw103
@tamasd Beberapa distro GNU / Linux yang saya gunakan (seperti Debian 8 dan CentOS 6) menghasilkan sudo: command not foundatau this incident will be reportedkarena sudobelum diinstal dan dikonfigurasi. Akankah lebih baik untuk mengotori jawaban ini dengan instruksi pengaturan sudountuk pertama kalinya?
Damian Yerrick
bukan root ssh masalahnya, tapi kata sandi login. Akun pengguna dengan izin sudo hampir tidak aman seperti halnya root. Cukup gunakan otentikasi berbasis kunci SSH.
Martin Schneider
soal cara masuk ke mesin adalah PL, ia dengan benar melaporkan dalam resepnya bahwa Anda harus masuk, dengan cara apa pun.
devsmt
41

Saya pikir beberapa juga ingin tahu bagaimana menemukan file my.ini di PC Anda. Untuk pengguna windows, saya pikir cara terbaik adalah sebagai berikut:

  1. Menangkan + R (pintasan untuk 'lari'), ketik services.msc , Enter
  2. Anda dapat menemukan entri seperti 'MySQL56', klik kanan padanya, pilih properti
  3. Anda bisa melihat sth seperti "D: / Program Files / MySQL / MySQL Server 5.6 / bin \ mysqld" --defaults-file = "D: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini" MySQL56

Saya mendapat jawaban ini dari http://bugs.mysql.com/bug.php?id=68516

fstang
sumber
2
Ini penting di Windows. Memiliki MySQL sebagai layanan dan mengedit my.ini di Workbench dan jawaban ini membuat saya menyadari bahwa MySQL sebagai layanan menggunakan my.ini lainnya maka yang saya edit di Workbench.
Robert Niestroj
20

Mengikuti semua instruksi, inilah yang saya lakukan dan kerjakan:

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)

Jadi, seperti yang bisa kita lihat, max_allowed_packet telah diubah di luar dari my.ini.

Mari kita tinggalkan sesi dan periksa lagi:

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)

Kesimpulannya, setelah SET GLOBAL max_allowed_packet = 1073741824, server akan memiliki max_allowed_packet baru sampai dimulai kembali, seperti yang dinyatakan seseorang sebelumnya.

zwitterion
sumber
13

Jika mendapatkan kesalahan ini saat melakukan pencadangan, max_allowed_packetdapat diatur my.cnfuntuk khususnya mysqldump.

[mysqldump]
max_allowed_packet=512M

Saya terus mendapatkan kesalahan ini saat melakukan a mysqldumpdan saya tidak mengerti karena saya memiliki set ini di my.cnfbawah [mysqld]bagian. Setelah saya tahu saya bisa mengaturnya [mysqldump]dan saya mengatur nilainya, backup saya selesai tanpa masalah.

xpros
sumber
10

Bagi mereka yang menjalankan wamp mysql server

Ikon Wamp tray -> 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

Gulir ke bawah sampai akhir sampai kamu menemukan

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

Tambahkan baris packet_size di antaranya

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

Periksa apakah itu berfungsi dengan permintaan ini

Select @@global.max_allowed_packet;
Sayka
sumber
5

Kesalahan ini terjadi karena data Anda mengandung lebih besar dari nilai yang ditetapkan.

Tuliskan saja max_allowed_packed=500M atau Anda dapat menghitung itu 500 * 1024k dan menggunakannya bukan 500 juta jika Anda mau.

Sekarang baru restart MySQL.

Suresh
sumber
2
untuk /etc/my.cnfuntuk contoh MySQL, atau /etc/my.cnf.d/server.cnfuntuk MariaDB
Evgeny Lebedev
5

Banyak dari para penjawab melihat masalah itu dan sudah memberikan solusinya.

Saya hanya ingin menyarankan solusi lain, yang mengubah nilai variabel Glogal dari dalam alat Mysql Workbench . Itu tentu saja JIKA Anda menggunakan Workbench berjalan secara lokal di server (atau melalui koneksi SSH)

Anda cukup terhubung ke instance Anda dan masuk ke menu:

Server -> File Pilihan -> Jaringan -> max_allowed_packed

Anda menetapkan nilai yang diinginkan dan kemudian Anda perlu me - restart Layanan MySql .

bu
sumber
4

Bagi siapa pun yang menjalankan layanan MySQL di Amazon RDS, perubahan ini dilakukan melalui grup parameter . Anda perlu membuat PG baru atau menggunakan yang sudah ada (selain default, yang hanya baca).

Anda harus mencari max_allowed_packetparameter, mengubah nilainya, dan kemudian tekan save.

Kembali ke instance MySQL Anda, jika Anda membuat PG baru, Anda harus melampirkan PG ke instance Anda (Anda mungkin perlu reboot). Jika Anda mengubah PG yang sudah terpasang ke instance Anda, perubahan akan diterapkan tanpa reboot, ke semua instance Anda yang memiliki PG yang terpasang.

SebaGra
sumber
0

Jika Anda ingin mengunggah gambar atau data berukuran besar dalam basis data. Ubah saja tipe data menjadi 'BIG BLOB'.

Vishal J
sumber
0

atur global max_allowed_packet = 10000000000;

Vishal Sheth
sumber