Aprende a resolver el error general de MySQL: 1030 Obtuve el error 139 del motor de almacenamiento.

Enfrentará este tipo de error en ocasiones aleatorias, donde una instrucción de inserción fallará, causando el error fatal 139. Ocurre normalmente en producción, cuando el usuario inserta mucho texto en algún campo de una tabla (aunque el campo puede ser escriba LONGTEXT). Innodb desencadena este error cuando no puede almacenar todas las columnas de longitud variable para una fila determinada en una sola página de base de datos.

En este artículo, le mostraremos cómo evitar esta limitación y le explicaremos por qué sucede esto.

¿Por qué pasa esto?

Innodb tiene un límite conocido para el tamaño máximo de fila, que es ligeramente menor que la mitad de la página de una base de datos (el cálculo real es 16K - (encabezado de página + avance de página) / 2. Para el tamaño de página predeterminado de 16kb. Esto establece un Límite de ~ 8000 bytes en el tamaño de la fila. Este límite es una consecuencia de que InnoDB almacena dos filas en una página. Sin embargo, si usa compresión, puede almacenar una sola fila en una página. Si su fila tiene columnas de longitud variable y El tamaño de fila completo supera este límite, InnoDB elige columnas de longitud variable para el almacenamiento fuera de la página.

Vale la pena mencionar que este límite se aplica al tamaño de bytes de los valores, no al tamaño de los caracteres. Esto significa que si inserta una cadena de 500 caracteres con todos los caracteres de varios bytes en una columna VARCHAR (500), ese valor también se elegirá para el almacenamiento fuera de la página. Esto significa que es posible que encuentre este error después de convertir de un juego de caracteres del idioma nativo a utf8, ya que puede aumentar el tamaño drásticamente. Por ejemplo, en caso de que tenga una tabla con al menos 8 columnas con texto (TEXT, LONGTEXT) y cada una exceda los 768 bytes, entonces tendrá al menos 8448 bytes para el almacenamiento local. Esto excede el límite y, por lo tanto, enfrentará la excepción.

En pocas palabras, una gran cantidad de datos que InnoDB no puede almacenar con la configuración actual. La mejor solución para este problema es cambiar el formato predeterminado de su instalación de MySQL de Compacto o Redundante a Dinámico o Comprimido.

Nota

Normalmente se enfrentará a esta excepción en las versiones de MySQL iguales o inferiores a 5.5 (MySQL 5.7 introduce la opción innodb_default_row_format, que por defecto es DYNAMIC, por lo que en las versiones más nuevas nunca verá esta excepción).

1. Verifique si el formato Barracuda está disponible

La solución a este problema es establecer el formato de fila de la tabla en la que tiene el problema en DYNAMIC, sin embargo, esta opción no está disponible cuando el formato de la tabla se establece en Antelope. Para verificar si su servidor MySQL tiene habilitado el formato Barracuda, puede verificar, por ejemplo, con una herramienta como PHPMyAdmin las opciones de formato de fila de cualquier tabla:

Barracuda Formats (Dynamic & Compressed)

Si no ve la opción DYNAMIC o COMPRESSED, debe cambiar innodb_file_format a barracuda siguiendo el paso # 2, que normalmente se establece en Antelope. Si no tiene una herramienta como PHPMyAdmin disponible, puede abrir la terminal mysql y obtener la información con el siguiente comando:

show variables like "%innodb_file%";

Una versión de mysql con este problema debería generar algo como:

innodb_file mysql

Como puedes ver, el formato de archivo está configurado en Antelope, que no es compatible con el formato de fila dinámica.

2. Cambie el formato de archivo a Barracuda

Lo primero que debe hacer es ubicar el archivo de configuración de Mysql ( my.cnf en unix o my.ini en windows) y agregar las nuevas 2 opciones con los siguientes valores en el bloque mysqld:

# The MySQL server
[mysqld]

innodb_file_per_table = 1
innodb_file_format = barracuda

Nota

Si después de agregar estas opciones, el servidor mysql no puede iniciarse, entonces el formato no es compatible, lo que significa que la solución al problema no es ninguna de las dos. Se verá obligado a actualizar la versión del servidor MySQL para tener disponibles los formatos de fila DYNAMIC y COMPACT.

Reinicie el servidor mysql y repita el primer paso para ver si los formatos de fila DYNAMIC y COMPACT están disponibles o ejecute nuevamente la siguiente instrucción en la terminal mysql:

show variables like "%innodb_file%";

Que debería salir ahora:

InnoDB file format barracuda

Usando innodb_file_format con Barracuda como valor, podrá usar el formato de fila dinámica requerido en la tabla donde tiene este problema del motor de almacenamiento.

3. Cambie el formato de fila de la tabla a DINÁMICO

Ahora que tiene configurado el formato de archivo barracuda, simplemente cambie el formato de fila de la tabla con la herramienta en PHPMyAdmin (vaya a la tabla, luego operaciones y busque las opciones de Tabla y cambie la opción row_format):

Barracuda Formats (Dynamic & Compressed)

O si no puede usar una herramienta, con una instrucción en la línea de comando de mysql:

ALTER TABLE `mytable` ROW_FORMAT=DYNAMIC;

Después de modificar el formato de fila de la tabla, guardar una fila en la base de datos con muchos datos ya no debería ser un problema y tampoco verá esta excepción.

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores