Mysql

如何判斷特定的 MariaDB / MySQL 伺服器是否支持梭子魚儲存格式?

  • June 30, 2022

在為 MySQL/MariaDB(發生在 WordPress 中)創建一些 DDL 生成程式碼時,我需要確定我正在與之交談的 RDBMS 伺服器是否可以支持更新的 Barracuda / DYNAMIC / InnoDB 儲存格式。(該格式允許索引更長的 VARCHAR 列,而舊的 Antelope 格式需要包含超過 768個字節、191 個 utfmb4 字元的列的前綴索引。)

此程式碼的大多數使用者不是專家,大多數 WordPress 站點仍然使用 MySQL 5.5 或 5.6。(因為預算託管供應商。)

是否有一種很好的方法來查詢 RDBMS(通過 SQL)以確定梭子魚是否可用?

現在我有一個討厭的 if-else 級聯來解決這個問題,這裡是用虛擬碼編寫的。

if mysql and version >= 8 then yes
else if mariadb and version >= 10.3 then yes
else if mariadb and version >= 10 and 'innodb_large_prefix' is ON or 1 then yes
else if version <= 5.5.62 then no
else if version <= 5.6.4 then no
else yes

有沒有更好/更清潔/更可靠的方法來解決這個問題?是否有標準——最佳實踐——方式?

請注意,非常有用的“innodb_large_prefix”設置來來去去;它不在最新版本中。

MySQL 5.5.5 之後的所有版本都支持 Barracuda,innodb_file_format預設設置為 Barracuda。也就是說,它預設允許梭子魚文件格式,但您仍然必須明確指定 ROW_FORMAT 為 DYNAMIC 或 COMPRESSED。

這是歸檔的 MySQL 5.5 文件的摘錄:

https://docs.oracle.com/cd/E19957-01/mysql-refman-5.5/storage-engines.html#innodb-file-format-enabling

配置參數innodb_file_format控制這些命令是否可以用於創建依賴於“梭子魚”文件格式支持的表CREATE TABLEALTER TABLE

在 MySQL 5.5.5 及更高版本中,預設值為“梭子魚”。

(事實上,如果你啟用 InnoDB 外掛而不是舊的“內置”InnoDB,MySQL 5.1 也可以支持 Barracuda。)

在 MySQL 5.7 中,他們引入了該innodb_default_row_format選項,預設值為 DYNAMIC,因此表預設為 Barracuda。

同樣在 MySQL 5.7 中,innodb_large_prefix引入了預設啟用。您禁用它的唯一原因是創建與降級版本兼容的表。

在 MySQL 8.0 中,該變數innodb_file_format被刪除。這沒有實際意義,因為梭子魚始終處於啟用狀態,並且始終是預設文件格式。也就是說,如果不進行邏輯轉儲和恢復,就不能從 8.0 降級到 MySQL 5.0(在實施梭子魚之前)。

innodb_large_prefix變數也已在 8.0 中刪除。它在最新的 MySQL 版本中從未被禁用。

您可以假設一個新版本,而不是版本檢查,並擷取#1709 - Index column size too large錯誤,回退到表創建/更改的 767 字節索引前綴版本。

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