14.9.1.7 Предупреждения и ошибки синтаксиса сжатия InnoDB
В этом разделе описываются предупреждения и ошибки синтаксиса, которые могут возникнуть при использовании функции сжатия таблиц с табличными пространствами и .
Предупреждения и ошибки синтаксиса сжатия SQL для табличных пространств с файлом на таблицу
Когда innodb_strict_mode включено (по умолчанию), указание ROW_FORMAT=COMPRESSED или KEY_BLOCK_SIZE в CREATE
TABLE или ALTER TABLE операторах приводит к следующей ошибке, если innodb_file_per_table отключено или если innodb_file_format установлено в значение Antelope, а не Barracuda.
ERROR 1031 (HY000): Table storage engine for 't1' does not have this option
Таблица не создается, если текущая конфигурация не позволяет использовать сжатые таблицы.
Когда innodb_strict_mode отключено, указание ROW_FORMAT=COMPRESSED или KEY_BLOCK_SIZE в CREATE
TABLE или ALTER TABLE операторах приводит к следующим предупреждениям, если innodb_file_per_table отключено.
mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------------------+
| Warning | 1478 | InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table. |
| Warning | 1478 | InnoDB: ignoring KEY_BLOCK_SIZE=4. |
| Warning | 1478 | InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table. |
| Warning | 1478 | InnoDB: assuming ROW_FORMAT=DYNAMIC. |
+---------+------+---------------------------------------------------------------+
Аналогичные предупреждения выдаются, если innodb_file_format установлено в значение Antelope, а не Barracuda.
Эти сообщения являются только предупреждениями, а не ошибками, и таблица создается без сжатия, как если бы параметры не были указаны.
Поведение “non-strict” позволяет импортировать файл mysqldump в базу данных, которая не поддерживает сжатые таблицы, даже если исходная база данных содержала сжатые таблицы. В этом случае MySQL создает таблицу в ROW_FORMAT=COMPACT вместо предотвращения операции.
Чтобы импортировать файл дампов в новую базу данных и пересоздать таблицы так, как они существуют в исходной базе данных, убедитесь, что на сервере установлены правильные настройки для параметров конфигурации innodb_file_format и innodb_file_per_table.
Атрибут KEY_BLOCK_SIZE разрешен только тогда, когда ROW_FORMAT указан как COMPRESSED или опущен. Указание KEY_BLOCK_SIZE с любым другим ROW_FORMAT генерирует предупреждение, которое можно просмотреть с помощью SHOW WARNINGS. Однако таблица не сжимается; указанное KEY_BLOCK_SIZE игнорируется).
| Уровень | Код | Сообщение |
|---|---|---|
| Предупреждение | 1478 | InnoDB: ignoring KEY_BLOCK_SIZE= |
Если вы работаете с innodb_strict_mode включенным, сочетание KEY_BLOCK_SIZE с любым ROW_FORMAT, отличным от COMPRESSED, генерирует ошибку, а не предупреждение, и таблица не создается.
Таблица 14.6, «Параметры ROW_FORMAT и KEY_BLOCK_SIZE» предоставляет обзор параметров ROW_FORMAT и KEY_BLOCK_SIZE, которые используются с CREATE TABLE или ALTER TABLE.
Таблица 14.6 Параметры ROW_FORMAT и KEY_BLOCK_SIZE
| Параметр | Примечания к использованию | Описание |
|---|---|---|
ROW_FORMAT=REDUNDANT | Формат хранения, используемый до MySQL 5.0.3 | Менее эффективен, чем ROW_FORMAT=COMPACT; для обратной совместимости |
ROW_FORMAT=COMPACT | Формат хранения по умолчанию с MySQL 5.0.3 | Хранит префикс из 768 байт значений длинных столбцов в странице кластеризованного индекса, а оставшиеся байты хранятся в странице переполнения |
ROW_FORMAT=DYNAMIC | Табличные пространства с файлом на таблицу требуют innodb_file_format=Barracuda
| Хранит значения в странице кластеризованного индекса, если они помещаются; если нет, хранит только 20-байтовый указатель на страницу переполнения (без префикса) |
ROW_FORMAT=COMPRESSED | Табличные пространства с файлом на таблицу требуют innodb_file_format=Barracuda
| Сжимает таблицу и индексы с помощью zlib |
KEY_BLOCK_SIZE= | Табличные пространства с файлом на таблицу требуют innodb_file_format=Barracuda
| Указывает размер сжатой страницы в 1, 2, 4, 8 или 16 килобайтах; подразумевает ROW_FORMAT=COMPRESSED. Для общих табличных пространств значение KEY_BLOCK_SIZE, равное размеру страницы InnoDB, не разрешается. |
Таблица 14.7, «Предупреждения и ошибки CREATE/ALTER TABLE при отключенном режиме InnoDB Strict» суммирует условия ошибок, которые возникают при определенных сочетаниях параметров конфигурации и параметров в CREATE TABLE или ALTER TABLE операторах, и как эти параметры отображаются в выводе SHOW TABLE
STATUS.
Когда innodb_strict_mode равно OFF, MySQL создает или изменяет таблицу, но игнорирует определенные настройки, как показано ниже. Вы можете увидеть сообщения об ошибках в журнале ошибок MySQL. Когда innodb_strict_mode равно ON, эти указанные сочетания параметров генерируют ошибки, и таблица не создается или не изменяется. Чтобы увидеть полное описание условия ошибки, выполните оператор SHOW ERRORS: пример:
mysql> CREATE TABLE x (id INT PRIMARY KEY, c INT)
-> ENGINE=INNODB KEY_BLOCK_SIZE=33333;
ERROR 1005 (HY000): Can't create table 'test.x' (errno: 1478)
mysql> SHOW ERRORS;
+-------+------+-------------------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------------------+
| Error | 1478 | InnoDB: invalid KEY_BLOCK_SIZE=33333. |
| Error | 1005 | Can't create table 'test.x' (errno: 1478) |
+-------+------+-------------------------------------------+
Таблица 14.7 Предупреждения и ошибки CREATE/ALTER TABLE при отключенном режиме InnoDB Strict
| Синтаксис | Условие предупреждения или ошибки | Результат ROW_FORMAT, как показано в SHOW TABLE
STATUS
|
|---|---|---|
ROW_FORMAT=REDUNDANT | Нет | REDUNDANT |
ROW_FORMAT=COMPACT | Нет | COMPACT |
ROW_FORMAT=COMPRESSED или ROW_FORMAT=DYNAMIC или KEY_BLOCK_SIZE указаны | Игнорируются для табличных пространств с файлом на таблицу, если оба innodb_file_format=Barracuda и innodb_file_per_table включены. Общие табличные пространства поддерживают все форматы строк (с некоторыми ограничениями) независимо от innodb_file_format и innodb_file_per_table настроек. См. Раздел 14.6.3.3, «Общие табличные пространства». | the default row format for file-per-table tablespaces; the
specified row format for general tablespaces |
Указан некорректный KEY_BLOCK_SIZE (не 1, 2, 4, 8 или 16) |
KEY_BLOCK_SIZE игнорируется | указанный формат строк или формат строк по умолчанию |
ROW_FORMAT=COMPRESSED и корректный KEY_BLOCK_SIZE указаны | Нет; используется указанный KEY_BLOCK_SIZE | COMPRESSED |
KEY_BLOCK_SIZE указан с REDUNDANT, COMPACT или DYNAMIC форматом строк |
KEY_BLOCK_SIZE игнорируется |
REDUNDANT, COMPACT или DYNAMIC
|
ROW_FORMAT не является одним из REDUNDANT, COMPACT, DYNAMIC или COMPRESSED
| Игнорируется, если распознается анализатором MySQL. В противном случае выдается ошибка. | формат строк по умолчанию или N/A |
Когда innodb_strict_mode равно ON, MySQL отклоняет некорректные параметры ROW_FORMAT или KEY_BLOCK_SIZE и выдает ошибки. Когда innodb_strict_mode равно OFF, MySQL выдает предупреждения вместо ошибок для игнорируемых некорректных параметров. innodb_strict_mode по умолчанию равно ON.
Когда innodb_strict_mode равно ON, MySQL отклоняет некорректные параметры ROW_FORMAT или KEY_BLOCK_SIZE. Для совместимости с более ранними версиями MySQL режим strict не включен по умолчанию; вместо этого MySQL выдает предупреждения (а не ошибки) для игнорируемых некорректных параметров.
Невозможно увидеть выбранный KEY_BLOCK_SIZE, используя SHOW TABLE
STATUS. Выражение SHOW CREATE
TABLE отображает KEY_BLOCK_SIZE (даже если оно было проигнорировано при создании таблицы). Фактический сжатый размер страницы таблицы MySQL отобразить не может.
Предупреждения и ошибки синтаксиса сжатия SQL для общих табличных пространств
-
Если
FILE_BLOCK_SIZEне был определен для общего табличного пространства при его создании, то это табличное пространство не может содержать сжатые таблицы. Если вы попытаетесь добавить сжатую таблицу, будет возвращена ошибка, как показано в следующем примере:mysql>
CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;mysql>CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE=8;ERROR 1478 (HY000): InnoDB: Tablespace `ts1` cannot contain a COMPRESSED table -
Попытка добавить таблицу с недопустимым
KEY_BLOCK_SIZEв общее табличное пространство приводит к ошибке, как показано в следующем примере:mysql>
CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;mysql>CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE=4;ERROR 1478 (HY000): InnoDB: Tablespace `ts2` uses block size 8192 and cannot contain a table with physical page size 4096Для общих табличных пространств
KEY_BLOCK_SIZEтаблицы должно быть равноFILE_BLOCK_SIZEтабличного пространства, делённому на 1024. Например, еслиFILE_BLOCK_SIZEтабличного пространства составляет 8192, тоKEY_BLOCK_SIZEтаблицы должно быть 8. -
Попытка добавить таблицу с несжатым форматом строк в общее табличное пространство, настроенное для хранения сжатых таблиц, приводит к ошибке, как показано в следующем примере:
mysql>
CREATE TABLESPACE `ts3` ADD DATAFILE 'ts3.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;mysql>CREATE TABLE t3 (c1 INT PRIMARY KEY) TABLESPACE ts3 ROW_FORMAT=COMPACT;ERROR 1478 (HY000): InnoDB: Tablespace `ts3` uses block size 8192 and cannot contain a table with physical page size 16384
innodb_strict_mode не применяется к общим табличным пространствам. Правила управления табличными пространствами для общих табличных пространств строго соблюдаются независимо от innodb_strict_mode. Дополнительную информацию см. в Разделе 13.1.19, «Заявление CREATE TABLESPACE».
Дополнительную информацию об использовании сжатых таблиц с общими табличными пространствами см. в Разделе 14.6.3.3, «Общие табличные пространства».
© 2025 Oracle
Licensed under the GPLv2 License.