primary foreign example ejemplo create mysql sql create-table

foreign - MySQL: Código de error: 1118 Tamaño de fila demasiado grande(> 8126). Cambiando algunas columnas a TEXT o BLOB



mysql create database (16)

Quiero crear una tabla de 325 columnas:

CREATE TABLE NAMESCHEMA.NAMETABLE ( ROW_ID TEXT NOT NULL , //this is the primary key 324 column of these types: CHAR(1), DATE, DECIMAL(10,0), DECIMAL(10,7), TEXT, LONG, ) ROW_FORMAT=COMPRESSED;

Reemplacé todos los VARCHAR con el TEXTO y agregué Barracuda en el archivo my.ini de MySQL, estos son los atributos agregados:

innodb_file_per_table=1 innodb_file_format=Barracuda innodb_file_format_check = ON

Pero todavía tengo este error:

Error Code: 1118 Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

EDITAR: No puedo cambiar la estructura de la base de datos porque es una aplicación / sistema / base de datos heredada. La creación de una nueva tabla, es una exportación de la base de datos heredada.

EDIT2: escribí esta pregunta que es similar a otras, pero dentro hay una solución que encontré en internet como VARCHAR y Barracuda, pero todavía tengo ese problema, así que decidí abrir una nueva pregunta con la respuesta clásica para ver si alguien tiene otras respuestas


Cambiar a MyISAM no es la solución. Para innodb los siguientes me funcionaron.

establecer seguimientos en my.cnf

innodb_strict_mode = 0


En mi caso, se incluyó desde Límites en el conteo de columnas de la tabla y Tamaño de fila, y los cambios descritos en esta respuesta me salvaron el día.

  1. Agregue lo siguiente al archivo my.cnf en la sección [mysqld].

    innodb_file_per_table
    innodb_file_format = Barracuda

  2. ALTERAR la tabla para usar ROW_FORMAT = COMPRESSED.

    ALTER TABLE table_name
    MOTOR = InnoDB
    ROW_FORMAT = COMPRIMIDO
    KEY_BLOCK_SIZE = 8;

https://.com/a/15585700/2195130


He intentado todas las soluciones aquí, pero sólo este parámetro

innodb_strict_mode = 0

resuelto mi dia ...

Del manual:

La configuración innodb_strict_mode afecta el manejo de los errores de sintaxis para las instrucciones CREATE TABLE, ALTER TABLE y CREATE INDEX. innodb_strict_mode también habilita una verificación de tamaño de registro, de modo que un INSERT o UPDATE nunca falla debido a que el registro es demasiado grande para el tamaño de página seleccionado.


Lo que la mía fija era agregar

SET GLOBAL innodb_file_format=Barracuda; SET GLOBAL innodb_file_per_table=ON;

Al principio de mi archivo ".sql", como se dice en: https://gist.github.com/tonykwon/8910261


Luché con el mismo código de error recientemente, debido a un cambio en MySQL Server 5.6.20. Pude resolver el problema cambiando innodb_log_file_size en el archivo de texto my.ini.

En las notas de la versión, se explica que un innodb_log_file_size que es demasiado pequeño activará un "Error de tamaño de fila demasiado grande".

http://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-20.html


MySQL es bastante claro sobre su tamaño máximo de fila:

Cada tabla (independientemente del motor de almacenamiento) tiene un tamaño máximo de fila de 65,535 bytes. Los motores de almacenamiento pueden establecer restricciones adicionales en este límite, reduciendo el tamaño máximo efectivo de la fila.

. . .

Los motores de almacenamiento individuales pueden imponer restricciones adicionales que limitan el recuento de columnas de la tabla. Ejemplos:

InnoDB permite hasta 1000 columnas.

InnoDB restringe el tamaño de la fila a algo menos de la mitad de una página de base de datos (aproximadamente 8000 bytes), sin incluir las columnas VARBINARY, VARCHAR, BLOB o TEXT.

Los diferentes formatos de almacenamiento de InnoDB (COMPRESSED, REDUNDANT) utilizan diferentes cantidades de encabezado de página y datos de finalización, lo que afecta la cantidad de almacenamiento disponible para las filas.

Si tiene 325 conjuntos de columnas que se repiten, está excediendo varias de las restricciones. Este es también un formato de datos sospechoso. Debe tener 325 filas para cada fila en la tabla que desee, una para cada grupo de columnas.


Ninguna de las respuestas hasta la fecha menciona el efecto del parámetro innodb_page_size. Posiblemente porque cambiar este parámetro no era una operación compatible antes de MySQL 5.7.6. De la documentation :

La longitud máxima de la fila, excepto las columnas de longitud variable (VARBINARY, VARCHAR, BLOB y TEXT), es un poco menos de la mitad de una página de base de datos para tamaños de página de 4KB, 8KB, 16KB y 32KB. Por ejemplo, la longitud máxima de fila para el innodb_page_size predeterminado de 16 KB es aproximadamente 8000 bytes. Para un tamaño de página InnoDB de 64 KB, la longitud máxima de la fila es de aproximadamente 16000 bytes. Las columnas LONGBLOB y LONGTEXT deben ser inferiores a 4 GB, y la longitud total de la fila, incluidas las columnas BLOB y TEXTO, debe ser inferior a 4 GB.

Tenga en cuenta que aumentar el tamaño de la página no está exento de inconvenientes. De nuevo a partir de la documentación:

A partir de MySQL 5.7.6, se admiten tamaños de página de 32KB y 64KB, pero ROW_FORMAT = COMPRESSED aún no se admite para tamaños de página superiores a 16KB. Para tamaños de página de 32KB y 64KB, el tamaño máximo de registro es de 16KB. Para innodb_page_size = 32k, el tamaño de la extensión es de 2MB. Para innodb_page_size = 64k, el tamaño de la extensión es de 4MB.

Una instancia de MySQL que usa un tamaño de página InnoDB particular no puede usar archivos de datos o archivos de registro de una instancia que usa un tamaño de página diferente. Esta limitación podría afectar las operaciones de restauración o degradación utilizando datos de MySQL 5.6, que admiten tamaños de página distintos de 16KB.


Para MySQL 5.7 en Mac OS X El Capitan:

OS X proporciona archivos de configuración de ejemplo en /usr/local/mysql/support-files/my-default.cnf

Para agregar variables, primero detenga el servidor y simplemente copie el archivo anterior a /usr/local/mysql/etc/my.cnf

cmd : sudo cp /usr/local/mysql/support-files/my-default.cnf /usr/local/mysql/etc/my.cnf

NOTA: cree la carpeta ''etc'' debajo de ''mysql'' en caso de que no exista.

cmd : sudo mkdir /usr/local/mysql/etc

Una vez creado my.cnf en etc., es el momento de establecer una variable dentro de eso.

cmd: sudo nano my.cnf

Establecer variables a continuación [mysqld]

[mysqld] innodb_log_file_size = 512M innodb_strict_mode = 0

ahora inicia un servidor!


Recientemente creé una tabla con 82 columnas y tuve el mismo error con InnoDB. Para evitar el problema, cambiamos el formato de la tabla a MyISAM ya que solo se usaba para un formulario básico.


Si está obteniendo este error en Google Cloud SQL (por ejemplo, mysql 5.7), es probable que en este momento no sea una solución simple, ya que no se admiten todos los indicadores InnoDB. Si viene de Mysql 5.5 como estaba (para una configuración de Wordpress antigua), esto podría significar que necesita disputar algunos tipos de columnas en la base de datos de origen antes de exportar.

Puede encontrar más información here .


Si está utilizando MySQLWorkbench, tiene la opción de cambiar el archivo para consultar el query_alloc_block_size = 16258 y guardarlo.

Paso 1. Haga clic en el options file en el lado izquierdo.

Paso 2: haga clic en General y seleccione la checkBox de verificación de query_alloc_block_size y aumente su tamaño. por ejemplo, cambio 8129 -> 16258


Solo quiero ayudar a otras personas con una variante más seria de este problema. En algunas situaciones, el error ("Tamaño de fila demasiado grande ... Al cambiar algunas columnas a TEXTO o BLOB") se producirá incluso con las declaraciones "alterar la columna" y "modificar la columna modificar tabla".

En consecuencia, puede quedar completamente atascado, no puede cambiar un varchar a un texto, o eliminar columnas (al intentar resolver el problema, irónicamente, se obtiene el mismo mensaje).

Si tiene este problema, la solución es alterar o eliminar varias columnas a la vez. Puede hacer esto en MySQL con la sintaxis "alterar tabla ejemplo soltar columna a, soltar columna b, soltar columna c" y si elimina suficientes columnas a la vez, realmente se ejecutará en lugar de elevar el error.


También me encontré con eso. Cambiar "innodb_log_file_size", "innodb_log_buffer_size" y las otras configuraciones en el archivo "my.ini" no resolvieron mi problema. Lo paso cambiando mis tipos de columna "texto" a varchar (20) y no usando valores varchar mayores a 20. Tal vez usted también puede disminuir el tamaño de las columnas, si es posible. texto ---> varchar (20) varchar (256) -> varchar (20)


Tener el problema similar esta mañana y de la siguiente manera me salvó la vida:

¿Intenta apagar innodb_strict_mode ?

SET GLOBAL innodb_strict_mode = 0;

y luego tratar de importar de nuevo.

innodb_strict_mode está ON usando MySQL> = 5.7.7, antes estaba OFF.


(SOLUCIÓN MYSQL 5.7)

Me he encontrado con el mismo error en el servidor mysql más reciente (5.7.21):

Tamaño de fila demasiado grande (> 8126). Cambiar algunas columnas a TEXTO o BLOB puede ayudar. En el formato de fila actual, el prefijo BLOB de 0 bytes se almacena en línea.

Después de pasar unas horas leyendo el manual de MYSQL, ¡encontré la solución!

El parámetro clave es: innodb_page_size

Se agregó soporte para tamaños de página de 32k y 64k en MySQL 5.7. Para tamaños de página de 32k y 64k, la longitud máxima de fila es de aproximadamente 16000 bytes.

El truco es que este parámetro solo se puede cambiar durante la INICIALIZACIÓN de la instancia del servicio mysql, por lo que no tiene ningún efecto si cambia este parámetro después de que la instancia ya está inicializada (la primera ejecución de la instancia).

innodb_page_size solo se puede configurar antes de inicializar la instancia de MySQL y no se puede cambiar después. Si no se especifica ningún valor, la instancia se inicializa utilizando el tamaño de página predeterminado. Consulte la Sección 14.6.1, “Configuración de inicio de InnoDB”.

Entonces, si no cambia este valor en my.ini antes de la inicialización, el valor predeterminado será 16K, que tendrá un límite de tamaño de fila de ~ 8K. Es por eso que surge el error.

Si aumenta innodb_page_size, también se debe aumentar innodb_log_buffer_size . Ajústelo al menos a 16M. Además, si ROW_FORMAT está configurado como COMPRIMIDO, no puede aumentar innodb_page_size a 32k, o 64K. Debería ser DINÁMICO (por defecto en 5.7).

ROW_FORMAT = COMPRESSED no se admite cuando innodb_page_size se establece en 32KB o 64KB. Para innodb_page_size = 32k, el tamaño de la extensión es de 2MB. Para innodb_page_size = 64k, el tamaño de la extensión es de 4MB. innodb_log_buffer_size se debe establecer en al menos 16M (el valor predeterminado) cuando se utilizan tamaños de página de 32k o 64k.

Además, el innodb_buffer_pool_size debería incrementarse de 128M a 512M , de lo contrario, obtendrá un error en la inicialización de la instancia (no tengo el error exacto).

Después de esto, el error de tamaño de fila desapareció.

El problema con esto es que tienes que crear una nueva instancia de MySql y migrar los datos a tu nueva instancia de DataBase, desde la anterior.

Los parámetros que cambié y que funcionan (después de crear una nueva instancia e inicializar con el my.ini que se modificó por primera vez con esta configuración):

innodb_page_size=64k innodb_log_buffer_size=32M innodb_buffer_pool_size=512M

Todas las configuraciones y descripciones en las que encontré la solución se pueden encontrar aquí:

https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html

¡Espero que esto ayude!

¡Saludos!


ERROR 1118 (42000) at line 1852: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

[mysqld] innodb_log_file_size = 512M innodb_strict_mode = 0

ruta de edición de ubuntu 16.04:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

en MS Windows el camino será algo como:

C:/ProgramData/MySQL/MySQL Server 5.7/my.ini

No olvide volver a iniciar el servicio (o reiniciar su máquina)