本節說明當您將資料表壓縮功能與每個資料表檔案表格空間和一般表格空間搭配使用時,可能會遇到的語法警告和錯誤。
每個資料表檔案表格空間的 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的情況下執行,則具有KEY_BLOCK_SIZE的任何ROW_FORMAT組合 (而非COMPRESSED) 都會產生錯誤 (而不是警告),並且不會建立資料表。
資料表 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 節,「一般表空間」。