本節描述當您使用具有每個資料表檔案表空間和通用表空間的資料表壓縮功能時,可能會遇到的語法警告與錯誤。
每個資料表檔案表空間的 SQL 壓縮語法警告與錯誤
當innodb_strict_mode
啟用時(預設值),若innodb_file_per_table
已停用,在CREATE TABLE
或ALTER TABLE
陳述式中指定ROW_FORMAT=COMPRESSED
或KEY_BLOCK_SIZE
會產生下列錯誤。
ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option
若目前設定不允許使用壓縮資料表,則不會建立資料表。
當innodb_strict_mode
停用時,若innodb_file_per_table
已停用,在CREATE TABLE
或ALTER TABLE
陳述式中指定ROW_FORMAT=COMPRESSED
或KEY_BLOCK_SIZE
會產生下列警告。
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
組態參數的正確設定。
只有在ROW_FORMAT
指定為COMPRESSED
或省略時,才允許使用屬性KEY_BLOCK_SIZE
。指定帶有任何其他ROW_FORMAT
的KEY_BLOCK_SIZE
會產生警告,您可以使用SHOW WARNINGS
檢視該警告。不過,資料表是非壓縮的;系統會忽略指定的KEY_BLOCK_SIZE
)。
層級 | 代碼 | 訊息 |
---|---|---|
警告 | 1478 | InnoDB:忽略 KEY_BLOCK_SIZE= |
如果您在啟用innodb_strict_mode
的情況下執行,則帶有除COMPRESSED
以外的任何ROW_FORMAT
的KEY_BLOCK_SIZE
組合會產生錯誤,而不是警告,且不會建立資料表。
表 17.11,「ROW_FORMAT 和 KEY_BLOCK_SIZE 選項」概述了與CREATE TABLE
或ALTER TABLE
一起使用的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= |
指定壓縮頁面大小為 1、2、4、8 或 16 KB;隱含 ROW_FORMAT=COMPRESSED 。對於一般表格空間,不允許 KEY_BLOCK_SIZE 值等於 InnoDB 頁面大小。 |
表 17.12,「當 InnoDB 嚴格模式為關閉時,CREATE/ALTER TABLE 的警告和錯誤」概述了在 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 當 InnoDB 嚴格模式為關閉時,CREATE/ALTER TABLE 的警告和錯誤
語法 | 警告或錯誤情況 | 在 SHOW TABLE STATUS 中顯示的結果 ROW_FORMAT |
---|---|---|
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 節,「一般表格空間」。 |
每個表格的表格空間的預設列格式;一般表格空間的指定列格式 |
指定了無效的 KEY_BLOCK_SIZE (不是 1、2、4、8 或 16) |
KEY_BLOCK_SIZE 會被忽略 |
指定的列格式,或預設列格式 |
指定了 ROW_FORMAT=COMPRESSED 和有效的 KEY_BLOCK_SIZE |
無;會使用指定的 KEY_BLOCK_SIZE |
COMPRESSED |
使用 REDUNDANT 、COMPACT 或 DYNAMIC 列格式指定了 KEY_BLOCK_SIZE |
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
參數,並發出錯誤。嚴格模式預設為 ON
。當 innodb_strict_mode
為 OFF
時,MySQL 會針對忽略的無效參數發出警告,而不是錯誤。
無法使用 SHOW TABLE STATUS
查看選擇的 KEY_BLOCK_SIZE
。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 陳述式」。
如需有關使用壓縮表格和一般表格空間的更多資訊,請參閱第 17.6.3.3 節,「一般表格空間」。