Come modificare la dimensione max_allowed_packet


318

Sto riscontrando un problema con i campi BLOB nel mio database MySQL - durante il caricamento di file di dimensioni superiori a circa 1 MB viene visualizzato un errore Packets larger than max_allowed_packet are not allowed.

Ecco cosa ho provato:

In MySQL Query Browser ho eseguito un file show variables like 'max_allowed_packet'che mi ha dato 1048576.

Quindi eseguo la query set global max_allowed_packet=33554432seguita da show variables like 'max_allowed_packet'- mi dà 33554432 come previsto.

Ma quando riavvio il server MySQL torna magicamente a 1048576. Cosa sto facendo di sbagliato qui?

Domanda bonus, è possibile comprimere un campo BLOB?


1
Un campo BLOB è un oggetto binario di grandi dimensioni. Sono solo pezzi. Quindi sì, puoi comprimere il contenuto, e dà invece altri (e si spera, meno) bit che memorizzi nel campo BLOB. Cambia solo i dati che hai inserito. Dovrai decomprimere i contenuti BLOB anche quando ne avrai bisogno.
Konerak,

Ok grazie, speravo che esistesse una funzione di compressione integrata in mysql
Muleskinner

Risposte:


407

Modifica il file my.inio ~/.my.cnfincludendo la riga singola nella sezione [mysqld]o [client]nel file:

max_allowed_packet=500M

quindi riavviare il servizio MySQL e il gioco è fatto.

Vedere la documentazione per ulteriori informazioni.


1
Grazie sembra funzionare anche se avevo sperato che ciò sarebbe stato possibile senza dover modificare manualmente i file ini.
Muleskinner,

63
Cordiali saluti, questa è anche la soluzione all'errore "MySQL è andato via"
DJ

1
@Konerak, Who was the taunter?
Pacerier

14
Sembra piuttosto inutile dare una risposta a qualcuno e poi dire loro che dovrebbero andare a cercare una risposta a Google. Soprattutto da allora, SO occupa invariabilmente alcuni dei migliori risultati per qualsiasi domanda relativa alla programmazione decente. Parliamo di programmare un loop infinito !!! Google> SO> Google> SO> Google> SO e così via.
Phill Healey,

5
Assicurati che sia sotto [mysqld]e non [mysql](molto simile). Mi è costato qualche minuto di strappi alla testa.
Halvor Holsten Strand,

226

La variabile max_allowed_packet può essere impostata a livello globale eseguendo una query.

Tuttavia, se non lo si modifica nel my.inifile (come suggerito da dragon112), il valore verrà ripristinato al riavvio del server, anche se lo si imposta a livello globale.

Per modificare il pacchetto massimo consentito per tutti a 1 GB fino al riavvio del server:

SET GLOBAL max_allowed_packet=1073741824;

7
Non aiuta :(. Visualizza "Query OK, 0 righe interessate (0.00 sec)"
artnikpro

15
@artnikpro Funziona, "Query OK, 0 righe interessate (0,00 sec)" potrebbe sembrare fuorviante ma è giusto.
AnnTea,

10
non funziona per me. SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'mostra ancora vecchio valore
Poma

50
Mostra il vecchio valore perché max_allowed_packet non cambia per le connessioni esistenti. Se ti disconnetti e riconnetti vedrai il valore aggiornato.
Matt Crinklaw-Vogt,

2
Matt Crinklaw-Vogt ha ragione. Deve uscire e riconnettersi
makriria il

89

Uno dei miei sviluppatori junior stava avendo problemi a modificarlo per me, quindi ho pensato di ampliarlo in modo più dettagliato per gli utenti di Linux:

1) terminale aperto

2) ssh root @ YOURIP

3) inserisci la password di root

4) nano /etc/mysql/my.cnf (se il comando non viene riconosciuto, eseguire prima questa operazione o provare vi, quindi ripetere: yum install nano)

5) aggiungi la riga: max_allowed_packet = 256M (ovviamente regola le dimensioni per quello che ti serve) nella sezione [MYSQLD]. Ha fatto un errore nel metterlo per primo nella parte inferiore del file in modo che non funzionasse.

inserisci qui la descrizione dell'immagine

6) Control + O (salva) quindi ENTER (conferma) quindi Control + X (esci dal file)

7) servizio mysqld restart

8) È possibile verificare la modifica nella sezione variabili su phpmyadmin


questo è stato effettivamente fatto su CentosOS6, ovviamente sono d'accordo sul non usare l'accesso root ssh
naw103

@tamasd Alcune distribuzioni GNU / Linux che ho usato (come Debian 8 e CentOS 6) producono sudo: command not foundo this incident will be reportedperché nessuna delle due sudoè stata installata e configurata. Sarebbe meglio sporcare questa risposta con le istruzioni per l'installazione sudoper la prima volta?
Damian Yerrick,

non è root ssh il problema, ma l'accesso con password lo è. Un account utente con autorizzazione sudo non è sicuro tanto quanto lo è root. Usa l'autenticazione basata su chiave SSH.
Martin Schneider,

la questione di come accedere alla macchina è OT, ha giustamente segnalato nella sua ricetta che devi accedere, in un modo o nell'altro.
Devsmt

41

Penso che alcuni vorrebbero anche sapere come trovare il file my.ini sul tuo PC. Per gli utenti di Windows, penso che il modo migliore sia il seguente:

  1. Win + R (scorciatoia per 'run'), digitare services.msc , Invio
  2. È possibile trovare una voce come 'MySQL56', fare clic destro su di essa, selezionare le proprietà
  3. Potresti vedere sth come "D: / Programmi / MySQL / MySQL Server 5.6 / bin \ mysqld" --defaults-file = "D: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini" MySQL56

Ho ricevuto questa risposta da http://bugs.mysql.com/bug.php?id=68516


2
Questo è importante su Windows. Avevo MySQL come servizio e ho modificato my.ini in Workbench e questa risposta mi ha fatto capire che MySQL come servizio utilizza un altro my.ini quindi quello che ho modificato in Workbench.
Robert Niestroj,

20

Seguendo tutte le istruzioni, questo è quello che ho fatto e lavorato:

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)

Quindi, come possiamo vedere, max_allowed_packet è stato modificato al di fuori di my.ini.

Lascia la sessione e ricontrolla:

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)

Conclusione, dopo SET GLOBAL max_allowed_packet = 1073741824, il server avrà il nuovo max_allowed_packet fino a quando non verrà riavviato, come affermato in precedenza.


13

Se si ottiene questo errore durante l'esecuzione di un backup, è max_allowed_packetpossibile impostare in my.cnfparticolare per mysqldump.

[mysqldump]
max_allowed_packet=512M

Ho continuato a ottenere questo errore durante l'esecuzione di una mysqldumpe non capivo perché avevo questo insieme nella my.cnfsotto la [mysqld]sezione. Una volta capito che potevo impostarlo per [mysqldump]e ho impostato il valore, i miei backup sono stati completati senza problemi.


10

Per chi esegue wamp mysql server

Icona della vaschetta per l'umidità -> 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

Scorri verso il basso fino alla fine fino a trovare

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

Aggiungi la linea di packet_size tra

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

Controlla se ha funzionato con questa query

Select @@global.max_allowed_packet;

5

Questo errore è dovuto al fatto che i tuoi dati contengono valori più grandi di quelli impostati.

Basta scrivere max_allowed_packed=500M o è possibile calcolare quel 500 * 1024k e utilizzare quello invece di 500M se lo si desidera.

Ora riavvia MySQL.


2
ad /etc/my.cnfesempio MySQL, o /etc/my.cnf.d/server.cnfper MariaDB
Evgeny Lebedev

5

Molti dei rispondenti hanno individuato il problema e hanno già fornito la soluzione.

Voglio solo suggerire un'altra soluzione, che sta cambiando il valore della variabile Glogal all'interno dello strumento Mysql Workbench . Ovviamente SE usi Workbench in esecuzione localmente sul server (o tramite connessione SSH)

Ti basta connetterti alla tua istanza e andare sul menu:

Server -> File opzioni -> Rete -> max_allowed_packed

È stato impostato il valore desiderato e quindi è necessario riavviare il servizio MySql .


4

Per chiunque esegua MySQL sul servizio Amazon RDS, questa modifica viene effettuata tramite gruppi di parametri . È necessario creare un nuovo PG o utilizzarne uno esistente (diverso da quello predefinito, che è di sola lettura).

È necessario cercare il max_allowed_packetparametro, modificarne il valore e quindi premere Salva.

Di nuovo nella tua istanza MySQL, se hai creato un nuovo PG, dovresti collegare il PG alla tua istanza (potrebbe essere necessario riavviare). Se hai modificato un PG che era già collegato alla tua istanza, le modifiche verranno applicate senza riavviare, a tutte le tue istanze a cui quel PG è collegato.


0

Se vuoi caricare immagini o dati di grandi dimensioni nel database. Basta cambiare il tipo di dati in 'BIG BLOB'.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.