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= |
Если вы работаете с 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
| Параметр | Примечания к использованию | Описание |
|---|---|---|
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= | Указывает размер сжатой страницы в 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
| Синтаксис | Условие предупреждения или ошибки | Результат 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=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. Для получения дополнительной информации см. Раздел 15.1.22, «CREATE TABLESPACE Statement».
Для получения дополнительной информации об использовании сжатых таблиц с общими табличными областями см. Раздел 17.6.3.3, «Общие табличные области».
© 2025 Oracle
Licensed under the GPLv2 License.