Max_allowed_packet boyutu nasıl değiştirilir?


317

MySQL veritabanımdaki BLOB alanları ile ilgili bir sorun yaşıyorum - yaklaşık 1 MB'den büyük dosyalar yüklerken bir hata alıyorum Packets larger than max_allowed_packet are not allowed.

İşte ne denedim:

MySQL Sorgu Tarayıcısında show variables like 'max_allowed_packet'bana 1048576 verdi bir koştu .

Sonra sorguyu yürütmek set global max_allowed_packet=33554432takip show variables like 'max_allowed_packet'- bana 33554432 beklendiği gibi verir.

Ama MySQL sunucusunu yeniden başlattığımda, sihirli bir şekilde 1048576'ya dönüyor. Burada neyi yanlış yapıyorum?

Bonus soru, bir BLOB alanını sıkıştırmak mümkün mü?


1
BLOB alanı İkili Büyük Nesne'dir. Sadece bir parça. Yani evet, içeriği sıkıştırabilirsiniz ve bunun yerine BLOB alanında depoladığınız diğer (ve umarım daha az) bitler verir. Sadece içine koyduğunuz verileri değiştirir. Tekrar ihtiyaç duyduğunuzda BLOB içeriğini de açmanız gerekir.
Konerak

Tamam teşekkürler, mysql içine bir sıkıştırma özelliği inşa etmeyi ummuştu
Muleskinner

Yanıtlar:


407

Değişim my.iniveya ~/.my.cnftek altındaki satır ekleyerek dosyası [mysqld]ya [client]da dosyada bölümü:

max_allowed_packet=500M

sonra MySQL hizmetini yeniden başlatın ve işiniz bitti.

Daha fazla bilgi için belgelere bakın .


1
Düz-se bile ben ini dosyalarını elle değiştirmek zorunda kalmadan bu mümkün olacağını umuyordum teşekkürler çalışıyor gibi görünüyor.
Muleskinner

63
FYI okuyucular, bu da "MySQL gitti" hatası için bir çözümdür
djb

1
@Konerak, Alaycı kimdi?
Pacerier

14
Birisine bir cevap vermek ve sonra bir cevap için Google'ı kontrol etmeleri gerektiğini söylemek oldukça anlamsız görünüyor. Özellikle SO, her zaman iyi bir programlama ile ilgili soru için en iyi sonuçların birkaçını işgal eder. Sonsuz bir döngü programlama hakkında konuşun !!! Google> SO> Google> SO> Google> SO vb.
Phill Healey

5
Altında olduğundan [mysqld]ve olmadığından emin olun [mysql](çok benzer). Bana birkaç dakika kaşıma mal oldu.
Halvor Holsten Strand

225

Max_allowed_packet değişken bir sorgu çalıştırarak genel olarak ayarlanabilir.

Ancak, my.inidosyayı dosyada değiştirmezseniz (dragon112'nin önerdiği gibi), global olarak ayarlasanız bile sunucu yeniden başlatıldığında değer sıfırlanır.

Sunucu yeniden başlatılana kadar herkes için izin verilen maksimum paketi 1 GB olarak değiştirmek için:

SET GLOBAL max_allowed_packet=1073741824;


15
@artnikpro Çalışıyor, "Sorgu Tamam, 0 satır etkilenen (0,00 sn)" yanıltıcı gelebilir, ancak doğru.
AnnTea

10
benim için çalışmıyor. SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'hala eski değeri gösteriyor
Poma

50
Eski bağlantıyı gösterir çünkü max_allowed_packet varolan bağlantılar için değişmez. Bağlantıyı kesip yeniden bağlanırsanız güncellenen değeri görürsünüz.
Matt Crinklaw-Vogt

2
Matt Crinklaw-Vogt haklı.
Çıkması

89

Genç geliştiricilerimden biri bunu benim için değiştirirken bir sorun yaşıyordu, bu yüzden bunu linux kullanıcıları için daha ayrıntılı olarak genişleteceğimi düşündüm:

1) açık terminal

2) ssh kök @ YOURIP

3) root şifresini girin

4) nano /etc/mysql/my.cnf (komut tanınmazsa önce bunu yapın veya vi'yı deneyin, sonra tekrarlayın: yum install nano)

5) [MYSQLD] bölümü altında satırı ekleyin: max_allowed_packet = 256M (ihtiyacınız olan her şey için boyutu ayarlayın). Önce dosyanın altına koyarak bir hata yaptı, bu yüzden işe yaramadı.

resim açıklamasını buraya girin

6) Control + O (kaydet) sonra ENTER (onayla) sonra Control + X (çıkış dosyası)

7) Hizmet MySQL Yeniden Başlatma

8) phpmyadmin değişkenleri bölümündeki değişikliği kontrol edebilirsiniz


Bu aslında CentosOS6 üzerinde yapıldı, tabii ki root ssh erişimini kullanmama konusunda katılıyorum
naw103

@tamasd Kullandığım (Debian 8 ve CentOS 6 gibi) sudo: command not foundveya this incident will be reportedher ikisi sudode yüklü ve yapılandırılmamış olduğu için birkaç GNU / Linux dağıtımı . Bu cevabı sudoilk kurulum talimatları ile doldurmak daha iyi olur mu?
Damian Yerrick

sorun kök ssh değil, şifre girişidir. Sudo iznine sahip bir kullanıcı hesabı, kök kadar güvenli değildir. Sadece SSH anahtar tabanlı kimlik doğrulaması kullanın.
Martin Schneider

makineye nasıl giriş yapılacağı OT'dir, haklı olarak tarifinde bir şekilde oturum açmanız gerektiğini bildirdi.
devsmt

41

Bazılarının da my.ini dosyasını PC'nizde nasıl bulacağınızı bilmek isteyeceğini düşünüyorum. Windows kullanıcıları için bence en iyi yol aşağıdaki gibidir:

  1. Win + R ('run' kısayolu), services.msc , Enter yazın
  2. 'MySQL56' gibi bir giriş bulabilirsiniz, üzerine sağ tıklayın, özellikleri seçin
  3. "D: / Program Files / MySQL / MySQL Server 5.6 / bin \ mysqld" - defaults-file = "D: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini" MySQL56

Bu yanıtı http://bugs.mysql.com/bug.php?id=68516 adresinden aldım.


2
Bu Windows için önemlidir. Bir hizmet olarak MySQL vardı ve Workbench içinde my.ini düzenledi ve bu cevap bana bir hizmet olarak MySQL başka bir my.ini Workbench içinde düzenlediğim kullandığını fark etti.
Robert Niestroj

20

Tüm talimatları izleyerek, yaptım ve çalıştım:

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)

Gördüğümüz gibi, max_allowed_packet my.ini dışında değiştirildi.

Oturumu terk edip tekrar kontrol edelim:

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)

Sonuç olarak, SET GLOBAL max_allowed_packet = 1073741824'ten sonra, sunucu daha önce belirtildiği gibi yeniden başlatılıncaya kadar yeni max_allowed_packet'e sahip olacaktır.


13

Bir yedekleme yaparken bu hatayı alıyorsanız, özellikle için max_allowed_packetayarlanabilir .my.cnfmysqldump

[mysqldump]
max_allowed_packet=512M

Bir hata yaparken bu hatayı almaya devam ettim mysqldumpve anlamadım çünkü bölümün my.cnfaltında bu set vardı [mysqld]. [mysqldump]Bunu ayarlayabildiğimi ve değeri ayarladığımı anladıktan sonra , yedeklemelerim sorunsuz bir şekilde tamamlandı.


10

Wamp MySQL sunucusu çalıştıranlar için

Wamp tepsisi Simge -> 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

U bulana kadar sonuna kadar aşağı kaydırın

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

Çizgisini ekleyin packet_size arasında

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

Bu sorgu ile çalışıp çalışmadığını kontrol edin

Select @@global.max_allowed_packet;

5

Bu hata, verileriniz ayarlanandan daha büyük değer içerdiğinden gelir.

Bunu yazın max_allowed_packed=500M veya 500 * 1024k değerini hesaplayın ve isterseniz 500M yerine kullanın.

Şimdi MySQL'i yeniden başlatın.


2
için /etc/my.cnfMySQL, veya mesela /etc/my.cnf.d/server.cnfmariadb için
Evgeny Lebedev

5

Yanıtlayanların çoğu sorunu tespit etti ve zaten çözümü verdi.

Sadece Mysql Workbench aracından Glogal değişken değerini değiştiren başka bir çözüm önermek istiyorum . Tabii ki sunucuda yerel olarak çalışan Workbench kullanıyorsanız (veya SSH bağlantısıyla)

Sadece örneğinize bağlanın ve menüye gidin:

Sunucu -> Seçenekler Dosyası -> Ağ -> max_allowed_packed

İstediğiniz değeri ayarladıktan sonra MySql Hizmetini yeniden başlatmanız gerekir .


4

Amazon RDS hizmetinde MySQL çalıştıran herkes için bu değişiklik parametre grupları aracılığıyla yapılır . Yeni bir PG oluşturmanız veya var olan bir PG'yi kullanmanız gerekir (varsayılan değer dışında, salt okunur).

max_allowed_packetParametreyi aramalı , değerini değiştirmeli ve ardından kaydet'e basmalısınız.

MySQL örneğinizde, yeni bir PG oluşturduysanız, PG'yi örneğinize eklemeniz gerekir (yeniden başlatmanız gerekebilir). Daha önce örneğinize eklenmiş bir PG'yi değiştirdiyseniz, değişiklikler o PG'nin ekli olduğu tüm örneklerinize yeniden başlatmadan uygulanır.


0

Veritabanına büyük boyutlu resim veya veri yüklemek istiyorsanız. Sadece veri türünü değiştirin 'BIG BLOB'.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.