Spec-Zone.ru › MySQL 9.2

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

Таблица 17.12 Предупреждения и ошибки CREATE/ALTER TABLE при отключенном режиме InnoDB Strict Mode
Синтаксис Условие предупреждения или ошибки Результат 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 и выдает ошибки. Режим строгости по умолчанию ON. Когда 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.22, «CREATE TABLESPACE Statement».

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

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

Spec-Zone.ru

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