文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
手冊頁 (TGZ) - 258.2Kb
手冊頁 (Zip) - 365.3Kb
資訊 (Gzip) - 4.0Mb
資訊 (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  SQL 壓縮語法警告與錯誤

17.9.1.7 SQL 壓縮語法警告與錯誤

本節描述當您使用具有每個資料表檔案表空間和通用表空間的資料表壓縮功能時,可能會遇到的語法警告與錯誤。

每個資料表檔案表空間的 SQL 壓縮語法警告與錯誤

innodb_strict_mode啟用時(預設值),若innodb_file_per_table已停用,在CREATE TABLEALTER TABLE陳述式中指定ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE會產生下列錯誤。

ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option
注意

若目前設定不允許使用壓縮資料表,則不會建立資料表。

innodb_strict_mode停用時,若innodb_file_per_table已停用,在CREATE TABLEALTER TABLE陳述式中指定ROW_FORMAT=COMPRESSEDKEY_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_FORMATKEY_BLOCK_SIZE會產生警告,您可以使用SHOW WARNINGS檢視該警告。不過,資料表是非壓縮的;系統會忽略指定的KEY_BLOCK_SIZE)。

層級 代碼 訊息
警告 1478 InnoDB:忽略 KEY_BLOCK_SIZE=n,除非 ROW_FORMAT=COMPRESSED。

如果您在啟用innodb_strict_mode的情況下執行,則帶有除COMPRESSED以外的任何ROW_FORMATKEY_BLOCK_SIZE組合會產生錯誤,而不是警告,且不會建立資料表。

表 17.11,「ROW_FORMAT 和 KEY_BLOCK_SIZE 選項」概述了與CREATE TABLEALTER TABLE一起使用的ROW_FORMATKEY_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 KB;隱含 ROW_FORMAT=COMPRESSED。對於一般表格空間,不允許 KEY_BLOCK_SIZE 值等於 InnoDB 頁面大小。

表 17.12,「當 InnoDB 嚴格模式為關閉時,CREATE/ALTER TABLE 的警告和錯誤」概述了在 CREATE TABLEALTER TABLE 陳述式中,配置參數和選項的某些組合所發生的錯誤情況,以及選項如何在 SHOW TABLE STATUS 的輸出中顯示。

innodb_strict_modeOFF 時,MySQL 會建立或變更表格,但會忽略某些設定,如下所示。您可以在 MySQL 錯誤日誌中看到警告訊息。當 innodb_strict_modeON 時,這些指定的選項組合會產生錯誤,並且不會建立或變更表格。若要查看錯誤狀況的完整描述,請執行 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=COMPRESSEDROW_FORMAT=DYNAMICKEY_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
使用 REDUNDANTCOMPACTDYNAMIC 列格式指定了 KEY_BLOCK_SIZE KEY_BLOCK_SIZE 會被忽略 REDUNDANTCOMPACTDYNAMIC
ROW_FORMAT 不是 REDUNDANTCOMPACTDYNAMICCOMPRESSED 其中之一 如果 MySQL 解析器可辨識,則會忽略。否則,會發出錯誤。 預設列格式或 N/A

innodb_strict_modeON 時,MySQL 會拒絕無效的 ROW_FORMATKEY_BLOCK_SIZE 參數,並發出錯誤。嚴格模式預設為 ON。當 innodb_strict_modeOFF 時,MySQL 會針對忽略的無效參數發出警告,而不是錯誤。

無法使用 SHOW TABLE STATUS 查看選擇的 KEY_BLOCK_SIZESHOW 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 節,「一般表格空間」