InnoDB Strict Mode
InnoDB strict mode is similar to SQL strict mode. When it is enabled, certain InnoDB warnings become errors instead.
Configuring InnoDB Strict Mode
In MariaDB 10.2.2 and later, InnoDB strict mode is enabled by default.
InnoDB strict mode can be enabled or disabled by configuring the innodb_strict_mode
server system variable.
Its global value can be changed dynamically with SET GLOBAL
. For example:
SET GLOBAL innodb_strict_mode=ON;
Its value for the current session can also be changed dynamically with SET SESSION
. For example:
SET SESSION innodb_strict_mode=ON;
It can also be set in a server option group in an option file prior to starting up the server. For example:
[mariadb] ... innodb_strict_mode=ON
InnoDB Strict Mode Errors
Wrong Create Options
If InnoDB strict mode is enabled, and if a DDL statement is executed and invalid or conflicting table options are specified, then an error is raised. The error will only be a generic error that says the following:
ERROR 1005 (HY000): Can't create table `db1`.`tab` (errno: 140 "Wrong create options")
However, more details about the error can be found by executing SHOW WARNINGS
.
For example, the error is raised in the following cases:
- The
KEY_BLOCK_SIZE
table option is set to a non-zero value, but theROW_FORMAT
table option is set to some row format other than theCOMPRESSED
row format. For example:
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)
- The
KEY_BLOCK_SIZE
table option is set to a non-zero value, but the configured value is larger than either16
or the value of theinnodb_page_size
system variable, whichever is smaller.
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)
- The
KEY_BLOCK_SIZE
table option is set to a non-zero value, but theinnodb_file_per_table
system variable is not set toON
.
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)
- The
KEY_BLOCK_SIZE
table option is set to a non-zero value, but it is not set to one of the supported values: [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)
- The
ROW_FORMAT
table option is set to theCOMPRESSED
row format, but theinnodb_file_per_table
system variable is not set toON
.
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)
- The
ROW_FORMAT
table option is set to a value, but it is not set to one of the values supported by InnoDB:REDUNDANT
,COMPACT
,DYNAMIC
, andCOMPRESSED
.
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)
- Either the
KEY_BLOCK_SIZE
table option is set to a non-zero value or theROW_FORMAT
table option is set to theCOMPRESSED
row format, but theinnodb_page_size
system variable is set to a value greater than16k
.
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)
- The
DATA DIRECTORY
table option is set, but theinnodb_file_per_table
system variable is not set toON
.
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)
- The
DATA DIRECTORY
table option is set, but the table is a temporary table.
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)
- The
INDEX DIRECTORY
table option is set.
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)
- The
PAGE_COMPRESSED
table option is set to1
, so InnoDB page compression is enabled, but theROW_FORMAT
table option is set to some row format other than theCOMPACT
orDYNAMIC
row formats.
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)
- The
PAGE_COMPRESSED
table option is set to1
, so InnoDB page compression is enabled, but theinnodb_file_per_table
system variable is not set toON
.
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)
- The
PAGE_COMPRESSED
table option is set to1
, so InnoDB page compression is enabled, but theKEY_BLOCK_SIZE
table option is also specified.
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)
- The
PAGE_COMPRESSION_LEVEL
table option is set, but thePAGE_COMPRESSED
table option is set to0
, so InnoDB page compression is disabled.
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)
In MariaDB 10.2 and before, the error is raised in the following additional cases:
- The
KEY_BLOCK_SIZE
table option is set to a non-zero value, but theinnodb_file_format
system variable is not set toBarracuda
.
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)
- The
ROW_FORMAT
table option is set to either theCOMPRESSED
or theDYNAMIC
row format, but theinnodb_file_format
system variable is not set toBarracuda
.
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)
- The
PAGE_COMPRESSED
table option is set to1
, so InnoDB page compression is enabled, but theinnodb_file_format
system variable is not set toBarracuda
.
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 Row Format
If InnoDB strict mode is enabled, and if a table uses the COMPRESSED
row format, and if the table's KEY_BLOCK_SIZE
is too small to contain a row, then an error is returned by the statement.
Row Size Too Large
If InnoDB strict mode is enabled, and if a table exceeds its row format's maximum row size, then InnoDB will return an 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.
See Troubleshooting Row Size Too Large Errors with InnoDB for more information.
© 2021 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/