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

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é todo el VARCHAR con el TEXTO y agregué Barracuda en el file my.ini de MySQL, estos son los attributes 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 stonetworking inline. 

EDITAR: No puedo cambiar la estructura de la database porque es una aplicación / sistema / database henetworkingada. La creación de una nueva tabla, es una export de la database henetworkingada.

EDIT2: escribí esta pregunta que es similar a otras pero dentro hay alguna 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 dentro para ver si alguien tiene otras respuestas

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

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

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

Intenté todas las soluciones aquí, pero solo este parámetro

 innodb_strict_mode = 0 

resuelto mi día …

Del manual:

La configuration innodb_strict_mode afecta el event handling los errores de syntax para las sentencias CREATE TABLE, ALTER TABLE y CREATE INDEX. innodb_strict_mode también habilita una verificación de tamaño de logging, de modo que un INSERT o UPDATE nunca falla debido a que el logging es demasiado grande para el tamaño de página seleccionado.

 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 stonetworking inline. 

 [mysqld] innodb_log_file_size = 512M innodb_strict_mode = 0 

ubuntu 16.04 ruta de edición:

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

en MS Windows, la ruta será algo así como:

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

No olvide volver a contratar el service (o reiniciar su máquina)

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 imponer restricciones adicionales a este límite, networkinguciendo el tamaño de fila máximo efectivo.

. . .

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 fila a algo less de la mitad de una página de database (aproximadamente 8000 bytes), sin include columnas VARBINARY, VARCHAR, BLOB o TEXT.

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

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

Recientemente creé una tabla con 82 columnas y tuve el mismo error con InnoDB. Para eludir el problema, cambiamos el formatting de la tabla a MyISAM ya que se acaba de utilizar para una forma básica.

Solo quiero brindar ayuda a otras personas con una variante más seria de este problema. En algunas situaciones, el error ("Tamaño de fila demasiado grande … Cambiando algunas columnas a TEXTO o BLOB") ocurrirá incluso con las instrucciones "Alterar columna de tabla descendente" y "Alterar columna modificar columna".

En consecuencia, puede quedarse completamente atascado, no puede cambiar un varchar a un text, o eliminar columnas (tratar de resolver el problema, irónicamente, da como resultado el mismo post).

Si tiene este problema, la solución es alterar o eliminar varias columnas a la vez. Puede hacerlo en MySQL con la syntax "Alter table example drop column a, drop column b, drop column c" y si suelta suficientes columnas a la vez, en realidad se ejecutará en lugar de generar el error.

También me encontré con eso. Cambiar "innodb_log_file_size", "innodb_log_buffer_size" y las otras configuraciones en el file "my.ini" no resolvió mi problema. Lo paso cambiando mis types de columna "text" a varchar (20) y no usando valores varchar mayores a 20. Quizás puedas disminuir el tamaño de las columnas, si es posible. text —> varchar (20) varchar (256) -> varchar (20)

Para MySQL 5.7 en Mac OS X El Capitan:

OS X proporciona files de configuration de ejemplo en /usr/local/mysql/support-files/my-default.cnf

Para agregar variables, primero detenga el server y simplemente copie el file anterior, /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' en 'mysql' en caso de que no exista.

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

Una vez que se crea my.cnf en etc., es hora de establecer una variable dentro de eso.

 cmd: sudo nano my.cnf 

establecer variables debajo de [mysqld]

 [mysqld] innodb_log_file_size = 512M innodb_strict_mode = 0 

ahora comienza un server!

Lo que solucionó la mía era agregar

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

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

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

La longitud máxima de fila, a exception de las columnas de longitud variable (VARBINARY, VARCHAR, BLOB y TEXT), es ligeramente inferior a la mitad de una página de database para tamaños de página de 4 KB, 8 KB, 16 KB y 32 KB. Por ejemplo, la longitud máxima de fila para el tamaño de página pnetworkingeterminado de 16KB es de 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 tener less de 4 GB y la longitud total de la fila, incluidas las columnas BLOB y TEXT, debe ser inferior a 4 GB.

Tenga en count que boost el tamaño de la página no está exento de inconvenientes. Nuevamente desde la documentation:

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

Una instancia de MySQL que utiliza un tamaño de página de InnoDB particular no puede usar files de datos o files de logging 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 admite tamaños de página distintos de 16 KB.

si está utilizando MySQLWorkbench, tiene la opción de cambiar el para cambiar el query_alloc_block_size = 16258 y savelo.

Paso 1. click el options file en el lado izquierdo. enter image description here

Paso 2: checkBox clic en General y selecciona el checkBox de query_alloc_block_size y aumenta su tamaño. por ejemplo, cambiar 8129 -> 16258

enter image description here

En mi caso, estaba encerrando en Limits on Table Column Count y Row Size y haciendo los cambios descritos en esta respuesta, salvó mi día.

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

    innodb_file_per_table
    innodb_file_format = Barracuda

  2. ALTERE la tabla para usar ROW_FORMAT = COMPRESSED.

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

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

Cambiar a MyISAM no es la solución. Por innodb siguiente funcionó para mí.

establecer seguidores en my.cnf

innodb_strict_mode = 0