¿Cómo puedo cambiar el límite?
El tamaño de la fila es demasiado grande (> 8126). Cambiar algunas columnas a TEXT o BLOB o usar ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED
puede ayudar. En el formato de fila actual, el BLOB
prefijo de 768 bytes se almacena en línea.
Mesa:
id int(11) No
name text No
date date No
time time No
schedule int(11) No
category int(11) No
top_a varchar(255) No
top_b varchar(255) No
top_c varchar(255) No
top_d varchar(255) No
top_e varchar(255) No
top_f varchar(255) No
top_g varchar(255) No
top_h varchar(255) No
top_i varchar(255) No
top_j varchar(255) No
top_title_a varchar(255) No
top_title_b varchar(255) No
top_title_c varchar(255) No
top_title_d varchar(255) No
top_title_e varchar(255) No
top_title_f varchar(255) No
top_title_g varchar(255) No
top_title_h varchar(255) No
top_title_i varchar(255) No
top_title_j varchar(255) No
top_desc_a text No
top_desc_b text No
top_desc_c text No
top_desc_d text No
top_desc_e text No
top_desc_f text No
top_desc_g text No
top_desc_h text No
top_desc_i text No
top_desc_j text No
status int(11) No
admin_id int(11) No
No
muestra?Respuestas:
La pregunta también se ha hecho sobre la falla del servidor .
El método que funcionó para el OP fue:
Agregue lo siguiente al
my.cnf
archivo en la[mysqld]
sección.ALTER
la mesa a utilizarROW_FORMAT=COMPRESSED
.Existe la posibilidad de que lo anterior aún no resuelva sus problemas. Es un error conocido (y verificado) con el motor InnoDB , y una solución temporal por ahora es recurrir al motor MyISAM como almacenamiento temporal. Entonces, en su
my.cnf
archivo:fuente
innodb_file_per_table=1
para activar esta opción.Me encontré con este problema recientemente y lo resolví de una manera diferente. Si está ejecutando MySQL versión 5.6.20, hay un error conocido en el sistema. Ver documentos de MySQL
En mi situación, la tabla de blobs ofensiva era de alrededor de 16 MB. Por lo tanto, la forma en que lo resolví fue agregando una línea a my.cnf que aseguraba que tuviera al menos 10 veces esa cantidad y algo más:
innodb_log_file_size = 256M
fuente
longblob
campo desapareció tan pronto como aumenté elinnodb_log_file_size
parámetro. También se estaba ejecutando 5.6.20.Configure lo siguiente en su archivo my.cnf y reinicie el servidor mysql.
fuente
innodb_strict_mode=0
-> sin espacios. De lo contrario, reiniciar mariaDB 10.2 da como resultado un error :-PSi puede cambiar el MOTOR y usar MyISAM en lugar de InnoDB, eso debería ayudar:
ENGINE=MyISAM
Hay dos advertencias con MyISAM (posiblemente más):
fuente
Me gustaría compartir una respuesta increíble, podría ser útil. Créditos Bill Karwin ver aquí /dba/6598/innodb-create-table-error-row-size-too-large
Varían según el formato de archivo InnoDB. En la actualidad existen 2 formatos llamados Antelope y Barracuda.
El archivo de espacio de tabla central (ibdata1) siempre está en formato Antelope. Si usa archivo por tabla, puede hacer que los archivos individuales usen el formato Barracuda configurando innodb_file_format = Barracuda en my.cnf.
Puntos basicos:
Una página de 16 KB de datos InnoDB debe contener al menos dos filas de datos. Además, cada página tiene un encabezado y un pie de página que contienen sumas de verificación de página y número de secuencia de registro, etc. Ahí es donde obtiene su límite de un poco menos de 8 KB por fila.
Los tipos de datos de tamaño fijo como INTEGER, DATE, FLOAT, CHAR se almacenan en esta página de datos primarios y cuentan para el límite de tamaño de fila.
Los tipos de datos de tamaño variable como VARCHAR, TEXT, BLOB se almacenan en páginas de desbordamiento, por lo que no cuentan completamente para el límite de tamaño de fila. En Antelope, hasta 768 bytes de dichas columnas se almacenan en la página de datos principal además de almacenarse en la página de desbordamiento. Barracuda admite un formato de fila dinámico, por lo que puede almacenar solo un puntero de 20 bytes en la página de datos principal.
Los tipos de datos de tamaño variable también tienen como prefijo 1 o más bytes para codificar la longitud. Y el formato de fila InnoDB también tiene una matriz de compensaciones de campo. Entonces hay una estructura interna más o menos documentada en su wiki.
Barracuda también admite ROW_FORMAT = COMPRESSED para obtener una mayor eficiencia de almacenamiento de datos desbordados.
También debo comentar que nunca he visto una tabla bien diseñada que exceda el límite de tamaño de fila. Es un fuerte "olor a código" que está violando la condición de grupos repetidos de la Primera Forma Normal.
fuente
Tuve el mismo problema, esto me lo resolvió:
De la documentación de MYSQL :
fuente
Warnings from last query: InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_format > Antelope
Row size too large (>8126)
my_table
ROW_FORMAT = DYNAMIC; de nuevoDespués de pasar horas, encontré la solución: simplemente ejecute el siguiente SQL en su administrador de MySQL para convertir la tabla a MyISAM:
fuente
create table
tiene la misma opción:CREATE TABLE ... ENGINE=MyISAM ...
Me encontré con este problema cuando intentaba restaurar una base de datos mysql respaldada desde un servidor diferente. Lo que resolvió este problema para mí fue agregar ciertas configuraciones a my.conf (como en las preguntas anteriores) y, además, cambiar el archivo de respaldo SQL:
Paso 1: agregue o edite las siguientes líneas en my.conf:
Paso 2 agregue ROW_FORMAT = DYNAMIC a la declaración de creación de tabla en el archivo de respaldo sql para la tabla que está causando este error:
el cambio importante anterior es ROW_FORMAT = DYNAMIC; (que no se incluyó en el archivo de respaldo sql original)
fuente que me ayudó a resolver este problema: MariaDB e InnoDB MySQL Tamaño de fila demasiado grande
fuente
innodb_page_size=32K
no funcionó, ya que provocó un error al reiniciar MariaDB 10.2 en mi caso. En su lugar, agregué unainnodb_strict_mode=0
línea, como se describe aquíinnodb_page_size
requiereibdata*
recreación, que es una operación destructiva. Mire su registro del sistema para obtener más informaciónLas otras respuestas abordan la pregunta formulada. Abordaré la causa subyacente: un diseño de esquema deficiente.
No extienda una matriz entre columnas. Aquí tiene 3 * 10 columnas que deben convertirse en 10 filas de 3 columnas en una nueva tabla (más
id
, etc.)Tu
Main
mesa solo tendríaTu mesa extra (
Top
) tendríaHabría 10 (¿o menos? ¿O más?) Filas
Top
para cadaid
.Esto elimina su problema original y limpia el esquema. (Esto no es "normalización", como se debate en algunos de los Comentarios).
Hacer no cambiar a MyISAM; se va
No se preocupe
ROW_FORMAT
.Deberá cambiar su código para hacer el
JOIN
y para manejar múltiples filas en lugar de múltiples columnas.fuente
Estoy usando MySQL 5.6 en AWS RDS. Actualicé lo siguiente en el grupo de parámetros.
Tuve que reiniciar la instancia de base de datos para que los cambios del grupo de parámetros tuvieran efecto.
Además, ROW_FORMAT = COMPRESSED no fue compatible. Usé DYNAMIC como se muestra a continuación y funcionó bien.
fuente
El tamaño máximo de fila para una tabla InnoDB, que se aplica a los datos almacenados localmente dentro de una página de base de datos, es un poco menos de media página para 4 KB, 8 KB, 16 KB y 32 KB.
Para páginas de 16 kb (predeterminado), podemos calcular:
Básicamente, podrías maximizar una fila con:
Recuerde, solo se desbordará a una página de desbordamiento si el campo tiene> 767 bytes. Si hay demasiados campos de 767 bytes, se romperá (pasando más allá de max row_size). No es habitual con latin1 pero es muy posible con utf-8 si los desarrolladores no tienen cuidado.
Para este caso, creo que posiblemente podría aumentar el innodb_page_size a 32kb.
en my.cnf:
Referencias:
fuente
También encontré el mismo problema. Resuelvo el problema ejecutando el siguiente sql:
Pero, creo que deberías saber sobre Row Storage .
Hay dos tipos de columnas: columna de longitud variable (como los tipos VARCHAR, VARBINARY y BLOB y TEXT) y columna de longitud fija . Se almacenan en diferentes tipos de páginas.
y cuando el propósito de establecer ROW_FORMAT es
¿Quieres saber más sobre los formatos de fila DINÁMICO y COMPRIMIDO?
fuente
Si esto ocurre en un SELECT con muchas columnas, la causa puede ser que mysql está creando una tabla temporal. Si esta tabla es demasiado grande para caber en la memoria, usará su formato de tabla temporal predeterminado, que es InnoDB, para almacenarla en el disco. En este caso, se aplican los límites de tamaño de InnoDB.
Entonces tienes 4 opciones:
cambiar el formato de tabla temporal predeterminado a MYISAM, esto es lo que hice. Cambio en my.cnf:
Reinicie mysql, la consulta funciona.
fuente
Aquí hay un consejo simple para cualquiera que esté interesado:
Después de actualizar de Debian 9 a Debian 10 con 10.3.17-MariaDB, tengo algunos errores de las bases de datos de Joomla:
[Advertencia] InnoDB: No se puede agregar un campo
field
en la tabladatabase
.table
porque después de agregarlo, el tamaño de la fila es 8742 que es mayor que el tamaño máximo permitido (8126) para un registro en la página hoja de índice.Por si acaso, configuré innodb_default_row_format = DYNAMIC en /etc/mysql/mariadb.conf.d/50-server.cnf (de todos modos era predeterminado)
Entonces, he usado phpmyadmin para ejecutar "Optimizar tabla" para todas las tablas en la base de datos de Joomla. Creo que la recreación de la mesa realizada por phpmyadmin en el proceso ayudó. Si tiene phpmyadmin instalado, solo tiene que hacer unos pocos clics.
fuente