Cómo cambiar el tamaño max_allowed_packet

318

Tengo un problema con los campos BLOB en mi base de datos MySQL: al cargar archivos de más de 1 MB, aparece un error Packets larger than max_allowed_packet are not allowed.

Esto es lo que he intentado:

En MySQL Query Browser ejecuté un show variables like 'max_allowed_packet'que me dio 1048576.

Luego ejecuto la consulta set global max_allowed_packet=33554432seguida de show variables like 'max_allowed_packet'- me da 33554432 como se esperaba.

Pero cuando reinicio el servidor MySQL, mágicamente vuelve a 1048576. ¿Qué estoy haciendo mal aquí?

Pregunta extra, ¿es posible comprimir un campo BLOB?

Muleskinner
fuente
1
Un campo BLOB es un objeto binario grande. Son solo pedacitos. Entonces, sí, puede comprimir el contenido, y le da otros (y con suerte, menos) bits que almacena en el campo BLOB. Simplemente cambia los datos que ingresas. Tendrá que descomprimir el contenido BLOB cuando lo necesite nuevamente.
Konerak
Ok, gracias, esperaba que existiera una función de compresión incorporada en mysql
Muleskinner
1
posible duplicado del error 1153
cnst

Respuestas:

407

Cambie en el archivo my.inio ~/.my.cnfal incluir la línea única debajo de [mysqld]o [client]sección en su archivo:

max_allowed_packet=500M

luego reinicie el servicio MySQL y listo.

Consulte la documentación para más información.

Manuel
fuente
1
Gracias parece estar funcionando a pesar de que esperaba que esto fuera posible sin tener que modificar los archivos ini manualmente.
Muleskinner
63
FYI lectores, esta es también la solución al error "MySQL se ha ido"
djb
1
@Konerak, ¿Quién fue el taunter?
Pacerier 01 de
14
Parece bastante inútil dar una respuesta a alguien y luego decirles que deben ir a buscar una respuesta en Google. Especialmente desde entonces, SO invariablemente ocupa varios de los mejores resultados para cualquier pregunta decente relacionada con la programación. Hable acerca de la programación de un bucle infinito !!! Google> SO> Google> SO> Google> SO y así sucesivamente.
Phill Healey
55
Asegúrese de que esté debajo [mysqld]y no [mysql](muy similar). Me costó unos minutos de rascar la cabeza.
Halvor Holsten Strand
226

La variable max_allowed_packet se puede establecer globalmente ejecutando una consulta.

Sin embargo, si no lo cambia en el my.iniarchivo (como sugiere dragon112), el valor se restablecerá cuando el servidor se reinicie, incluso si lo configura globalmente.

Para cambiar el paquete máximo permitido para todos a 1 GB hasta que se reinicie el servidor:

SET GLOBAL max_allowed_packet=1073741824;
TehShrike
fuente
77
No ayuda :(. Muestra "Consulta OK, 0 filas afectadas (0.00 seg)"
artnikpro
15
@artnikpro Funciona, "Consulta OK, 0 filas afectadas (0.00 seg)" puede parecer engañoso pero es correcto.
AnnTea
10
no funciona para mi SHOW VARIABLES WHERE variable_name = 'max_allowed_packet'todavía muestra un valor antiguo
Poma
50
Muestra el valor anterior porque max_allowed_packet no cambia para las conexiones existentes. Si desconecta y vuelve a conectar, verá el valor actualizado.
Matt Crinklaw-Vogt
2
Matt Crinklaw-Vogt tiene razón. Necesita salir y conectarse de nuevo
marzo
89

Uno de mis desarrolladores junior tenía problemas para modificar esto, así que pensé en expandir esto en mayor detalle para los usuarios de Linux:

1) terminal abierto

2) raíz ssh @ YOURIP

3) ingrese la contraseña de root

4) nano /etc/mysql/my.cnf (si no se reconoce el comando, haga esto primero o intente vi y luego repita: yum install nano)

5) agregue la línea: max_allowed_packet = 256M (obviamente ajuste el tamaño para lo que necesite) en la sección [MYSQLD]. Cometió un error al colocarlo primero al final del archivo para que no funcionara.

ingrese la descripción de la imagen aquí

6) Control + O (guardar) luego ENTER (confirmar) luego Control + X (archivo de salida)

7) reinicio del servicio mysqld

8) Puede verificar el cambio en la sección de variables en phpmyadmin

naw103
fuente
esto realmente se hizo en CentosOS6, por supuesto, estoy de acuerdo en no usar el acceso ssh raíz
naw103
@tamasd Algunas distribuciones de GNU / Linux que he usado (como Debian 8 y CentOS 6) producen sudo: command not foundo this incident will be reportedporque sudono se han instalado ni configurado. ¿Sería mejor ensuciar esta respuesta con instrucciones sobre cómo configurar sudopor primera vez?
Damian Yerrick
El problema no es root ssh, pero la contraseña de inicio de sesión sí. Una cuenta de usuario con permiso sudo es casi tan insegura como la raíz. Simplemente use la autenticación basada en clave SSH.
Martin Schneider
la cuestión de cómo iniciar sesión en la máquina es OT, informó correctamente en su receta que debe iniciar sesión, de una manera u otra.
devsmt
41

Creo que algunos también querrían saber cómo encontrar el archivo my.ini en su PC. Para los usuarios de Windows, creo que la mejor manera es la siguiente:

  1. Win + R (acceso directo para 'ejecutar'), escriba services.msc , Enter
  2. Puede encontrar una entrada como 'MySQL56', hacer clic derecho sobre ella, seleccionar propiedades
  3. Puede ver algo como "D: / Archivos de programa / MySQL / MySQL Server 5.6 / bin \ mysqld" --defaults-file = "D: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini" MySQL56

Recibí esta respuesta de http://bugs.mysql.com/bug.php?id=68516

fstang
fuente
2
Esto es importante en Windows. Tenía MySQL como servicio y edité my.ini en Workbench y esta respuesta me hizo darme cuenta de que MySQL como servicio usa otro my.ini y luego el que edité en Workbench.
Robert Niestroj
20

Siguiendo todas las instrucciones, esto es lo que hice y trabajé:

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)

Entonces, como podemos ver, el max_allowed_packet se ha cambiado fuera de my.ini.

Salgamos de la sesión y verifiquemos nuevamente:

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)

Conclusión, después de SET GLOBAL max_allowed_packet = 1073741824, el servidor tendrá el nuevo max_allowed_packet hasta que se reinicie, como alguien dijo anteriormente.

zwitterion
fuente
13

Si obtiene este error mientras realiza una copia de seguridad, max_allowed_packetpuede configurarlo en my.cnfparticular para mysqldump.

[mysqldump]
max_allowed_packet=512M

Seguí recibiendo este error mientras realizaba una mysqldumpy no lo entendí porque lo tenía configurado en my.cnfla [mysqld]sección. Una vez que descubrí que podía configurarlo [mysqldump]y configuré el valor, mis copias de seguridad se completaron sin problemas.

xpros
fuente
10

Para aquellos que ejecutan wamp mysql server

Icono de la bandeja de Wamp -> 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

Desplácese hacia abajo hasta el final hasta que encuentre

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE

Agregue la línea de paquete_tamaño entre

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

Comprueba si funcionó con esta consulta

Select @@global.max_allowed_packet;
Sayka
fuente
5

Este error se debe a que sus datos contienen un valor mayor que el establecido.

Simplemente escriba max_allowed_packed=500M o puede calcular ese 500 * 1024k y usarlo en lugar de 500M si lo desea.

Ahora solo reinicie MySQL.

Suresh
fuente
2
a /etc/my.cnfpor ejemplo MySQL, o /etc/my.cnf.d/server.cnfpara MariaDB
Evgeny Lebedev
5

Muchos de los que respondieron detectaron el problema y ya dieron la solución.

Solo quiero sugerir otra solución, que está cambiando el valor de la variable Glogal desde la herramienta Mysql Workbench . Eso es, por supuesto, si usa Workbench ejecutándose localmente en el servidor (o mediante conexión SSH)

Simplemente conéctese a su instancia y vaya al menú:

Servidor -> Archivo de opciones -> Redes -> max_allowed_packed

Establece el valor deseado y luego necesita reiniciar el Servicio MySql .

cnom
fuente
4

Para cualquiera que ejecute MySQL en el servicio Amazon RDS, este cambio se realiza a través de grupos de parámetros . Debe crear una nueva PG o usar una existente (que no sea la predeterminada, que es de solo lectura).

Debe buscar el max_allowed_packetparámetro, cambiar su valor y luego presionar guardar.

De vuelta en su instancia de MySQL, si creó una nueva PG, debe adjuntar la PG a su instancia (es posible que necesite reiniciar). Si cambió una PG que ya estaba adjunta a su instancia, los cambios se aplicarán sin reiniciar, a todas sus instancias que tengan esa PG adjunta.

SebaGra
fuente
0

Si desea cargar imágenes o datos de gran tamaño en la base de datos. Simplemente cambie el tipo de datos a 'BIG BLOB'.

Vishal J
fuente
0

establecer global max_allowed_packet = 10000000000;

Vishal Sheth
fuente