Mysql

無法使用 innodb 打開壓縮

  • April 8, 2022

我無法使用壓縮創建新表。

我正在使用以下選項,據我所知,這些選項應該允許我使用壓縮。

default-storage-engine          = InnoDB
innodb_large_prefix             = true
innodb_file_format              = barracuda
innodb_file_per_table           = true

這是全新安裝的 MySQL,這些配置選項在創建新數據庫之前已設置,因此應設置每個表的文件。

當我嘗試創建一個新表時,我得到以下響應:

CREATE TABLE IF NOT EXISTS `db_example`.`table_example` (
  `ugid` INT NOT NULL,
  `uid` INT NOT NULL,
  PRIMARY KEY (`ugid`, `uid`))
  ENGINE=InnoDB ROW_FORMAT=COMPRESSED;;

錯誤資訊:

Error Code: 1031. Table storage engine for 'table_example' doesn't have this option.

我不明白為什麼會發生這種情況,因為儲存引擎設置為 innodb,它應該支持壓縮。

此外。如果我通過禁用 innodb 嚴格模式來強製完成模式的創建,然後嘗試更改啟用壓縮的表:

ALTER TABLE ${table_goes_here} ROW_FORMAT=COMPRESSED;

我得到以下資訊:

ERROR 1478 (HY000) at line 1: Table storage engine 'InnoDB' does not support the create option 'ROW_TYPE'

錯誤程式碼:1031。“table_example”的表儲存引擎沒有此選項。

我已經經歷了你的錯誤,它基於ROW_FORMAT.

根據此處的 MySQL 文件,如果省略 ENGINE 選項,則使用預設儲存引擎。The default engine is InnoDB as of MySQL 5.5.5MyISAM之前5.5.5)。您可以通過使用 –default-storage-engine 伺服器啟動選項來指定預設引擎,或者通過在**my.cnf(對於 Linux 環境)或my.ini**(對於 Windows 環境)配置文件中設置 default-storage-engine 選項。

正如 MySQL在此處記錄的那樣 InnoDB 表的預設行格式由 innodb_default_row_format 變數定義,該變數的預設值為 DYNAMIC。當 ROW_FORMAT 表選項未顯式定義或**ROW_FORMAT=DEFAULT**指定時使用預設行格式。

COMPRESSED格式提供與 DYNAMIC 行格式相同的儲存特性和功能,但增加了對錶和索引數據壓縮的支持。COMPRESSED 行格式支持最多 3072 字節的索引鍵前綴。此功能innodb_large_prefix由預設啟用的變數控制。

**注意:**緊湊型行格式系列還可以在使用可變長度字元集(例如utf8mb3 or )時優化 CHAR 列儲存utf8mb4

為了進一步參考這裡這裡

對我來說,問題是我之前在表格上啟用了頁面壓縮

ALTER TABLE t1 COMPRESSION="zlib";

這使我無法應用壓縮的行格式:

ALTER TABLE t1 ROW_FORMAT=COMPRESSED;

..我嘗試時導致以下錯誤:

Error Code: 1031. Table storage engine for 't1' doesn't have this option.

我能夠通過刪除表格上的頁面壓縮來解決問題:

ALTER TABLE t1 COMPRESSION="None";

這使我能夠應用壓縮的行格式。看看刪除頁面壓縮是否能為您解決問題。

引用自:https://dba.stackexchange.com/questions/228504