Spec-Zone.ru › MySQL 5.7

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=n unless ROW_FORMAT=COMPRESSED.

Если вы работаете с 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

Таблица 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=n Табличные пространства с файлом на таблицу требуют 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

Таблица 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=COMPRESSED
           KEY_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=COMPRESSED
           KEY_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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/innodb-compression-syntax-warnings.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API