Режим InnoDB Strict
InnoDB строгий режим аналогичен строгому режиму SQL. При его включении некоторые предупреждения InnoDB становятся ошибками.
Настройка строгого режима InnoDB
Строгий режим InnoDB включен по умолчанию.
Строгий режим InnoDB можно включить или отключить, настроив переменную серверной системы innodb_strict_mode.
Её глобальное значение можно динамически изменить с помощью SET GLOBAL. Например:
SET GLOBAL innodb_strict_mode=ON;
Значение для текущей сессии также можно динамически изменить с помощью SET SESSION. Например:
SET SESSION innodb_strict_mode=ON;
Его также можно установить в группе параметров сервера группы параметров в файле параметров файле параметров перед запуском сервера. Например:
[mariadb] ... innodb_strict_mode=ON
Ошибки строгого режима InnoDB
Неправильные параметры создания
Если строгий режим InnoDB включен, и если выполняется оператор DDL, и указаны неверные или конфликтные параметры таблицы, то возникает ошибка. Ошибка будет общей ошибкой, которая гласит следующее:
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")
Однако, более подробную информацию об ошибке можно получить, выполнив SHOW WARNINGS.
Например, ошибка возникает в следующих случаях:
- Параметр таблицы KEY_BLOCK_SIZE установлен на ненулевое значение, но параметр таблицы ROW_FORMAT установлен на какой-либо формат строк, кроме формата строк COMPRESSED. Например:
SET SESSION innodb_strict_mode=ON; CREATE OR REPLACE TABLE tab ( id int PRIMARY KEY, 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 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)
- Параметр таблицы KEY_BLOCK_SIZE установлен на ненулевое значение, но установленное значение больше либо KEY_BLOCK_SIZE либо значения переменной системы innodb_page_size, в зависимости от того, какое из них меньше.
SET SESSION innodb_strict_mode=ON; CREATE OR REPLACE TABLE tab ( id int PRIMARY KEY, 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 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)
- Параметр таблицы KEY_BLOCK_SIZE установлен на ненулевое значение, но переменная системы innodb_file_per_table не установлена в значение
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) ) 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 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)
- Параметр таблицы KEY_BLOCK_SIZE установлен на ненулевое значение, но не установлено на одно из поддерживаемых значений: [1, 2, 4, 8, 16].
SET SESSION innodb_strict_mode=ON; CREATE OR REPLACE TABLE tab ( id int PRIMARY KEY, 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 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)
- Параметр таблицы ROW_FORMAT установлен на формат строк COMPRESSED, но переменная системы innodb_file_per_table не установлена в значение
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) ) 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 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)
- Параметр таблицы ROW_FORMAT установлен на значение, но не установлено на одно из значений, поддерживаемых InnoDB: REDUNDANT, COMPACT, DYNAMIC и COMPRESSED.
SET SESSION innodb_strict_mode=ON; CREATE OR REPLACE TABLE tab ( id int PRIMARY KEY, 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 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)
- Параметр таблицы KEY_BLOCK_SIZE установлен на ненулевое значение или параметр таблицы ROW_FORMAT установлен на формат строк COMPRESSED, но переменная системы innodb_page_size установлена на значение больше, чем
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)
- Параметр таблицы DATA DIRECTORY установлен, но переменная системы innodb_file_per_table не установлена в значение
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) ) 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)
- Параметр таблицы DATA DIRECTORY установлен, но таблица является временной таблицей.
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)
- Параметр таблицы INDEX DIRECTORY установлен.
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)
- Параметр таблицы PAGE_COMPRESSED установлен на
1, поэтому сжатие страниц InnoDB включено, но параметр таблицы ROW_FORMAT установлен на какой-либо другой формат строк, кроме COMPACT или DYNAMIC.
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)
- Параметр таблицы PAGE_COMPRESSED установлен на
1, поэтому сжатие страниц InnoDB включено, но переменная системы innodb_file_per_table не установлена в значение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)
- Параметр таблицы PAGE_COMPRESSED установлен на
1, поэтому сжатие страниц InnoDB включено, но также указан параметр таблицы KEY_BLOCK_SIZE.
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)
- Параметр таблицы PAGE_COMPRESSION_LEVEL установлен, но параметр таблицы PAGE_COMPRESSED установлен на
0, поэтому сжатие страниц InnoDB отключено.
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 10.2 и ранее ошибка возникает в следующих дополнительных случаях:
- Параметр таблицы KEY_BLOCK_SIZE установлен на ненулевое значение, но переменная системы innodb_file_format не установлена в значение
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)
- Параметр таблицы ROW_FORMAT установлен на формат строк COMPRESSED или DYNAMIC, но переменная системы innodb_file_format не установлена в значение
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) ) 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)
- Параметр таблицы PAGE_COMPRESSED установлен на
1, поэтому сжатие страниц InnoDB включено, но переменная системы innodb_file_format не установлена в значение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)
Формат строк COMPRESSED
Если строгий режим InnoDB включён, и если таблица использует формат строк COMPRESSED, и если размер блока ключей таблицы KEY_BLOCK_SIZE слишком мал для строки, то оператор возвращает ошибку.
Размер строки слишком большой
Если строгий режим InnoDB включен, и если таблица превышает максимальный размер строки для своего формата строк, InnoDB вернёт ошибку.
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.
См. Устранение ошибок «Размер строки слишком большой» с InnoDB для получения дополнительной информации.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/innodb-strict-mode/