Spec-Zone.ru › MySQL 8.4

17.9.1.7 Предупреждения и ошибки синтаксиса сжатия SQL

В этом разделе описываются предупреждения и ошибки синтаксиса, которые могут возникнуть при использовании функции сжатия таблиц с пространствами имен и .

Предупреждения и ошибки синтаксиса сжатия SQL для пространств имен с файлами на таблицу

Когда innodb_strict_mode включен (по умолчанию), указание ROW_FORMAT=COMPRESSED или KEY_BLOCK_SIZE в CREATE TABLE или ALTER TABLE операторах приводит к следующей ошибке, если innodb_file_per_table отключен.

ERROR 1031 (HY000): Table storage engine for 't1' doesn't 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.                          |
+---------+------+---------------------------------------------------------------+
Примечание

Эти сообщения являются только предупреждениями, а не ошибками, и таблица создается без сжатия, как если бы эти параметры не были указаны.

Поведение “нестрогого” режима позволяет импортировать файл mysqldump в базу данных, не поддерживающую сжатые таблицы, даже если исходная база данных содержала сжатые таблицы. В этом случае MySQL создает таблицу в ROW_FORMAT=DYNAMIC вместо предотвращения операции.

Чтобы импортировать файл дампов в новую базу данных и пересоздать таблицы так, как они существуют в исходной базе данных, убедитесь, что на сервере установлено соответствующее значение для параметра конфигурации 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, генерирует ошибку, а не предупреждение, и таблица не будет создана.

Таблица 17.11, «Параметры ROW_FORMAT и KEY_BLOCK_SIZE» предоставляет обзор параметров ROW_FORMAT и KEY_BLOCK_SIZE, которые используются с CREATE TABLE или ALTER TABLE.

Таблица 17.11 Параметры ROW_FORMAT и KEY_BLOCK_SIZE

Таблица 17.11 Параметры 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 Хранит значения в странице кластеризованного индекса, если они помещаются; в противном случае хранит только 20-байтовый указатель на страницу переполнения (без префикса)
ROW_FORMAT=​COMPRESSED Сжимает таблицу и индексы с помощью zlib
KEY_BLOCK_​SIZE=n Указывает размер сжатой страницы в 1, 2, 4, 8 или 16 килобайт; подразумевает ROW_FORMAT=COMPRESSED. Для общих пространств имен, значение KEY_BLOCK_SIZE, равное размеру страницы InnoDB, недопустимо.

Таблица 17.12, «Предупреждения и ошибки CREATE/ALTER TABLE при отключенном режиме строгости InnoDB» обобщает условия ошибок, которые возникают при определенных сочетаниях параметров конфигурации и параметров в операторах 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) |
+-------+------+-------------------------------------------+

Таблица 17.12 Предупреждения и ошибки CREATE/ALTER TABLE при отключенном режиме строгости InnoDB

Таблица 17.12 Предупреждения и ошибки CREATE/ALTER TABLE при отключенном режиме строгости InnoDB
Синтаксис Состояние предупреждения или ошибки Результат ROW_FORMAT, как показано в SHOW TABLE STATUS
ROW_FORMAT=REDUNDANT Нет REDUNDANT
ROW_FORMAT=COMPACT Нет COMPACT
ROW_FORMAT=COMPRESSED или ROW_FORMAT=DYNAMIC или KEY_BLOCK_SIZE указан Игнорируется для пространств имен с файлами на таблицу, если innodb_file_per_table не включен. Общие пространства имен поддерживают все форматы строк. См. Раздел 17.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. В противном случае выдается ошибка. формат строки по умолчанию или не применимо

Когда innodb_strict_mode ON, MySQL отклоняет недопустимые параметры ROW_FORMAT или KEY_BLOCK_SIZE и выдает ошибки. Режим строгости включен по умолчанию. Когда innodb_strict_mode OFF, 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. Для получения дополнительной информации см. Раздел 15.1.21, «CREATE TABLESPACE Statement».

Для получения дополнительной информации об использовании сжатых таблиц с общими табличными пространствами, см. Раздел 17.6.3.3, «Общие табличные пространства».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/innodb-compression-syntax-warnings.html

Spec-Zone.ru

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