El modo estricto de InnoDB es similar al modo estricto de SQL. Cuando está habilitado, ciertas advertencias de InnoDB se convierten en errores.

Configuración del modo estricto InnoDB

MariaDB comenzando con 10.2.2

En MariaDB 10.2.2 y posteriormente, el modo estricto InnoDB está habilitado de forma predeterminada.

El modo estricto InnoDB se puede habilitar o deshabilitar configurando el innodb_strict_mode variable de sistema del servidor.

Su valor global se puede cambiar dinámicamente con SET GLOBAL. Por ejemplo:

SETGLOBAL innodb_strict_mode=ON;

Su valor para la sesión actual también se puede cambiar dinámicamente con SET SESSION. Por ejemplo:

SETSESSION innodb_strict_mode=ON;

También se puede configurar en un grupo de opciones del servidor en un archivo de opciones antes de iniciar el servidor. Por ejemplo:

[mariadb]...
innodb_strict_mode=ON

Errores de modo estricto de InnoDB

Opciones de creación incorrectas

Si el modo estricto InnoDB está habilitado, y si se ejecuta una declaración DDL y se especifican opciones de tabla no válidas o conflictivas, se genera un error. El error solo será un error genérico que diga lo siguiente:

ERROR 1005(HY000): Can't createtable`db1`.`tab`(errno: 140"Wrong create options")

Sin embargo, se pueden encontrar más detalles sobre el error ejecutando SHOW WARNINGS.

Por ejemplo, el error se genera en los siguientes casos:

  • los KEY_BLOCK_SIZE La opción de tabla se establece en un valor distinto de cero, pero la ROW_FORMAT La opción de tabla se establece en algún formato de fila que no sea el COMPRESSED formato de fila. Por ejemplo:
SETSESSION innodb_strict_mode=ON;CREATEORREPLACETABLE tab (
   id intPRIMARYKEY,
   str varchar(50))
KEY_BLOCK_SIZE=4
ROW_FORMAT=DYNAMIC;
ERROR 1005(HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning | 1478 | InnoDB: cannot specify ROW_FORMAT = DYNAMIC with KEY_BLOCK_SIZE.   |
| Error   | 1005 | Can't createtable`db1`.`tab`(errno: 140"Wrong create options")|| Warning |1030| Got error 140"Wrong create options"from storage engineInnoDB|+---------+------+--------------------------------------------------------------------+3rowsinset(0.000 sec)
  • los KEY_BLOCK_SIZE La opción de tabla se establece en un valor distinto de cero, pero el valor configurado es mayor que 16 o el valor de la innodb_page_size variable de sistema, la que sea menor.
SETSESSION innodb_strict_mode=ON;CREATEORREPLACETABLE tab (
   id intPRIMARYKEY,
   str varchar(50))
KEY_BLOCK_SIZE=16;
ERROR 1005(HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning | 1478 | InnoDB: KEY_BLOCK_SIZE=16 cannot be larger than 8.                 |
| Error   | 1005 | Can't createtable`db1`.`tab`(errno: 140"Wrong create options")|| Warning |1030| Got error 140"Wrong create options"from storage engineInnoDB|+---------+------+--------------------------------------------------------------------+3rowsinset(0.000 sec)
SETGLOBAL innodb_file_per_table=OFF;SETSESSION innodb_strict_mode=ON;CREATEORREPLACETABLE tab (
   id intPRIMARYKEY,
   str varchar(50))
KEY_BLOCK_SIZE=4;
ERROR 1005(HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning | 1478 | InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.             |
| Error   | 1005 | Can't createtable`db1`.`tab`(errno: 140"Wrong create options")|| Warning |1030| Got error 140"Wrong create options"from storage engineInnoDB|+---------+------+--------------------------------------------------------------------+3rowsinset(0.000 sec)
  • los KEY_BLOCK_SIZE La opción de tabla se establece en un valor distinto de cero, pero no se establece en uno de los valores admitidos: [1, 2, 4, 8, 16].
SETSESSION innodb_strict_mode=ON;CREATEORREPLACETABLE tab (
   id intPRIMARYKEY,
   str varchar(50))
KEY_BLOCK_SIZE=5;
ERROR 1005(HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+-----------------------------------------------------------------------+
| Level   | Code | Message                                                               |
+---------+------+-----------------------------------------------------------------------+
| Warning | 1478 | InnoDB: invalid KEY_BLOCK_SIZE = 5. Valid values are [1, 2, 4, 8, 16] |
| Error   | 1005 | Can't createtable`db1`.`tab`(errno: 140"Wrong create options")|| Warning |1030| Got error 140"Wrong create options"from storage engineInnoDB|+---------+------+-----------------------------------------------------------------------+3rowsinset(0.000 sec)
SETGLOBAL innodb_file_per_table=OFF;SETSESSION innodb_strict_mode=ON;CREATEORREPLACETABLE tab (
   id intPRIMARYKEY,
   str varchar(50))
ROW_FORMAT=COMPRESSED;
ERROR 1005(HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning | 1478 | InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table.      |
| Error   | 1005 | Can't createtable`db1`.`tab`(errno: 140"Wrong create options")|| Warning |1030| Got error 140"Wrong create options"from storage engineInnoDB|+---------+------+--------------------------------------------------------------------+3rowsinset(0.000 sec)
SETSESSION innodb_strict_mode=ON;CREATEORREPLACETABLE tab (
   id intPRIMARYKEY,
   str varchar(50))
ROW_FORMAT=PAGE;
ERROR 1005(HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning | 1478 | InnoDB: invalid ROW_FORMAT specifier.                              |
| Error   | 1005 | Can't createtable`db1`.`tab`(errno: 140"Wrong create options")|| Warning |1030| Got error 140"Wrong create options"from storage engineInnoDB|+---------+------+--------------------------------------------------------------------+3rowsinset(0.000 sec)
  • O el KEY_BLOCK_SIZE La opción de tabla se establece en un valor distinto de cero o la ROW_FORMAT La opción de tabla se establece en la COMPRESSED formato de fila, pero el innodb_page_size La variable del sistema se establece en un valor mayor que 16k.
SET SESSION innodb_strict_mode=ON;

CREATE OR REPLACE TABLE tab (
   id int PRIMARY KEY,
   str varchar(50)
)
ROW_FORMAT=COMPRESSED;
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+-----------------------------------------------------------------------+
| Level   | Code | Message                                                               |
+---------+------+-----------------------------------------------------------------------+
| Warning | 1478 | InnoDB: Cannot create a COMPRESSED table when innodb_page_size > 16k. |
| Error   | 1005 | Can't create table `db1`.`tab` (errno: 140 "Wrong create options")    |
| Warning | 1030 | Got error 140 "Wrong create options" from storage engine InnoDB       |
+---------+------+-----------------------------------------------------------------------+
3 rows in set (0.00 sec)
SET GLOBAL innodb_file_per_table=OFF;
SET SESSION innodb_strict_mode=ON;

CREATE OR REPLACE TABLE tab (
   id int PRIMARY KEY,
   str varchar(50)
)
DATA DIRECTORY='/mariadb';
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning | 1478 | InnoDB: DATA DIRECTORY requires innodb_file_per_table.             |
| Error   | 1005 | Can't create table `db1`.`tab` (errno: 140 "Wrong create options") |
| Warning | 1030 | Got error 140 "Wrong create options" from storage engine InnoDB    |
+---------+------+--------------------------------------------------------------------+
3 rows in set (0.000 sec)
  • los DATA DIRECTORY La opción de tabla está configurada, pero la tabla es una tabla temporal.
SET SESSION innodb_strict_mode=ON;

CREATE OR REPLACE TEMPORARY TABLE tab (
   id int PRIMARY KEY,
   str varchar(50)
)
DATA DIRECTORY='/mariadb';
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning | 1478 | InnoDB: DATA DIRECTORY cannot be used for TEMPORARY tables.        |
| Error   | 1005 | Can't create table `db1`.`tab` (errno: 140 "Wrong create options") |
| Warning | 1030 | Got error 140 "Wrong create options" from storage engine InnoDB    |
+---------+------+--------------------------------------------------------------------+
3 rows in set (0.000 sec)
SET SESSION innodb_strict_mode=ON;

CREATE OR REPLACE TABLE tab (
   id int PRIMARY KEY,
   str varchar(50)
)
INDEX DIRECTORY='/mariadb';
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning | 1478 | InnoDB: INDEX DIRECTORY is not supported                           |
| Error   | 1005 | Can't create table `db1`.`tab` (errno: 140 "Wrong create options") |
| Warning | 1030 | Got error 140 "Wrong create options" from storage engine InnoDB    |
+---------+------+--------------------------------------------------------------------+
3 rows in set (0.000 sec)
  • los PAGE_COMPRESSED La opción de tabla está configurada en 1, por lo que la compresión de página InnoDB está habilitada, pero el ROW_FORMAT La opción de tabla se establece en algún formato de fila que no sea el COMPACT o DYNAMIC formatos de fila.
SET SESSION innodb_strict_mode=ON;

CREATE OR REPLACE TABLE tab (
   id int PRIMARY KEY,
   str varchar(50)
)
PAGE_COMPRESSED=1
ROW_FORMAT=COMPRESSED;
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning |  140 | InnoDB: PAGE_COMPRESSED table can't have ROW_TYPE=COMPRESSED       |
| Error   | 1005 | Can't create table `db1`.`tab` (errno: 140 "Wrong create options") |
| Warning | 1030 | Got error 140 "Wrong create options" from storage engine InnoDB    |
+---------+------+--------------------------------------------------------------------+
3 rows in set (0.000 sec)
  • los PAGE_COMPRESSED La opción de tabla está configurada en 1, por lo que la compresión de página InnoDB está habilitada, pero el innodb_file_per_table la variable del sistema no está establecida en ON.
SET GLOBAL innodb_file_per_table=OFF;
SET SESSION innodb_strict_mode=ON;

CREATE OR REPLACE TABLE tab (
   id int PRIMARY KEY,
   str varchar(50)
)
PAGE_COMPRESSED=1;
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning |  140 | InnoDB: PAGE_COMPRESSED requires innodb_file_per_table.            |
| Error   | 1005 | Can't create table `db1`.`tab` (errno: 140 "Wrong create options") |
| Warning | 1030 | Got error 140 "Wrong create options" from storage engine InnoDB    |
+---------+------+--------------------------------------------------------------------+
3 rows in set (0.000 sec)
  • los PAGE_COMPRESSED La opción de tabla está configurada en 1, por lo que la compresión de página InnoDB está habilitada, pero el KEY_BLOCK_SIZE También se especifica la opción de tabla.
SET SESSION innodb_strict_mode=ON;

CREATE OR REPLACE TABLE tab (
   id int PRIMARY KEY,
   str varchar(50)
)
PAGE_COMPRESSED=1
KEY_BLOCK_SIZE=4;
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning |  140 | InnoDB: PAGE_COMPRESSED table can't have key_block_size            |
| Error   | 1005 | Can't create table `db1`.`tab` (errno: 140 "Wrong create options") |
| Warning | 1030 | Got error 140 "Wrong create options" from storage engine InnoDB    |
+---------+------+--------------------------------------------------------------------+
3 rows in set (0.000 sec)
  • los PAGE_COMPRESSION_LEVEL La opción de tabla está configurada, pero la PAGE_COMPRESSED La opción de tabla está configurada en 0, por lo que la compresión de páginas InnoDB está desactivada.
SET SESSION innodb_strict_mode=ON;

CREATE OR REPLACE TABLE tab (
   id int PRIMARY KEY,
   str varchar(50)
)
PAGE_COMPRESSED=0
PAGE_COMPRESSION_LEVEL=9;
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning |  140 | InnoDB: PAGE_COMPRESSION_LEVEL requires PAGE_COMPRESSED            |
| Error   | 1005 | Can't create table `db1`.`tab` (errno: 140 "Wrong create options") |
| Warning | 1030 | Got error 140 "Wrong create options" from storage engine InnoDB    |
+---------+------+--------------------------------------------------------------------+
3 rows in set (0.000 sec)

MariaDB hasta 10.2

En MariaDB 10.2 y anteriores, el error se genera en los siguientes casos adicionales:

  • los KEY_BLOCK_SIZE La opción de tabla se establece en un valor distinto de cero, pero la innodb_file_format la variable del sistema no está establecida en Barracuda.
SET GLOBAL innodb_file_format='Antelope';
SET SESSION innodb_strict_mode=ON;

CREATE OR REPLACE TABLE tab (
   id int PRIMARY KEY,
   str varchar(50)
)
KEY_BLOCK_SIZE=4;
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning | 1478 | InnoDB: KEY_BLOCK_SIZE requires innodb_file_format > Antelope.     |
| Error   | 1005 | Can't create table `db1`.`tab` (errno: 140 "Wrong create options") |
| Warning | 1030 | Got error 140 "Wrong create options" from storage engine InnoDB    |
+---------+------+--------------------------------------------------------------------+
3 rows in set (0.00 sec)
SET GLOBAL innodb_file_format='Antelope';
SET SESSION innodb_strict_mode=ON;

CREATE OR REPLACE TABLE tab (
   id int PRIMARY KEY,
   str varchar(50)
)
ROW_FORMAT=COMPRESSED;
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+-----------------------------------------------------------------------+
| Level   | Code | Message                                                               |
+---------+------+-----------------------------------------------------------------------+
| Warning | 1478 | InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_format > Antelope. |
| Error   | 1005 | Can't create table `db1`.`tab` (errno: 140 "Wrong create options")    |
| Warning | 1030 | Got error 140 "Wrong create options" from storage engine InnoDB       |
+---------+------+-----------------------------------------------------------------------+
3 rows in set (0.00 sec)
  • los PAGE_COMPRESSED La opción de tabla está configurada en 1, por lo que la compresión de página InnoDB está habilitada, pero el innodb_file_format la variable del sistema no está establecida en Barracuda.
SET GLOBAL innodb_file_format='Antelope';
SET SESSION innodb_strict_mode=ON;

CREATE OR REPLACE TABLE tab (
   id int PRIMARY KEY,
   str varchar(50)
)
PAGE_COMPRESSED=1;
SHOW WARNINGS;
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")

SHOW WARNINGS;
+---------+------+--------------------------------------------------------------------+
| Level   | Code | Message                                                            |
+---------+------+--------------------------------------------------------------------+
| Warning |  140 | InnoDB: PAGE_COMPRESSED requires innodb_file_format > Antelope.    |
| Error   | 1005 | Can't create table `db1`.`tab` (errno: 140 "Wrong create options") |
| Warning | 1030 | Got error 140 "Wrong create options" from storage engine InnoDB    |
+---------+------+--------------------------------------------------------------------+
3 rows in set (0.00 sec)

Formato de fila COMPRIMIDO

Si el modo estricto InnoDB está habilitado, y si una tabla usa el COMPRESSED formato de fila, y si la tabla KEY_BLOCK_SIZE es demasiado pequeño para contener una fila, la instrucción devuelve un error.

Tamaño de fila demasiado grande

Si el modo estricto InnoDB está habilitado, y si una tabla excede el tamaño de fila máximo de su formato de fila, InnoDB devolverá un error.

ERROR 1118 (42000): 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.

Consulte Solución de problemas de errores de tamaño de fila demasiado grandes con InnoDB para obtener más información.

El contenido reproducido en este sitio es propiedad de sus respectivos dueños, y MariaDB no revisa este contenido con anticipación. Los puntos de vista, la información y las opiniones expresadas por este contenido no representan necesariamente las de MariaDB o de cualquier otra parte.