MySQL8-中文參考-三十二-

绝不原创的飞龙發表於2024-06-23

MySQL8 中文參考(三十二)

原文:docs.oracle.com/javase/tutorial/reallybigindex.html

17.12.2 線上 DDL 效能和併發性

譯文:dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-performance.html

線上 DDL 改進了 MySQL 操作的幾個方面:

  • 訪問表的應用程式更具響應性,因為在 DDL 操作進行時,表上的查詢和 DML 操作可以繼續進行。減少對 MySQL 伺服器資源的鎖定和等待會導致更大的可伸縮性,即使對於不涉及 DDL 操作的操作也是如此。

  • 即時操作僅修改資料字典中的後設資料。在操作執行階段可能會短暫地獲取表的獨佔後設資料鎖。表資料不受影響,使操作瞬間完成。允許併發 DML。

  • 線上操作避免了與表複製方法相關的磁碟 I/O 和 CPU 週期,從而最小化了資料庫的整體負載。減少負載有助於在 DDL 操作期間保持良好的效能和高吞吐量。

  • 線上操作讀取的資料比表複製操作少,這減少了頻繁訪問資料從記憶體中清除的次數。頻繁訪問資料的清除可能導致 DDL 操作後的臨時效能下降。

LOCK 子句

預設情況下,MySQL 在 DDL 操作期間儘可能少地使用鎖定。如果需要,可以為原地操作和一些複製操作指定LOCK子句以強制執行更嚴格的鎖定。如果LOCK子句指定的鎖定級別位元定 DDL 操作允許的鎖定級別更不嚴格,則語句將失敗並顯示錯誤。下面按照從最不嚴格到最嚴格的順序描述了LOCK子句:

  • LOCK=NONE:

    允許併發查詢和 DML。

    例如,對涉及客戶註冊或購買的表使用此子句,以避免在長時間的 DDL 操作期間使表不可用。

  • LOCK=SHARED:

    允許併發查詢但阻止 DML。

    例如,在資料倉儲表上使用此子句,可以延遲資料載入操作直到 DDL 操作完成,但查詢不能被延遲太長時間。

  • LOCK=DEFAULT:

    允許儘可能多的併發性(併發查詢、DML 或兩者兼有)。省略LOCK子句與指定LOCK=DEFAULT相同。

    當您不希望 DDL 語句的預設鎖定級別對錶造成任何可用性問題時,請使用此子句。

  • LOCK=EXCLUSIVE:

    阻止併發查詢和 DML。

    如果主要關注儘快完成 DDL 操作,並且不需要併發查詢和 DML 訪問,則使用此子句。如果伺服器應該處於空閒狀態,以避免意外的表訪問,也可以使用此子句。

線上 DDL 和後設資料鎖

線上 DDL 操作可以看作有三個階段:

  • 階段 1:初始化

    在初始化階段,伺服器確定操作期間允許多少併發性,考慮到儲存引擎的能力、語句中指定的操作以及使用者指定的ALGORITHMLOCK選項。在此階段,會獲取一個共享可升級的後設資料鎖以保護當前表定義。

  • 階段 2: 執行

    在此階段,語句被準備和執行。後設資料鎖是否升級為獨佔取決於初始化階段評估的因素。如果需要獨佔後設資料鎖,則僅在語句準備期間短暫獲取。

  • 階段 3: 提交表定義

    在提交表定義階段,後設資料鎖被升級為獨佔,以清除舊錶定義並提交新表定義。一旦授予,獨佔後設資料鎖的持續時間很短。

由於上述獨佔後設資料鎖要求,線上 DDL 操作可能需要等待對錶上持有後設資料鎖的併發事務進行提交或回滾。在 DDL 操作之前或期間啟動的事務可以在正在更改的表上持有後設資料鎖。在長時間執行或不活動事務的情況下,線上 DDL 操作可能會因等待獨佔後設資料鎖而超時。此外,線上 DDL 操作請求的待處理獨佔後設資料鎖會阻止表上的後續事務。

以下示例演示了一個線上 DDL 操作等待獨佔後設資料鎖的情況,以及待處理後設資料鎖如何阻止表上的後續事務。

會話 1:

mysql> CREATE TABLE t1 (c1 INT) ENGINE=InnoDB;
mysql> START TRANSACTION;
mysql> SELECT * FROM t1;

會話 1 的SELECT語句在表 t1 上獲取了一個共享後設資料鎖。

會話 2:

mysql> ALTER TABLE t1 ADD COLUMN x INT, ALGORITHM=INPLACE, LOCK=NONE;

會話 2 中的線上 DDL 操作需要在表 t1 上獲取獨佔後設資料鎖以提交表定義更改,必須等待會話 1 的事務提交或回滾。

會話 3:

mysql> SELECT * FROM t1;

會話 3 中發出的SELECT語句正在等待會話 2 中的ALTER TABLE操作請求的獨佔後設資料鎖被授予。

您可以使用SHOW FULL PROCESSLIST來確定事務是否在等待後設資料鎖。

mysql> SHOW FULL PROCESSLIST\G
...
*************************** 2\. row ***************************
     Id: 5
   User: root
   Host: localhost
     db: test
Command: Query
   Time: 44
  State: Waiting for table metadata lock
   Info: ALTER TABLE t1 ADD COLUMN x INT, ALGORITHM=INPLACE, LOCK=NONE
...
*************************** 4\. row ***************************
     Id: 7
   User: root
   Host: localhost
     db: test
Command: Query
   Time: 5
  State: Waiting for table metadata lock
   Info: SELECT * FROM t1 4 rows in set (0.00 sec)

後設資料鎖資訊也透過效能模式metadata_locks表暴露出來,該表提供了關於會話之間的後設資料鎖依賴關係、會話正在等待的後設資料鎖以及當前持有後設資料鎖的會話的資訊。更多資訊,請參見 Section 29.12.13.3, “The metadata_locks Table”。

線上 DDL 效能

DDL 操作的效能在很大程度上取決於操作是立即執行、原地執行還是重建表。

要評估 DDL 操作的相對效能,可以比較使用ALGORITHM=INSTANTALGORITHM=INPLACEALGORITHM=COPY的結果。還可以啟用old_alter_table執行語句以強制使用ALGORITHM=COPY

對於修改表資料的 DDL 操作,您可以透過檢視命令完成後顯示的“受影響行數”值來確定 DDL 操作是在原地執行還是執行表複製。例如:

  • 更改列的預設值(快速,不影響表資料):

    Query OK, 0 rows affected (0.07 sec)
    
  • 新增索引(需要時間,但0 rows affected表明表沒有被複制):

    Query OK, 0 rows affected (21.42 sec)
    
  • 更改列的資料型別(需要大量時間,並需要重建表的所有行):

    Query OK, 1671168 rows affected (1 min 35.54 sec)
    

在大表上執行 DDL 操作之前,請按以下方式檢查操作是快還是慢:

  1. 克隆表結構。

  2. 使用少量資料填充克隆表。

  3. 在克隆表上執行 DDL 操作。

  4. 檢查“受影響行數”值是否為零。非零值表示操作複製表資料,這可能需要特殊規劃。例如,您可以在計劃的停機期間執行 DDL 操作,或者逐個在每個副本伺服器上執行。

注意

要更好地瞭解與 DDL 操作相關的 MySQL 處理,可以在 DDL 操作之前和之後檢查與InnoDB相關的效能模式和INFORMATION_SCHEMA表,以檢視物理讀取、寫入、記憶體分配等的數量。

可以使用效能模式階段事件來監視ALTER TABLE的進度。請參閱第 17.16.1 節,“使用效能模式監視 InnoDB 表的 ALTER TABLE 進度”。

由於記錄併發 DML 操作所做的更改涉及一些處理工作,然後在最後應用這些更改,因此線上 DDL 操作的總體時間可能比阻止其他會話訪問表的表複製機制更長。原始效能的降低與對使用表的應用程式更好的響應性之間取得平衡。在評估更改表結構的技術時,考慮基於諸如網頁載入時間等因素的終端使用者對效能的感知。

17.12.3 線上 DDL 空間需求

原文:dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-space-requirements.html

線上 DDL 操作的磁碟空間需求如下所述。這些需求不適用於立即執行的操作。

  • 臨時日誌檔案:

    臨時日誌檔案記錄了線上 DDL 操作建立索引或修改表時的併發 DML。臨時日誌檔案根據innodb_sort_buffer_size的值進行擴充套件,最大擴充套件到innodb_online_alter_log_max_size指定的最大值。如果操作花費很長時間,且併發 DML 修改表的量超過臨時日誌檔案的大小超過innodb_online_alter_log_max_size的值,那麼線上 DDL 操作將因為DB_ONLINE_LOG_TOO_BIG錯誤而失敗,並且未提交的併發 DML 操作將被回滾。設定較大的innodb_online_alter_log_max_size允許線上 DDL 操作期間進行更多的 DML,但也會延長 DDL 操作結束時表被鎖定以應用已記錄 DML 的時間。

    innodb_sort_buffer_size 變數還定義了臨時日誌檔案讀取緩衝區和寫入緩衝區的大小。

  • 臨時排序檔案:

    重建表的線上 DDL 操作在索引建立過程中將臨時排序檔案寫入 MySQL 臨時目錄(Unix 上的$TMPDIR,Windows 上的%TEMP%,或由--tmpdir指定的目錄)。臨時排序檔案不會在包含原始表的目錄中建立。每個臨時排序檔案足夠大以容納一列資料,並且在其資料合併到最終表或索引時將刪除每個排序檔案。涉及臨時排序檔案的操作可能需要臨時空間,等於表中資料加索引的量。如果線上 DDL 操作使用了資料目錄所在檔案系統上所有可用的磁碟空間,則會報告錯誤。

    如果 MySQL 臨時目錄不足以容納排序檔案,請將tmpdir設定為另一個目錄。或者,使用innodb_tmpdir為線上 DDL 操作定義一個單獨的臨時目錄。此選項旨在幫助避免由於大型臨時排序檔案導致的臨時目錄溢位。

  • 中間表檔案:

    一些線上 DDL 操作重新構建表時會在與原始表相同的目錄中建立一個臨時中間表檔案。中間表檔案可能需要與原始表大小相等的空間。中間表檔案的名稱以#sql-ib字首開頭,在線上 DDL 操作期間只會短暫出現。

    innodb_tmpdir選項不適用於中間表檔案。

17.12.4 線上 DDL 記憶體管理

原文:dev.mysql.com/doc/refman/8.0/en/online-ddl-memory-management.html

線上 DDL 操作在建立或重建二級索引的不同階段分配臨時緩衝區。innodb_ddl_buffer_size 變數,於 MySQL 8.0.27 中引入,定義了線上 DDL 操作的最大緩衝區大小。預設設定為 1048576 位元組(1 MB)。該設定適用於執行線上 DDL 操作的執行緒建立的緩衝區。定義適當的緩衝區大小限制可避免線上 DDL 操作建立或重建二級索引時出現潛在的記憶體不足錯誤。每個 DDL 執行緒的最大緩衝區大小是最大緩衝區大小除以 DDL 執行緒數(innodb_ddl_buffer_size/innodb_ddl_threads)。

在 MySQL 8.0.27 之前,innodb_sort_buffer_size 變數定義了線上 DDL 操作建立或重建二級索引的緩衝區大小。

17.12.5 配置線上 DDL 操作的並行執行緒

原文:dev.mysql.com/doc/refman/8.0/en/online-ddl-parallel-thread-configuration.html

在建立或重建二級索引的線上 DDL 操作的工作流程中涉及:

  • 掃描聚簇索引並將資料寫入臨時排序檔案

  • 對資料進行排序

  • 從臨時排序檔案載入排序後的資料到二級索引中

可用於掃描聚簇索引的並行執行緒數由innodb_parallel_read_threads變數定義。預設設定為 4。最大設定為 256,這是所有會話的最大數。掃描聚簇索引的實際執行緒數是由innodb_parallel_read_threads設定或要掃描的索引子樹數中較小的那個數定義的。如果達到執行緒限制,會話將回退到使用單個執行緒。

控制排序和載入資料的並行執行緒數由innodb_ddl_threads變數控制,該變數在 MySQL 8.0.27 中引入。預設設定為 4。在 MySQL 8.0.27 之前,排序和載入操作是單執行緒的。

以下限制適用:

  • 不支援用於構建包含虛擬列的索引的並行執行緒。

  • 完全文字索引建立不支援並行執行緒。

  • 不支援並行執行緒用於空間索引建立。

  • 在定義具有虛擬列的表上不支援並行掃描。

  • 在定義具有全文字索引的表上不支援並行掃描。

  • 在定義具有空間索引的表上不支援並行掃描。

17.12.6 透過線上 DDL 簡化 DDL 語句

譯文:dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-single-multi.html

在引入線上 DDL 之前,將許多 DDL 操作合併為單個ALTER TABLE語句是常見做法。因為每個ALTER TABLE語句都涉及複製和重建表,所以一次對同一表進行多個更改更有效,因為這些更改可以在一次表的重建操作中完成。不利之處在於,涉及 DDL 操作的 SQL 程式碼更難維護和在不同指令碼中重複使用。如果每次具體更改都不同,你可能需要為每個略有不同的情況構建一個新的複雜ALTER TABLE

對於可以線上執行的 DDL 操作,你可以將它們分開為單獨的ALTER TABLE語句,以便更輕鬆地編寫指令碼和維護,而不會犧牲效率。例如,你可以將一個複雜的語句簡化為:

ALTER TABLE t1 ADD INDEX i1(c1), ADD UNIQUE INDEX i2(c2),
  CHANGE c4_old_name c4_new_name INTEGER UNSIGNED;

並將其分解為可以獨立測試和執行的更簡單的部分,例如:

ALTER TABLE t1 ADD INDEX i1(c1);
ALTER TABLE t1 ADD UNIQUE INDEX i2(c2);
ALTER TABLE t1 CHANGE c4_old_name c4_new_name INTEGER UNSIGNED NOT NULL;

你可能仍然使用多部分ALTER TABLE語句來:

  • 必須按特定順序執行的操作,例如建立索引,然後建立使用該索引的外來鍵約束。

  • 所有使用相同特定LOCK子句的操作,你希望它們作為一個組要麼成功要麼失敗。

  • 無法線上執行的操作,即仍使用表複製方法的操作。

  • 為其指定ALGORITHM=COPYold_alter_table=1的操作,以在特定情況下需要精確向後相容性時強制執行表複製行為。

17.12.7 線上 DDL 失敗條件

原文:dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-failure-conditions.html

線上 DDL 操作失敗通常是由以下條件之一導致的:

  • 一個ALGORITHM子句指定了一個與特定型別的 DDL 操作或儲存引擎不相容的演算法。

  • 一個LOCK子句指定了一個低程度的鎖定(SHAREDNONE),這與特定型別的 DDL 操作不相容。

  • 在等待對錶的獨佔鎖時發生超時,這可能在 DDL 操作的初始和最終階段短暫需要。

  • 當 MySQL 在索引建立過程中在磁碟上寫入臨時排序檔案時,tmpdirinnodb_tmpdir檔案系統的磁碟空間不足。有關更多資訊,請參見第 17.12.3 節,“線上 DDL 空間要求”。

  • 該操作需要很長時間,同時併發的 DML 修改了表,使得臨時線上日誌的大小超過了innodb_online_alter_log_max_size配置選項的值。這種情況會導致DB_ONLINE_LOG_TOO_BIG錯誤。

  • 併發的 DML 對錶進行了更改,這些更改在原始表定義中是允許的,但在新表定義中不允許。該操作僅在最後階段失敗,當 MySQL 嘗試應用所有併發 DML 語句的更改時。例如,您可能在建立唯一索引時插入重複值,或者在建立主鍵索引時插入NULL值。併發 DML 所做的更改優先順序更高,並且ALTER TABLE操作實際上被回滾。

17.12.8 線上 DDL 限制

原文:dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl-limitations.html

線上 DDL 操作有以下限制:

  • TEMPORARY TABLE 上建立索引時,表會被複制。

  • 如果表上存在 ON...CASCADEON...SET NULL 約束,則不允許使用 ALTER TABLE 子句 LOCK=NONE

  • 在原地線上 DDL 操作完成之前,必須等待持有表上後設資料鎖的事務提交或回滾。線上 DDL 操作在執行階段可能會短暫地需要表上的獨佔後設資料鎖,並且在更新表定義時的操作的最後階段始終需要一個。因此,持有表上後設資料鎖的事務可能會導致線上 DDL 操作阻塞。持有表上後設資料鎖的事務可能在線上 DDL 操作之前或期間啟動。持有表上後設資料鎖的長時間執行或不活動事務可能會導致線上 DDL 操作超時。

  • 在執行原地線上 DDL 操作時,執行 ALTER TABLE 語句的執行緒會應用同時在其他連線執行緒上併發執行的 DML 操作的線上日誌。當應用 DML 操作時,可能會遇到重複鍵入錯誤(ERROR 1062 (23000): Duplicate entry),即使重複條目只是臨時的,並且會在線上日誌中的後續條目中被撤銷。這類似於 InnoDB 中外來鍵約束檢查的概念,在事務期間約束必須保持。

  • 對於 InnoDB 表的 OPTIMIZE TABLE 被對映為一個 ALTER TABLE 操作,用於重建表並更新索引統計資訊以及釋放聚簇索引中未使用的空間。由於鍵按照它們在主鍵中出現的順序插入,次要索引的建立效率不高。透過為重建常規和分割槽 InnoDB 表提供線上 DDL 支援,支援 OPTIMIZE TABLE

  • 在 MySQL 5.6 之前建立的包含時間列(DATEDATETIMETIMESTAMP)且未使用 ALGORITHM=COPY 重建的表不支援 ALGORITHM=INPLACE。在這種情況下,ALTER TABLE ... ALGORITHM=INPLACE 操作會返回以下錯誤:

    ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported.
    Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
    
  • 在涉及重建表的大表的線上 DDL 操作中,通常適用以下限制:

    • 沒有機制可以暫停線上 DDL 操作或限制線上 DDL 操作的 I/O 或 CPU 使用率。

    • 如果線上 DDL 操作失敗,回滾操作可能會很昂貴。

    • 長時間執行的線上 DDL 操作可能導致複製延遲。線上 DDL 操作必須在源端完成執行後才能在副本上執行。此外,在源端併發處理的 DML 僅在副本上在副本上的 DDL 操作完成後才會處理。

    有關在大表上執行線上 DDL 操作的更多資訊,請參見第 17.12.2 節,“線上 DDL 效能和併發性”。

17.13 InnoDB 資料靜態加密

原文:dev.mysql.com/doc/refman/8.0/en/innodb-data-encryption.html

InnoDB支援對 file-per-table 表空間、通用表空間、mysql系統表空間、重做日誌和撤銷日誌進行資料靜態加密。

截至 MySQL 8.0.16 版本,還支援為模式和通用表空間設定加密預設值,這使得 DBA 可以控制在這些模式和表空間中建立的表是否加密。

InnoDB資料靜態加密的特性和功能在本節的以下主題中描述。

  • 關於資料靜態加密

  • 加密先決條件

  • 為模式和通用表空間定義加密預設值

  • 檔案-每表表空間加密

  • 通用表空間加密

  • 雙寫檔案加密

  • mysql 系統表空間加密

  • 重做日誌加密

  • 撤銷日誌加密

  • 主金鑰輪換

  • 加密和恢復

  • 匯出加密表空間

  • 加密和複製

  • 識別加密表空間和模式

  • 監控加密進度

  • 加密使用注意事項

  • 加密限制

關於資料靜態加密

InnoDB 使用兩層加密金鑰架構,包括主加密金鑰和表空間金鑰。當一個表空間被加密時,表空間金鑰會被加密並儲存在表空間頭部。當應用程式或經過身份驗證的使用者想要訪問加密的表空間資料時,InnoDB 使用主加密金鑰來解密表空間金鑰。解密後的表空間金鑰版本永遠不會改變,但主加密金鑰可以根據需要更改。這個操作被稱為主金鑰輪換

資料靜態加密功能依賴於金鑰環元件或外掛進行主加密金鑰管理。

所有 MySQL 版本都提供 component_keyring_file 元件和 keyring_file 外掛,每個都將金鑰環資料儲存在伺服器主機本地的檔案中。

MySQL 企業版提供額外的金鑰環元件和外掛:

  • component_keyring_encrypted_file:將金鑰環資料儲存在伺服器主機本地的加密、受密碼保護的檔案中。

  • keyring_encrypted_file:將金鑰環資料儲存在伺服器主機本地的加密、受密碼保護的檔案中。

  • keyring_okv:用於與支援 KMIP 的後端金鑰環儲存產品一起使用的 KMIP 1.1 外掛。支援的 KMIP 相容產品包括集中式金鑰管理解決方案,如 Oracle Key Vault、Gemalto KeySecure、Thales Vormetric 金鑰管理伺服器和 Fornetix Key Orchestration。

  • keyring_aws:與亞馬遜網路服務金鑰管理服務(AWS KMS)通訊,作為金鑰生成的後端,並使用本地檔案進行金鑰儲存。

  • keyring_hashicorp:與 HashiCorp Vault 通訊,作為後端儲存。

警告

對於加密金鑰管理,component_keyring_filecomponent_keyring_encrypted_file 元件,以及 keyring_filekeyring_encrypted_file 外掛並不作為符合監管合規性的解決方案。諸如 PCI、FIPS 等安全標準要求使用金鑰管理系統來在金鑰保險庫或硬體安全模組(HSM)中安全、管理和保護加密金鑰。

安全而強大的加密金鑰管理解決方案對於安全性和符合各種安全標準至關重要。當資料靜態加密功能使用集中式金鑰管理解決方案時,該功能被稱為“MySQL 企業透明資料加密(TDE)”。

資料靜態加密功能支援高階加密標準(AES)塊加密演算法。它使用電子密碼本(ECB)塊加密模式進行表空間金鑰加密,使用密碼塊連結(CBC)塊加密模式進行資料加密。

有關資料靜態加密功能的常見問題,請參見 Section A.17,“MySQL 8.0 FAQ:InnoDB 資料靜態加密”。

加密先決條件

  • 金鑰環元件或外掛必須在啟動時安裝和配置。早期載入確保在初始化InnoDB儲存引擎之前可用該元件或外掛。有關金鑰環安裝和配置說明,請參見 Section 8.4.4,“MySQL 金鑰環”。說明顯示如何確保所選元件或外掛處於活動狀態。

    一次只能啟用一個金鑰環元件或外掛。啟用多個金鑰環元件或外掛是不受支援的,結果可能不如預期。

    重要

    一旦在 MySQL 例項中建立了加密表空間,建立加密表空間時載入的金鑰環元件或外掛必須繼續在啟動時載入。如果未能這樣做,將在啟動伺服器和InnoDB恢復期間出現錯誤。

  • 在加密生產資料時,請確保採取措施防止主加密金鑰丟失。如果主加密金鑰丟失,則儲存在加密表空間檔案中的資料將無法恢復。 如果您使用component_keyring_filecomponent_keyring_encrypted_file元件,或者keyring_filekeyring_encrypted_file外掛,在建立第一個加密表空間後立即建立金鑰環資料檔案的備份,在主金鑰輪換之前和之後。對於每個元件,其配置檔案指示資料檔案位置。keyring_file_data配置選項定義了keyring_file外掛的金鑰環資料檔案位置。keyring_encrypted_file_data配置選項定義了keyring_encrypted_file外掛的金鑰環資料檔案位置。如果您使用keyring_okvkeyring_aws外掛,請確保已執行必要的配置。有關說明,請參見 Section 8.4.4,“MySQL 金鑰環”。

為模式和常規表空間定義加密預設值

從 MySQL 8.0.16 開始,default_table_encryption系統變數定義了模式和常規表空間的預設加密設定。在未明確指定ENCRYPTION子句時,CREATE TABLESPACECREATE SCHEMA操作將應用default_table_encryption設定。

ALTER SCHEMAALTER TABLESPACE操作不適用於default_table_encryption設定。必須明確指定ENCRYPTION子句才能更改現有模式或通用表空間的加密。

可以使用SET語法為單個客戶端連線或全域性設定default_table_encryption變數。例如,以下語句在全域性範圍內啟用預設模式和表空間加密:

mysql> SET GLOBAL default_table_encryption=ON;

還可以在建立或更改模式時使用DEFAULT ENCRYPTION子句來定義模式的預設加密設定,如下例所示:

mysql> CREATE SCHEMA test DEFAULT ENCRYPTION = 'Y';

如果在建立模式時未指定DEFAULT ENCRYPTION子句,則將應用default_table_encryption設定。必須指定DEFAULT ENCRYPTION子句才能更改現有模式的預設加密。否則,模式將保留其當前的加密設定。

預設情況下,表繼承所在模式或通用表空間的加密設定。例如,在啟用加密的模式中建立的表預設是加密的。此行為使得資料庫管理員可以透過定義和強制模式和通用表空間加密預設值來控制表加密的使用。

加密預設值是透過啟用table_encryption_privilege_check系統變數來強制執行的。當啟用table_encryption_privilege_check時,在建立或更改具有與default_table_encryption設定不同的加密設定的模式或通用表空間,或者在建立或更改具有與預設模式加密不同的加密設定的表時,將進行許可權檢查。當禁用table_encryption_privilege_check(預設情況下)時,許可權檢查不會發生,前述操作將被允許繼續並顯示警告。

當啟用table_encryption_privilege_check時,需要TABLE_ENCRYPTION_ADMIN許可權來覆蓋預設加密設定。資料庫管理員可以授予此許可權,以使使用者能夠在建立或更改模式或通用表空間時偏離default_table_encryption設定,或在建立或更改表時偏離預設模式加密。此許可權不允許在建立或更改表時偏離通用表空間的加密。表必須與其所在的通用表空間具有相同的加密設定。

每表表空間加密

從 MySQL 8.0.16 開始,每表表空間將繼承建立表所在模式的預設加密,除非在CREATE TABLE語句中明確指定了一個ENCRYPTION子句。在 MySQL 8.0.16 之前,必須指定ENCRYPTION子句才能啟用加密。

mysql> CREATE TABLE t1 (c1 INT) ENCRYPTION = 'Y';

要更改現有每表表空間的加密方式,必須指定一個ENCRYPTION子句。

mysql> ALTER TABLE t1 ENCRYPTION = 'Y';

從 MySQL 8.0.16 開始,如果啟用了table_encryption_privilege_check變數,則指定一個與預設模式加密不同的設定的ENCRYPTION子句需要TABLE_ENCRYPTION_ADMIN許可權。請參閱為模式和通用表空間定義加密預設值。

通用表空間加密

從 MySQL 8.0.16 開始,default_table_encryption變數確定新建立的通用表空間的加密,除非在CREATE TABLESPACE語句中明確指定了一個ENCRYPTION子句。在 MySQL 8.0.16 之前,必須指定ENCRYPTION子句才能啟用加密。

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' ENCRYPTION = 'Y' Engine=InnoDB;

要更改現有通用表空間的加密方式,必須指定一個ENCRYPTION子句。

mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'Y';

截至 MySQL 8.0.16,如果啟用了table_encryption_privilege_check變數,則指定與default_table_encryption設定不同的設定的ENCRYPTION子句需要TABLE_ENCRYPTION_ADMIN許可權。參見為模式和通用表空間定義加密預設值。

雙寫檔案加密

從 MySQL 8.0.23 開始,雙寫檔案的加密支援可用。InnoDB會自動加密屬於加密表空間的雙寫檔案頁。不需要任何操作。雙寫檔案頁使用相關表空間的加密金鑰進行加密。寫入表空間資料檔案的相同加密頁也會寫入雙寫檔案。屬於未加密表空間的雙寫檔案頁保持未加密狀態。

在恢復過程中,加密的雙寫檔案頁會被解密並檢查是否損壞。

mysql 系統表空間加密

從 MySQL 8.0.16 開始,mysql系統表空間的加密支援可用。

mysql系統表空間包含mysql系統資料庫和 MySQL 資料字典表。預設情況下,它是未加密的。要為mysql系統表空間啟用加密,需在ALTER TABLESPACE語句中指定表空間名稱和ENCRYPTION選項。

mysql> ALTER TABLESPACE mysql ENCRYPTION = 'Y';

要禁用mysql系統表空間的加密,使用ALTER TABLESPACE語句設定ENCRYPTION = 'N'

mysql> ALTER TABLESPACE mysql ENCRYPTION = 'N';

啟用或禁用mysql系統表空間的加密需要在例項中所有表上具有CREATE TABLESPACE許可權(CREATE TABLESPACE on *.*)。

重做日誌加密

重做日誌資料加密是透過innodb_redo_log_encrypt配置選項啟用的。預設情況下,重做日誌加密是禁用的。

與表空間資料一樣,重做日誌資料加密發生在重做日誌資料寫入磁碟時,解密發生在重做日誌資料從磁碟讀取時。一旦重做日誌資料被讀入記憶體,它就是未加密的形式。重做日誌資料使用表空間加密金鑰進行加密和解密。

當啟用innodb_redo_log_encrypt時,磁碟上存在的未加密重做日誌頁面保持未加密,新的重做日誌頁面以加密形式寫入磁碟。同樣,當禁用innodb_redo_log_encrypt時,磁碟上存在的加密重做日誌頁面保持加密,新的重做日誌頁面以未加密形式寫入磁碟。

警告

MySQL 8.0.30 中引入的一個迴歸阻止一旦啟用重做日誌加密就禁用它。(Bug #108052,Bug #34456802)。

從 MySQL 8.0.30 開始,包括表空間加密金鑰在內的重做日誌加密後設資料儲存在具有最新檢查點 LSN 的重做日誌檔案的頭部。在 MySQL 8.0.30 之前,包括表空間加密金鑰在內的重做日誌加密後設資料儲存在第一個重做日誌檔案(ib_logfile0)的頭部。如果帶有加密後設資料的重做日誌檔案被移除,則重做日誌加密被禁用。

一旦啟用重做日誌加密,沒有金鑰環元件或外掛或沒有加密金鑰的情況下,無法進行正常重啟,因為InnoDB必須能夠在啟動時掃描重做頁面,如果重做日誌頁面被加密,則無法實現。沒有金鑰環元件或外掛或加密金鑰,只能進行強制啟動而不使用重做日誌(SRV_FORCE_NO_LOG_REDO)。參見第 17.21.3 節,“強制 InnoDB 恢復”。

撤銷日誌加密

使用innodb_undo_log_encrypt配置選項啟用撤銷日誌資料加密。撤銷日誌加密適用於駐留在撤銷表空間中的撤銷日誌。參見第 17.6.3.4 節,“撤銷表空間”。預設情況下,撤銷日誌資料加密是禁用的。

與表空間資料一樣,撤銷日誌資料加密發生在將撤銷日誌資料寫入磁碟時,解密發生在從磁碟讀取撤銷日誌資料時。一旦撤銷日誌資料被讀入記憶體,它就是未加密的形式。撤銷日誌資料使用表空間加密金鑰進行加密和解密。

當啟用innodb_undo_log_encrypt時,磁碟上存在的未加密撤銷日誌頁面保持未加密,新的撤銷日誌頁面以加密形式寫入磁碟。同樣,當禁用innodb_undo_log_encrypt時,磁碟上存在的加密撤銷日誌頁面保持加密,新的撤銷日誌頁面以未加密形式寫入磁碟。

撤銷日誌加密後設資料,包括表空間加密金鑰,儲存在撤銷日誌檔案的頭部。

注意

當撤銷日誌加密被禁用時,伺服器將繼續要求用於加密撤銷日誌資料的金鑰環元件或外掛,直到包含加密撤銷日誌資料的撤銷表空間被截斷。(僅當撤銷表空間被截斷時,加密頭部才會從撤銷表空間中移除。)有關截斷撤銷表空間的資訊,請參閱截斷撤銷表空間。

主金鑰旋轉

主加密金鑰應定期旋轉,以及在懷疑金鑰已被洩露時。

主金鑰旋轉是一個原子級別的例項操作。每次旋轉主加密金鑰時,MySQL 例項中的所有表空間金鑰都會重新加密並儲存回各自的表空間頭部。作為原子操作,一旦啟動旋轉操作,重新加密必須成功完成所有表空間金鑰。如果主金鑰旋轉在伺服器故障時中斷,InnoDB 在伺服器重新啟動時將操作向前推進。有關更多資訊,請參閱加密和恢復。

旋轉主加密金鑰僅會更改主加密金鑰並重新加密表空間金鑰。它不會解密或重新加密相關的表空間資料。

旋轉主加密金鑰需要 ENCRYPTION_KEY_ADMIN 許可權(或已棄用的 SUPER 許可權)。

要旋轉主加密金鑰,請執行:

mysql> ALTER INSTANCE ROTATE INNODB MASTER KEY;

ALTER INSTANCE ROTATE INNODB MASTER KEY 支援併發 DML。但是,它不能與表空間加密操作同時執行,並且會採取鎖定以防止由併發執行引起的衝突。如果正在執行一個 ALTER INSTANCE ROTATE INNODB MASTER KEY 操作,則必須等到該操作完成後,才能繼續進行表空間加密操作,反之亦然。

加密和恢復

如果在加密操作期間發生伺服器故障,則在伺服器重新啟動時將向前推進操作。對於一般表空間,加密操作將在後臺執行緒中從上次處理的頁面繼續。

如果在主金鑰旋轉期間發生伺服器故障,InnoDB 在伺服器重新啟動時繼續操作。

必須在儲存引擎初始化之前載入金鑰環元件或外掛,以便在InnoDB 初始化和恢復活動訪問表空間資料之前從表空間頭部檢索解密表空間資料頁所需的資訊(請參閱加密先決條件)。

InnoDB初始化和恢復開始時,主金鑰旋轉操作會繼續。由於伺服器故障,一些表空間金鑰可能已經使用新的主加密金鑰加密。InnoDB從每個表空間頭讀取加密資料,如果資料表明表空間金鑰是使用舊的主加密金鑰加密的,InnoDB會從 keyring 中檢索舊金鑰並用它解密表空間金鑰。然後,InnoDB使用新的主加密金鑰重新加密表空間金鑰,並將重新加密的表空間金鑰儲存回表空間頭。

匯出加密表空間

僅支援檔案-每表表空間的表空間匯出。

當匯出加密表空間時,InnoDB會生成一個傳輸金鑰,用於加密表空間金鑰。加密的表空間金鑰和傳輸金鑰儲存在一個*tablespace_name*.cfp檔案中。這個檔案和加密的表空間檔案一起需要執行匯入操作。在匯入時,InnoDB使用傳輸金鑰解密*tablespace_name*.cfp檔案中的表空間金鑰。有關更多資訊,請參見第 17.6.1.3 節,“匯入 InnoDB 表”。

加密和複製

  • 只有在源和副本執行支援表空間加密的 MySQL 版本的複製環境中才支援ALTER INSTANCE ROTATE INNODB MASTER KEY語句。

  • 成功的ALTER INSTANCE ROTATE INNODB MASTER KEY語句會被寫入二進位制日誌,用於副本的複製。

  • 如果ALTER INSTANCE ROTATE INNODB MASTER KEY語句失敗,則不會記錄到二進位制日誌中,也不會在副本上覆制。

  • 如果源上安裝了 keyring 元件或外掛,但副本上沒有安裝,則ALTER INSTANCE ROTATE INNODB MASTER KEY操作的複製會失敗。

  • 如果源和副本上都安裝了keyring_filekeyring_encrypted_file外掛,但副本沒有 keyring 資料檔案,則複製的ALTER INSTANCE ROTATE INNODB MASTER KEY語句會在副本上建立 keyring 資料檔案,假設 keyring 檔案資料沒有快取在記憶體中。如果可用,ALTER INSTANCE ROTATE INNODB MASTER KEY會使用快取在記憶體中的 keyring 檔案資料。

識別加密表空間和模式

MySQL 8.0.13 中引入的資訊模式INNODB_TABLESPACES表包括一個ENCRYPTION列,可用於識別加密的表空間。

mysql> SELECT SPACE, NAME, SPACE_TYPE, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES
       WHERE ENCRYPTION='Y'\G
*************************** 1\. row ***************************
     SPACE: 4294967294
      NAME: mysql
SPACE_TYPE: General
ENCRYPTION: Y
*************************** 2\. row ***************************
     SPACE: 2
      NAME: test/t1
SPACE_TYPE: Single
ENCRYPTION: Y
*************************** 3\. row ***************************
     SPACE: 3
      NAME: ts1
SPACE_TYPE: General
ENCRYPTION: Y

當在CREATE TABLEALTER TABLE語句中指定ENCRYPTION選項時,它將記錄在INFORMATION_SCHEMA.TABLESCREATE_OPTIONS列中。可以查詢此列以識別位於加密檔案-每表表空間中的表。

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES
       WHERE CREATE_OPTIONS LIKE '%ENCRYPTION%';
+--------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
+--------------+------------+----------------+
| test         | t1         | ENCRYPTION="Y" |
+--------------+------------+----------------+

查詢資訊模式INNODB_TABLESPACES表,以檢索與特定模式和表關聯的表空間的資訊。

mysql> SELECT SPACE, NAME, SPACE_TYPE FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE NAME='test/t1';
+-------+---------+------------+
| SPACE | NAME    | SPACE_TYPE |
+-------+---------+------------+
|     3 | test/t1 | Single     |
+-------+---------+------------+

您可以透過查詢資訊模式SCHEMATA表來識別啟用加密的模式。

mysql> SELECT SCHEMA_NAME, DEFAULT_ENCRYPTION FROM INFORMATION_SCHEMA.SCHEMATA
       WHERE DEFAULT_ENCRYPTION='YES';
+-------------+--------------------+
| SCHEMA_NAME | DEFAULT_ENCRYPTION |
+-------------+--------------------+
| test        | YES                |
+-------------+--------------------+

SHOW CREATE SCHEMA還顯示DEFAULT ENCRYPTION子句。

監控加密進度

您可以使用效能模式監視通用表空間和mysql系統表空間的加密進度。

stage/innodb/alter tablespace (encryption)階段事件工具報告了通用表空間加密操作的WORK_ESTIMATEDWORK_COMPLETED資訊。

以下示例演示瞭如何啟用stage/innodb/alter tablespace (encryption)階段事件工具和相關消費者表,以監視通用表空間或mysql系統表空間的加密進度。有關效能模式階段事件工具和相關消費者的資訊,請參閱第 29.12.5 節,“效能模式階段事件表”。

  1. 啟用stage/innodb/alter tablespace (encryption)工具:

    mysql> USE performance_schema;
    mysql> UPDATE setup_instruments SET ENABLED = 'YES'
           WHERE NAME LIKE 'stage/innodb/alter tablespace (encryption)';
    
  2. 啟用包括events_stages_currentevents_stages_historyevents_stages_history_long的階段事件消費者表。

    mysql> UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
    
  3. 執行表空間加密操作。在此示例中,一個名為ts1的通用表空間被加密。

    mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'Y';
    
  4. 透過查詢效能模式events_stages_current表來檢查加密操作的進度。WORK_ESTIMATED報告表空間中的總頁數。WORK_COMPLETED報告已處理的頁數。

    mysql> SELECT EVENT_NAME, WORK_ESTIMATED, WORK_COMPLETED FROM events_stages_current;
    +--------------------------------------------+----------------+----------------+
    | EVENT_NAME                                 | WORK_COMPLETED | WORK_ESTIMATED |
    +--------------------------------------------+----------------+----------------+
    | stage/innodb/alter tablespace (encryption) |           1056 |           1407 |
    +--------------------------------------------+----------------+----------------+
    

    如果加密操作已完成,events_stages_current表將返回一個空集。在這種情況下,您可以查詢events_stages_history表檢視已完成操作的事件資料。例如:

    mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED FROM events_stages_history;
    +--------------------------------------------+----------------+----------------+
    | EVENT_NAME                                 | WORK_COMPLETED | WORK_ESTIMATED |
    +--------------------------------------------+----------------+----------------+
    | stage/innodb/alter tablespace (encryption) |           1407 |           1407 |
    +--------------------------------------------+----------------+----------------+
    

加密使用注意事項

  • 當修改具有ENCRYPTION選項的現有每個檔案表表空間時,請做好計劃。駐留在每個檔案表表空間中的表將使用COPY演算法重建。當修改普通表空間或mysql系統表空間的ENCRYPTION屬性時,將使用INPLACE演算法。INPLACE演算法允許在普通表空間中的表上進行併發 DML。併發 DDL 被阻止。

  • 當一個普通表空間或mysql系統表空間被加密時,駐留在表空間中的所有表都會被加密。同樣,建立在加密表空間中的表也會被加密。

  • 如果伺服器在正常執行期間退出或停止,建議使用之前配置的相同加密設定重新啟動伺服器。

  • 第一個主加密金鑰是在第一個新的或現有的表空間加密時生成的。

  • 主金鑰輪換會重新加密表空間金鑰,但不會更改表空間金鑰本身。要更改表空間金鑰,必須禁用並重新啟用加密。對於每個表的檔案表空間,重新加密表空間是一個ALGORITHM=COPY操作,重新構建表。對於普通表空間和mysql系統表空間,這是一個ALGORITHM=INPLACE操作,不需要重新構建駐留在表空間中的表。

  • 如果一個表同時使用COMPRESSIONENCRYPTION選項建立,壓縮會在表空間資料加密之前執行。

  • 如果一個金鑰環資料檔案(由keyring_file_datakeyring_encrypted_file_data命名的檔案)為空或丟失,第一次執行ALTER INSTANCE ROTATE INNODB MASTER KEY將建立一個主加密金鑰。

  • 解除安裝component_keyring_filecomponent_keyring_encrypted_file元件不會刪除現有的金鑰環資料檔案。解除安裝keyring_filekeyring_encrypted_file外掛不會刪除現有的金鑰環資料檔案。

  • 建議不要將金鑰環資料檔案放在與表空間資料檔案相同的目錄下。

  • 在執行時或重新啟動伺服器時修改keyring_file_datakeyring_encrypted_file_data設定可能導致先前加密的表空間無法訪問,導致資料丟失。

  • 支援對透過新增FULLTEXT索引隱式建立的InnoDB FULLTEXT索引表進行加密。有關相關資訊,請參閱 InnoDB 全文索引表。

加密限制

  • 高階加密標準(AES)是唯一支援的加密演算法。InnoDB表空間加密使用電子密碼本(ECB)塊加密模式進行表空間金鑰加密,使用密碼塊連結(CBC)塊加密模式進行資料加密。在 CBC 塊加密模式下不使用填充。相反,InnoDB確保要加密的文字是塊大小的倍數。

  • 加密僅支援 file-per-table 表空間、general 表空間和mysql系統表空間。MySQL 8.0.13 引入了對 general 表空間的加密支援。MySQL 8.0.16 引入了對mysql系統表空間的加密支援。不支援對其他表空間型別(包括InnoDB系統表空間)進行加密。

  • 無法將加密的 file-per-table 表空間、general 表空間或mysql系統表空間中的表移動或複製到不支援加密的表空間型別。

  • 無法將表從加密的表空間移動或複製到未加密的表空間。但是,允許將表從未加密的表空間移動到加密的表空間。例如,可以將表從未加密的 file-per-table 或 general 表空間移動或複製到加密的 general 表空間。

  • 預設情況下,表空間加密僅適用於表空間中的資料。可以透過啟用innodb_redo_log_encryptinnodb_undo_log_encrypt來加密重做日誌和撤銷日誌資料。參見重做日誌加密和撤銷日誌加密。有關二進位制日誌檔案和中繼日誌檔案加密的資訊,請參見第 19.3.2 節,“加密二進位制日誌檔案和中繼日誌檔案”。

  • 不允許更改位於加密表空間中或先前位於加密表空間中的表的儲存引擎。

17.14 InnoDB 啟動選項和系統變數

原文:dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html

  • 可以透過命名啟用或使用--skip-字首禁用在伺服器啟動時為真或假的系統變數。例如,要啟用或禁用InnoDB自適應雜湊索引,可以在命令列上使用--innodb-adaptive-hash-index--skip-innodb-adaptive-hash-index,或在選項檔案中使用innodb_adaptive_hash_indexskip_innodb_adaptive_hash_index

  • 一些變數描述涉及“啟用”或“禁用”變數。這些變數可以透過將它們設定為ON1來使用SET語句啟用,或透過將它們設定為OFF0來禁用。布林變數可以在啟動時設定為ONTRUEOFFFALSE(不區分大小寫),以及10的值。參見第 6.2.2.4 節,“程式選項修飾符”。

  • ���受數值的系統變數���以在命令列上指定為--*var_name*=*value*,也可以在選項檔案中指定為*var_name*=*value*

  • 許多系統變數可以在執行時更改(參見第 7.1.9.2 節,“動態系統變數”)。

  • 有關GLOBALSESSION變數範圍修飾符的資訊,請參考SET語句文件。

  • 某些選項控制InnoDB資料檔案的位置和佈局。第 17.8.1 節,“InnoDB 啟動配置”解釋瞭如何使用這些選項。

  • 一些選項,可能最初不會使用,有助於根據機器容量和資料庫工作負載調整InnoDB效能特徵。

  • 有關指定選項和系統變數的更多資訊,請參見第 6.2.2 節,“指定程式選項”。

表格 17.24 InnoDB 選項和變數參考

名稱 命令列 選項檔案 系統變數 狀態變數 變數範圍 動態
daemon_memcached_enable_binlog 全域性
daemon_memcached_engine_lib_name 全域性
daemon_memcached_engine_lib_path 全域性
daemon_memcached_option 全域性
daemon_memcached_r_batch_size 全域性
daemon_memcached_w_batch_size 全域性
foreign_key_checks 兩者
innodb
innodb_adaptive_flushing 全域性
innodb_adaptive_flushing_lwm 全域性
innodb_adaptive_hash_index 全域性
innodb_adaptive_hash_index_parts 全域性
innodb_adaptive_max_sleep_delay 全域性
innodb_api_bk_commit_interval 全域性
innodb_api_disable_rowlock 全域性
innodb_api_enable_binlog 全域性
innodb_api_enable_mdl 全域性
innodb_api_trx_level 全域性
innodb_autoextend_increment 全域性
innodb_autoinc_lock_mode 全域性
innodb_background_drop_list_empty 全域性
Innodb_buffer_pool_bytes_data 全域性
Innodb_buffer_pool_bytes_dirty 全域性
innodb_buffer_pool_chunk_size 全域性
innodb_buffer_pool_debug 全域性
innodb_buffer_pool_dump_at_shutdown 全域性
innodb_buffer_pool_dump_now 全域性
innodb_buffer_pool_dump_pct 全域性
Innodb_buffer_pool_dump_status 全域性
innodb_buffer_pool_filename 全域性
innodb_buffer_pool_in_core_file 全域性
innodb_buffer_pool_instances 全域性
innodb_buffer_pool_load_abort 全域性
innodb_buffer_pool_load_at_startup 全域性
innodb_buffer_pool_load_now 全域性
Innodb_buffer_pool_load_status 全域性
Innodb_buffer_pool_pages_data 全域性
Innodb_buffer_pool_pages_dirty 全域性
Innodb_buffer_pool_pages_flushed 全域性
Innodb_buffer_pool_pages_free 全域性
Innodb_buffer_pool_pages_latched 全域性
Innodb_buffer_pool_pages_misc 全域性
Innodb_buffer_pool_pages_total 全域性
Innodb_buffer_pool_read_ahead 全域性
Innodb_buffer_pool_read_ahead_evicted 全域性
Innodb_buffer_pool_read_ahead_rnd 全域性
Innodb_buffer_pool_read_requests 全域性
Innodb_buffer_pool_reads 全域性
Innodb_buffer_pool_resize_status 全域性
innodb_buffer_pool_size 全域性
Innodb_buffer_pool_wait_free 全域性
Innodb_buffer_pool_write_requests 全域性
innodb_change_buffer_max_size 全域性
innodb_change_buffering 全域性
innodb_change_buffering_debug 全域性
innodb_checkpoint_disabled 全域性
innodb_checksum_algorithm 全域性
innodb_cmp_per_index_enabled 全域性
innodb_commit_concurrency 全域性
innodb_compress_debug 全域性
innodb_compression_failure_threshold_pct 全域性
innodb_compression_level 全域性
innodb_compression_pad_pct_max 全域性
innodb_concurrency_tickets 全域性
innodb_data_file_path 全域性
Innodb_data_fsyncs 全域性
innodb_data_home_dir 全域性
Innodb_data_pending_fsyncs 全域性
Innodb_data_pending_reads 全域性
Innodb_data_pending_writes 全域性
Innodb_data_read 全域性
Innodb_data_reads 全域性
Innodb_data_writes 全域性
Innodb_data_written 全域性
Innodb_dblwr_pages_written 全域性
Innodb_dblwr_writes 全域性
innodb_ddl_buffer_size 兩者
innodb_ddl_log_crash_reset_debug 全域性
innodb_ddl_threads 兩者
innodb_deadlock_detect 全域性
innodb_dedicated_server 全域性
innodb_default_row_format 全域性
innodb_directories 全域性
innodb_disable_sort_file_cache 全域性
innodb_doublewrite 全域性 不定
innodb_doublewrite_batch_size 全域性
innodb_doublewrite_dir 全域性
innodb_doublewrite_files 全域性
innodb_doublewrite_pages 全域性
innodb_fast_shutdown 全域性
innodb_fil_make_page_dirty_debug 全域性
innodb_file_per_table 全域性
innodb_fill_factor 全域性
innodb_flush_log_at_timeout 全域性
innodb_flush_log_at_trx_commit 全域性
innodb_flush_method 全域性
innodb_flush_neighbors 全域性
innodb_flush_sync 全域性
innodb_flushing_avg_loops 全域性
innodb_force_load_corrupted 全域性
innodb_force_recovery 全域性
innodb_fsync_threshold 全域性
innodb_ft_aux_table 全域性
innodb_ft_cache_size 全域性
innodb_ft_enable_diag_print 全域性
innodb_ft_enable_stopword 兩者
innodb_ft_max_token_size 全域性
innodb_ft_min_token_size 全域性
innodb_ft_num_word_optimize 全域性
innodb_ft_result_cache_limit 全域性
innodb_ft_server_stopword_table 全域性
innodb_ft_sort_pll_degree 全域性
innodb_ft_total_cache_size 全域性
innodb_ft_user_stopword_table 兩者
Innodb_have_atomic_builtins 全域性
innodb_idle_flush_pct 全域性
innodb_io_capacity 全域性
innodb_io_capacity_max 全域性
innodb_limit_optimistic_insert_debug 全域性
innodb_lock_wait_timeout 兩者
innodb_log_buffer_size 全域性 變化
innodb_log_checkpoint_fuzzy_now 全域性
innodb_log_checkpoint_now 全域性
innodb_log_checksums 全域性
innodb_log_compressed_pages 全域性
innodb_log_file_size 全域性
innodb_log_files_in_group 全域性
innodb_log_group_home_dir 全域性
innodb_log_spin_cpu_abs_lwm 全域性
innodb_log_spin_cpu_pct_hwm 全域性
innodb_log_wait_for_flush_spin_hwm 全域性
Innodb_log_waits 全域性
innodb_log_write_ahead_size 全域性
Innodb_log_write_requests 全域性
innodb_log_writer_threads 全域性
Innodb_log_writes 全域性
innodb_lru_scan_depth 全域性
innodb_max_dirty_pages_pct 全域性
innodb_max_dirty_pages_pct_lwm 全域性
innodb_max_purge_lag 全域性
innodb_max_purge_lag_delay 全域性
innodb_max_undo_log_size 全域性
innodb_merge_threshold_set_all_debug 全域性
innodb_monitor_disable 全域性
innodb_monitor_enable 全域性
innodb_monitor_reset 全域性
innodb_monitor_reset_all 全域性
Innodb_num_open_files 全域性
innodb_numa_interleave 全域性
innodb_old_blocks_pct 全域性
innodb_old_blocks_time 全域性
innodb_online_alter_log_max_size 全域性
innodb_open_files 全域性 不定
innodb_optimize_fulltext_only 全域性
Innodb_os_log_fsyncs 全域性
Innodb_os_log_pending_fsyncs 全域性
Innodb_os_log_pending_writes 全域性
Innodb_os_log_written 全域性
innodb_page_cleaners 全域性
Innodb_page_size 全域性
innodb_page_size 全域性
Innodb_pages_created 全域性
Innodb_pages_read 全域性
Innodb_pages_written 全域性
innodb_parallel_read_threads 會話
innodb_print_all_deadlocks 全域性
innodb_print_ddl_logs 全域性
innodb_purge_batch_size 全域性
innodb_purge_rseg_truncate_frequency 全域性
innodb_purge_threads 全域性
innodb_random_read_ahead 全域性
innodb_read_ahead_threshold 全域性
innodb_read_io_threads 全域性
innodb_read_only 全域性
innodb_redo_log_archive_dirs 全域性
innodb_redo_log_capacity 全域性
Innodb_redo_log_capacity_resized 全域性
Innodb_redo_log_checkpoint_lsn 全域性
Innodb_redo_log_current_lsn 全域性
Innodb_redo_log_enabled 全域性
innodb_redo_log_encrypt 全域性
Innodb_redo_log_flushed_to_disk_lsn 全域性
Innodb_redo_log_logical_size 全域性
Innodb_redo_log_physical_size 全域性
Innodb_redo_log_read_only 全域性
Innodb_redo_log_resize_status 全域性
Innodb_redo_log_uuid 全域性
innodb_replication_delay 全域性
innodb_rollback_on_timeout 全域性
innodb_rollback_segments 全域性
Innodb_row_lock_current_waits 全域性
Innodb_row_lock_time 全域性
Innodb_row_lock_time_avg 全域性
Innodb_row_lock_time_max 全域性
Innodb_row_lock_waits 全域性
Innodb_rows_deleted 全域性
Innodb_rows_inserted 全域性
Innodb_rows_read 全域性
Innodb_rows_updated 全域性
innodb_saved_page_number_debug 全域性
innodb_segment_reserve_factor 全域性
innodb_sort_buffer_size 全域性
innodb_spin_wait_delay 全域性
innodb_spin_wait_pause_multiplier 全域性
innodb_stats_auto_recalc 全域性
innodb_stats_include_delete_marked 全域性
innodb_stats_method 全域性
innodb_stats_on_metadata 全域性
innodb_stats_persistent 全域性
innodb_stats_persistent_sample_pages 全域性
innodb_stats_transient_sample_pages 全域性
innodb-status-file
innodb_status_output 全域性
innodb_status_output_locks 全域性
innodb_strict_mode 兩者
innodb_sync_array_size 全域性
innodb_sync_debug 全域性
innodb_sync_spin_loops 全域性
Innodb_system_rows_deleted 全域性
Innodb_system_rows_inserted 全域性
Innodb_system_rows_read 全域性
innodb_table_locks 兩者
innodb_temp_data_file_path 全域性
innodb_temp_tablespaces_dir 全域性
innodb_thread_concurrency 全域性
innodb_thread_sleep_delay 全域性
innodb_tmpdir 兩者
Innodb_truncated_status_writes 全域性
innodb_trx_purge_view_update_only_debug 全域性
innodb_trx_rseg_n_slots_debug 全域性
innodb_undo_directory 全域性
innodb_undo_log_encrypt 全域性
innodb_undo_log_truncate 全域性
innodb_undo_tablespaces 全域性 不定
Innodb_undo_tablespaces_active 全域性
Innodb_undo_tablespaces_explicit 全域性
Innodb_undo_tablespaces_implicit 全域性
Innodb_undo_tablespaces_total 全域性
innodb_use_fdatasync 全域性
innodb_use_native_aio 全域性
innodb_validate_tablespace_paths 全域性
innodb_version 全域性
innodb_write_io_threads 全域性
unique_checks 兩者
名稱 命令列 選項檔案 系統變數 狀態變數 變數範圍 動態

InnoDB 命令選項

  • --innodb[=*value*]

    命令列格式 --innodb[=value]
    棄用
    型別 列舉
    預設值 ON
    有效值 OFF``ON``FORCE

    控制 InnoDB 儲存引擎的載入,如果伺服器編譯時支援 InnoDB。此選項具有三態格式,可能的值為 OFFONFORCE。請參閱 第 7.6.1 節,“安裝和解除安裝外掛”。

    要禁用 InnoDB,請使用 --innodb=OFF--skip-innodb。在這種情況下,由於預設儲存引擎是 InnoDB,除非還使用 --default-storage-engine--default-tmp-storage-engine 將預設值設定為其他引擎,否則伺服器不會啟動,用於永久表和 TEMPORARY 表。

    InnoDB 儲存引擎不再可以被禁用,--innodb=OFF--skip-innodb 選項已被棄用且無效。使用它們會產生警告。預計這些選項將在未來的 MySQL 版本中被移除。

  • --innodb-status-file

    命令列格式 --innodb-status-file[={OFF|ON}]
    型別 布林
    預設值 OFF

    --innodb-status-file 啟動選項控制 InnoDB 是否在資料目錄中建立一個名為 innodb_status.*pid* 的檔案,並每隔約 15 秒將 SHOW ENGINE INNODB STATUS 輸出到其中。

    預設情況下不會建立 innodb_status.*pid* 檔案。要建立該檔案,請使用 --innodb-status-file 選項啟動 mysqldInnoDB 在伺服器正常關閉時會刪除該檔案。如果發生異常關閉,則可能需要手動刪除狀態檔案。

    --innodb-status-file選項僅供臨時使用,因為SHOW ENGINE INNODB STATUS輸出生成可能會影響效能,並且隨著時間的推移,innodb_status.*pid*`檔案可能會變得非常大。

    有關相關資訊,請參見第 17.17.2 節,“啟用 InnoDB 監視器”。

  • --skip-innodb

    禁用InnoDB儲存引擎。請參閱--innodb的描述。

InnoDB 系統變數

  • daemon_memcached_enable_binlog

    命令列格式 --daemon-memcached-enable-binlog[={OFF|ON}]
    已棄用 8.0.22
    系統變數 daemon_memcached_enable_binlog
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 OFF

    在源伺服器上啟用此選項以使用 MySQL 的InnoDB memcached外掛(daemon_memcached)與 MySQL 的二進位制日誌。此選項只能在伺服器啟動時設定。您還必須使用--log-bin選項在源伺服器上啟用 MySQL 二進位制日誌。

    有關更多資訊,請參見第 17.20.7 節,“InnoDB memcached 外掛和複製”。

  • daemon_memcached_engine_lib_name

    命令列格式 --daemon-memcached-engine-lib-name=file_name
    已棄用 8.0.22
    系統變數 daemon_memcached_engine_lib_name
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 檔名
    預設值 innodb_engine.so

    指定實現InnoDB memcached外掛的共享庫。

    有關更多資訊,請參見第 17.20.3 節,“設定 InnoDB memcached 外掛”。

  • daemon_memcached_engine_lib_path

    命令列格式 --daemon-memcached-engine-lib-path=dir_name
    已棄用 8.0.22
    系統變數 daemon_memcached_engine_lib_path
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 目錄名
    預設值 NULL

    包含實現InnoDB memcached外掛的共享庫的目錄路徑。預設值為 NULL,表示 MySQL 外掛目錄。除非指定位於 MySQL 外掛目錄之外的不同儲存引擎的memcached外掛,否則您不應該需要修改此引數。

    更多資訊,請參閱第 17.20.3 節,“設定 InnoDB memcached 外掛”。

  • daemon_memcached_option

    命令列格式 --daemon-memcached-option=options
    已棄用 8.0.22
    系統變數 daemon_memcached_option
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 字串
    預設值

    用於在啟動時將空格分隔的memcached選項傳遞給底層memcached記憶體物件快取守護程式。例如,您可以更改memcached偵聽的埠,減少最大同時連線數,更改鍵值對的最大記憶體大小,或者為錯誤日誌啟用除錯訊息。

    有關使用詳細資訊,請參閱第 17.20.3 節,“設定 InnoDB memcached 外掛”。有關memcached選項的資訊,請參考memcached手冊頁。

  • daemon_memcached_r_batch_size

    命令列格式 --daemon-memcached-r-batch-size=#
    已棄用 8.0.22
    系統變數 daemon_memcached_r_batch_size
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 1
    最小值 1
    最大值 1073741824

    指定在啟動新事務之前執行多少個memcached讀取操作(get操作)。與daemon_memcached_w_batch_size相對應。

    預設值為 1,因此透過 SQL 語句對錶進行的任何更改都會立即對memcached操作可見。您可以增加它以減少在僅透過memcached介面訪問底層表的系統上頻繁提交的開銷。如果將值設定得太大,則撤消或重做資料量可能會對儲存造成一些開銷,就像任何長時間執行的事務一樣。

    更多資訊,請參閱 第 17.20.3 節,“設定 InnoDB memcached 外掛”。

  • daemon_memcached_w_batch_size

    命令列格式 --daemon-memcached-w-batch-size=#
    已棄用 8.0.22
    系統變數 daemon_memcached_w_batch_size
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 1
    最小值 1
    最大值 1048576

    指定在啟動新事務之前執行多少個memcached寫操作,例如addsetincr。與daemon_memcached_r_batch_size相對應。

    預設情況下,此值設定為 1,假設儲存的資料在發生故障時很重要並且應立即提交。當儲存非關鍵資料時,您可以增加此值以減少頻繁提交的開銷;但是如果發生意外退出,則最後N-1 個未提交的寫操作可能會丟失。

    更多資訊,請參閱 第 17.20.3 節,“設定 InnoDB memcached 外掛”。

  • innodb_adaptive_flushing

    命令列格式 --innodb-adaptive-flushing[={OFF|ON}]
    系統變數 innodb_adaptive_flushing
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 ON

    指定是否根據工作負載動態調整InnoDB緩衝池中髒頁的重新整理速率。動態調整重新整理速率旨在避免 I/O 活動的突發發生。此設定預設啟用。有關更多資訊,請參閱 第 17.8.3.5 節,“配置緩衝池重新整理”。有關一般 I/O 調優建議,請參閱 第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

  • innodb_adaptive_flushing_lwm

    命令列格式 --innodb-adaptive-flushing-lwm=#
    系統變數 innodb_adaptive_flushing_lwm
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 10
    最小值 0
    最大值 70

    定義表示重做日誌容量百分比的低水位標記,在此百分比下啟用自適應重新整理。有關更多資訊,請參閱第 17.8.3.5 節,“配置緩衝池重新整理”。

  • innodb_adaptive_hash_index

    命令列格式 --innodb-adaptive-hash-index[={OFF|ON}]
    系統變數 innodb_adaptive_hash_index
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 ON

    InnoDB 自適應雜湊索引是否啟用或禁用。根據您的工作負載,動態啟用或禁用自適應雜湊索引可能是有益的,以提高查詢效能。由於自適應雜湊索引可能並非適用於所有工作負載,因此請使用真實工作負載分別啟用和禁用它進行基準測試。有關詳細資訊,請參閱第 17.5.3 節,“自適應雜湊索引”。

    此變數預設啟用。您可以使用SET GLOBAL語句修改此引數,無需重新啟動伺服器。在執行時更改設定需要具有足夠許可權設定全域性系統變數。請參閱第 7.1.9.1 節,“系統變數許可權”。您也可以在伺服器啟動時使用--skip-innodb-adaptive-hash-index來禁用它。

    禁用自適應雜湊索引會立即清空雜湊表。在清空雜湊表的同時,正常操作可以繼續進行,並且執行使用雜湊表的查詢將直接訪問索引 B 樹。重新啟用自適應雜湊索引時,在正常操作期間雜湊表將再次填充。

  • innodb_adaptive_hash_index_parts

    命令列格式 --innodb-adaptive-hash-index-parts=#
    系統變數 innodb_adaptive_hash_index_parts
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 數值
    預設值 8
    最小值 1
    最大值 512

    對自適應雜湊索引搜尋系統進行分割槽。每個索引繫結到特定分割槽,每個分割槽由單獨的閂保護。

    自適應雜湊索引搜尋系統預設分為 8 部分。最大設定為 512。

    有關相關資訊,請參見第 17.5.3 節,“自適應雜湊索引”。

  • innodb_adaptive_max_sleep_delay

    命令列格式 --innodb-adaptive-max-sleep-delay=#
    系統變數 innodb_adaptive_max_sleep_delay
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 150000
    最小值 0
    最大值 1000000
    單位 微秒

    允許InnoDB根據當前工作負載自動調整innodb_thread_sleep_delay的值。任何非零值都會啟用innodb_thread_sleep_delay值的自動動態調整,最高值不超過innodb_adaptive_max_sleep_delay選項中指定的最大值。該值表示微秒數。此選項在繁忙系統中非常有用,具有超過 16 個InnoDB執行緒。(實際上,對於具有數百或數千個同時連線的 MySQL 系統來說,這是最有價值的。)

    有關更多資訊,請參見第 17.8.4 節,“配置 InnoDB 的執行緒併發性”。

  • innodb_api_bk_commit_interval

    命令列格式 --innodb-api-bk-commit-interval=#
    已棄用 8.0.22
    系統變數 innodb_api_bk_commit_interval
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 5
    最小值 1
    最大值 1073741824
    單位

    自動提交使用InnoDB memcached介面的空閒連線的頻率,單位為秒。更多資訊,請參見第 17.20.6.4 節,“控制 InnoDB memcached 外掛的事務行為”。

  • innodb_api_disable_rowlock

    命令列格式 --innodb-api-disable-rowlock[={OFF|ON}]
    已棄用 8.0.22
    系統變數 innodb_api_disable_rowlock
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    使用此選項禁用 InnoDB memcached 執行 DML 操作時的行鎖。預設情況下,innodb_api_disable_rowlock 處於禁用狀態,這意味著 memcached 請求行鎖用於 getset 操作。當啟用 innodb_api_disable_rowlock 時,memcached 請求表鎖而不是行鎖。

    innodb_api_disable_rowlock 不是動態的。必須在mysqld命令列上指定,或者輸入到 MySQL 配置檔案中。配置在外掛安裝時生效,外掛安裝發生在 MySQL 伺服器啟動時。

    更多資訊,請參見 Section 17.20.6.4, “控制 InnoDB memcached 外掛的事務行為”。

  • innodb_api_enable_binlog

    命令列格式 --innodb-api-enable-binlog[={OFF|ON}]
    已棄用 8.0.22
    系統變數 innodb_api_enable_binlog
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    允許您使用 MySQL 二進位制日誌 的 InnoDB memcached 外掛。更多資訊,請參見 啟用 InnoDB memcached 二進位制日誌。

  • innodb_api_enable_mdl

    命令列格式 --innodb-api-enable-mdl[={OFF|ON}]
    ���棄用 8.0.22
    系統變數 innodb_api_enable_mdl
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    鎖定InnoDB memcached 外掛使用的表,以防止透過 SQL 介面的 DDL 刪除或更改。更多資訊,請參見 Section 17.20.6.4, “控制 InnoDB memcached 外掛的事務行為”。

  • innodb_api_trx_level

    命令列格式 --innodb-api-trx-level=#
    已棄用 8.0.22
    系統變數 innodb_api_trx_level
    作用域 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 3

    控制由memcached介面處理的查詢的事務隔離級別。對應於熟悉名稱的常量為:

    • 0 = READ UNCOMMITTED

    • 1 = READ COMMITTED

    • 2 = REPEATABLE READ

    • 3 = SERIALIZABLE

    有關更多資訊,請參閱第 17.20.6.4 節,“控制 InnoDB memcached 外掛的事務行為”。

  • innodb_autoextend_increment

    命令列格式 --innodb-autoextend-increment=#
    系統變數 innodb_autoextend_increment
    作用域 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 64
    最小值 1
    最大值 1000
    單位 兆位元組

    InnoDB 系統表空間檔案滿時,自動擴充套件大小的增量大小(以兆位元組為單位)。預設值為 64。有關相關資訊,請參閱系統表空間資料檔案配置和調整系統表空間大小。

    innodb_autoextend_increment 設定不影響 file-per-table 表空間檔案或 general tablespace 檔案。這些檔案會自動擴充套件,不受innodb_autoextend_increment設定的影響。初始擴充套件量較小,之後每次擴充套件增加 4MB。

  • innodb_autoinc_lock_mode

    命令列格式 --innodb-autoinc-lock-mode=#
    系統變數 innodb_autoinc_lock_mode
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 2
    有效值 0``1``2

    用於生成自增值的鎖定模式。允許的值為 0、1 或 2,分別表示傳統、連續或交錯。

    截至 MySQL 8.0,預設設定為 2(交錯),之前為 1(連續)。從語句為基礎的複製變為行為基礎的複製作為預設複製型別的變化反映在預設設定為交錯鎖定模式上,這發生在 MySQL 5.7 中。語句為基礎的複製需要連續的自增鎖定模式,以確保自增值按照給定 SQL 語句序列的可預測和可重複的順序分配,而行為基礎的複製不受 SQL 語句執行順序的影響。

    有關每種鎖定模式的特性,請參閱 InnoDB AUTO_INCREMENT Lock Modes。

  • innodb_background_drop_list_empty

    命令列格式 --innodb-background-drop-list-empty[={OFF|ON}]
    系統變數 innodb_background_drop_list_empty
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    啟用innodb_background_drop_list_empty除錯選項有助於避免測試用例失敗,延遲表的建立直到後臺刪除列表為空。例如,如果測試用例 A 將表t1放在後臺刪除列表中,測試用例 B 將等待直到後臺刪除列表為空才建立表t1

  • innodb_buffer_pool_chunk_size

    命令列格式 --innodb-buffer-pool-chunk-size=#
    系統變數 innodb_buffer_pool_chunk_size
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 134217728
    最小值 1048576
    最大值 innodb_buffer_pool_size / innodb_buffer_pool_instances
    單位 位元組

    innodb_buffer_pool_chunk_size定義了InnoDB緩衝池調整大小操作的塊大小。

    為避免在調整大小操作期間複製所有緩衝池頁面,操作是以“塊”進行的。預設情況下,innodb_buffer_pool_chunk_size為 128MB(134217728 位元組)。塊中包含的頁面數量取決於innodb_page_size的值。innodb_buffer_pool_chunk_size可以以 1MB(1048576 位元組)的單位增加或減少。

    更改innodb_buffer_pool_chunk_size值時應滿足以下條件:

    • 如果在初始化緩衝池時,innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances大於當前緩衝池大小,則innodb_buffer_pool_chunk_size會被截斷為innodb_buffer_pool_size / innodb_buffer_pool_instances

    • 緩衝池大小必須始終等於或是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍數。如果更改innodb_buffer_pool_chunk_sizeinnodb_buffer_pool_size會自動舍入為等於或是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的值。此調整發生在初始化緩衝池時。

    重要

    更改innodb_buffer_pool_chunk_size時需謹慎,因為更改此值可能會自動增加緩衝池的大小。在更改innodb_buffer_pool_chunk_size之前,計算其對innodb_buffer_pool_size的影響,以確保生成的緩衝池大小是可接受的。

    為避免潛在的效能問題,塊的數量(innodb_buffer_pool_size / innodb_buffer_pool_chunk_size)不應超過 1000。

    innodb_buffer_pool_size 變數是動態的,允許在伺服器線上時調整緩衝池的大小。然而,緩衝池的大小必須等於或是 innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances 的倍數,改變這兩個變數設定中的任何一個都需要重新啟動伺服器。

    更多資訊請參見 第 17.8.3.1 節,“配置 InnoDB 緩衝池大小”。

  • innodb_buffer_pool_debug

    命令列格式 --innodb-buffer-pool-debug[={OFF|ON}]
    系統變數 innodb_buffer_pool_debug
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    啟用此選項允許在緩衝池小於 1GB 時存在多個緩衝池例項,忽略對 innodb_buffer_pool_instances 強加的 1GB 最小緩衝池大小約束。只有在使用 WITH_DEBUG CMake 選項編譯時才可用 innodb_buffer_pool_debug 選項。

  • innodb_buffer_pool_dump_at_shutdown

    命令列格式 --innodb-buffer-pool-dump-at-shutdown[={OFF|ON}]
    系統變數 innodb_buffer_pool_dump_at_shutdown
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 ON

    指定在 MySQL 伺服器關閉時記錄快取在 InnoDB 緩衝池 中的頁面,以縮短下次重啟時的 預熱 過程。通常與 innodb_buffer_pool_load_at_startup 結合使用。innodb_buffer_pool_dump_pct 選項定義要轉儲的最近使用的緩衝池頁面的百分比。

    innodb_buffer_pool_dump_at_shutdowninnodb_buffer_pool_load_at_startup 預設啟用。

    更多資訊,請參閱 Section 17.8.3.6,“儲存和恢復緩衝池狀態”。

  • innodb_buffer_pool_dump_now

    命令列格式 --innodb-buffer-pool-dump-now[={OFF|ON}]
    系統變數 innodb_buffer_pool_dump_now
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 OFF

    立即記錄在InnoDB緩衝池中快取的頁面。通常與innodb_buffer_pool_load_now結合使用。

    啟用innodb_buffer_pool_dump_now會觸發記錄操作,但不會改變變數設定,該設定始終保持OFF0。要在觸發轉儲後檢視緩衝池轉儲狀態,請查詢Innodb_buffer_pool_dump_status變數。

    啟用innodb_buffer_pool_dump_now會觸發轉儲操作,但不會改變變數設定,該設定始終保持OFF0。要在觸發轉儲後檢視緩衝池轉儲狀態,請查詢Innodb_buffer_pool_dump_status變數。

    更多資訊,請參閱 Section 17.8.3.6,“儲存和恢復緩衝池狀態”。

  • innodb_buffer_pool_dump_pct

    命令列格式 --innodb-buffer-pool-dump-pct=#
    系統變數 innodb_buffer_pool_dump_pct
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 25
    最小值 1
    ��大值 100

    指定每個緩衝池中最近使用的頁面的百分比以讀取並轉儲。範圍為 1 到 100。預設值為 25。例如,如果有 4 個每個有 100 頁的緩衝池,並且innodb_buffer_pool_dump_pct設定為 25,則從每個緩衝池中轉儲最近使用的 25 頁。

  • innodb_buffer_pool_filename

    命令列格式 --innodb-buffer-pool-filename=file_name
    系統變數 innodb_buffer_pool_filename
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 檔名
    預設值 ib_buffer_pool

    指定儲存由innodb_buffer_pool_dump_at_shutdowninnodb_buffer_pool_dump_now生成的表空間 ID 和頁面 ID 列表的檔案的名稱。表空間 ID 和頁面 ID 以以下格式儲存:space, page_id。預設情況下,檔名為ib_buffer_pool,位於InnoDB資料目錄中。必須相對於資料目錄指定非預設位置。

    可以在執行時使用SET語句指定檔名:

    SET GLOBAL innodb_buffer_pool_filename=*'file_name'*;
    

    您還可以在啟動時指定檔名,在啟動字串或 MySQL 配置檔案中。在啟動時指定檔名時,檔案必須存在,否則InnoDB會返回啟動錯誤,指示沒有這樣的檔案或目錄。

    有關更多資訊,請參見第 17.8.3.6 節,“儲存和恢復緩衝池狀態”。

  • innodb_buffer_pool_in_core_file

    命令列格式 --innodb-buffer-pool-in-core-file[={OFF|ON}]
    引入版本 8.0.14
    系統變數 innodb_buffer_pool_in_core_file
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 ON

    禁用innodb_buffer_pool_in_core_file變數可透過排除InnoDB緩衝池頁面來減小核心檔案的大小。要使用此變數,必須啟用core_file變數,並且作業系統必須支援MADV_DONTDUMP非 POSIX 擴充套件到madvise(),該擴充套件在 Linux 3.4 及更高版本中受支援。有關更多資訊,請參見第 17.8.3.7 節,“從核心檔案中排除緩衝池頁面”。

  • innodb_buffer_pool_instances

    命令列格式 --innodb-buffer-pool-instances=#
    系統變數 innodb_buffer_pool_instances
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值(Windows,32 位平臺) (autosized)
    預設值(其他) 8(如果 innodb_buffer_pool_size < 1GB,則為 1)
    最小值 1
    最大值 64

    InnoDB 緩衝池 分成的區域數量。對於具有多個千兆位元組範圍的緩衝池的系統,將緩衝池分成單獨的例項可以透過減少不同執行緒讀取和寫入快取頁面時的爭用來提高併發性。儲存在緩衝池中或從緩衝池中讀取的每個頁面都會隨機分配給緩衝池例項之一,使用雜湊函式。每個緩衝池管理自己的空閒列表、重新整理列表、LRU 以及與緩衝池相關的所有其他資料結構,並由自己的緩衝池互斥鎖保護。

    當將innodb_buffer_pool_size設定為 1GB 或更高時,此選項才會生效。總緩衝池大小將分配給所有緩衝池。為了達到最佳效率,請指定innodb_buffer_pool_instancesinnodb_buffer_pool_size的組合,以便每個緩衝池例項至少為 1GB。

    在 32 位 Windows 系統上的預設值取決於innodb_buffer_pool_size的值,如下所述:

    • 如果innodb_buffer_pool_size大於 1.3GB,則innodb_buffer_pool_instances的預設值為innodb_buffer_pool_size/128MB,每個塊的記憶體分配請求。選擇 1.3GB 作為邊界是因為在此處,32 位 Windows 無法為單個緩衝池分配所需的連續地址空間存在顯著風險。

    • 否則,預設值為 1。

    在所有其他平臺上,當innodb_buffer_pool_size大於或等於 1GB 時,預設值為 8。否則,預設值為 1。

    有關相關資訊,請參閱第 17.8.3.1 節,“配置 InnoDB 緩衝池大小”。

  • innodb_buffer_pool_load_abort

    命令列格式 --innodb-buffer-pool-load-abort[={OFF&#124;ON}]
    系統變數 innodb_buffer_pool_load_abort
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 OFF

    中斷由innodb_buffer_pool_load_at_startupinnodb_buffer_pool_load_now觸發的InnoDB緩衝池內容恢復過程。

    啟用innodb_buffer_pool_load_abort會觸發中止操作,但不會改變變數設定,其始終保持為OFF0。要在觸發中止操作後檢視緩衝池載入狀態,請查詢Innodb_buffer_pool_load_status變數。

    有關更多資訊,請參見第 17.8.3.6 節,“儲存和恢復緩衝池狀態”。

  • innodb_buffer_pool_load_at_startup

    命令列格式 --innodb-buffer-pool-load-at-startup[={OFF&#124;ON}]
    系統變數 innodb_buffer_pool_load_at_startup
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 ON

    指定在 MySQL 伺服器啟動時,InnoDB緩衝池會自動透過載入先前儲存的頁面來預熱。通常與innodb_buffer_pool_dump_at_shutdown一起使用。

    innodb_buffer_pool_dump_at_shutdowninnodb_buffer_pool_load_at_startup預設啟用。

    有關更多資訊,請參見第 17.8.3.6 節,“儲存和恢復緩衝池狀態”。

  • innodb_buffer_pool_load_now

    命令列格式 --innodb-buffer-pool-load-now[={OFF&#124;ON}]
    系統變數 innodb_buffer_pool_load_now
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 OFF

    透過載入資料頁立即 預熱 InnoDB 緩衝池,無需等待伺服器重新啟動。在進行基準測試期間,或在執行報告或維護查詢後準備 MySQL 伺服器恢復其正常工作負載時,這可能很有用。

    啟用 innodb_buffer_pool_load_now 觸發載入操作,但不會改變變數設定,變數始終保持 OFF0。在觸發載入後檢視緩衝池載入進度,請查詢 Innodb_buffer_pool_load_status 變數。

    更多資訊,請參閱 Section 17.8.3.6, “儲存和恢復緩衝池狀態”。

  • innodb_buffer_pool_size

    命令列格式 --innodb-buffer-pool-size=#
    系統變數 innodb_buffer_pool_size
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 134217728
    最小值 5242880
    最大值(64 位平臺) 2**64-1
    最大值(32 位平臺) 2**32-1
    單位 字��

    緩衝池的大小(以位元組為單位),即 InnoDB 快取表和索引資料的記憶體區域。預設值為 134217728 位元組(128MB)。最大值取決於 CPU 架構;32 位系統上的最大值為 4294967295(2³²-1),64 位系統上的最大值為 18446744073709551615(2⁶⁴-1)。在 32 位系統上,CPU 架構和作業系統可能會強加一個比規定最大值更低的實際最大值。當緩衝池的大小大於 1GB 時,將 innodb_buffer_pool_instances 設定為大於 1 的值可以提高繁忙伺服器的可伸縮性。

    更大的緩衝池需要更少的磁碟 I/O 來多次訪問相同的表資料。在專用資料庫伺服器上,您可能會將緩衝池大小設定為機器實體記憶體大小的 80%。在配置緩衝池大小時,請注意以下潛在問題,並準備根據需要縮小緩衝池的大小。

    • 實體記憶體的競爭可能導致作業系統進行分頁。

    • InnoDB 為緩衝區和控制結構保留額外的記憶體,因此總分配空間大約比指定的緩衝池大小大約多 10%。

    • 緩衝池的地址空間必須是連續的,在 Windows 系統中,DLL 可能會載入到特定地址,這可能會成為一個問題。

    • 初始化緩衝池的時間大致與其大小成正比。在具有大型緩衝池的例項上,初始化時間可能很顯著。為了縮短初始化時間,您可以在伺服器關閉時儲存緩衝池狀態,並在伺服器啟動時恢復它。參見第 17.8.3.6 節,“儲存和恢復緩衝池狀態”。

    當您增加或減少緩衝池大小時,操作是以塊為單位執行的。塊大小由innodb_buffer_pool_chunk_size變數定義,預設值為 128 MB。

    緩衝池大小必須始終等於或是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍數。如果您將緩衝池大小更改為不等於或不是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍數的值,則緩衝池大小會自動調整為等於或是innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍數的值。

    innodb_buffer_pool_size可以動態設定,這允許您在不重啟伺服器的情況下調整緩衝池大小。Innodb_buffer_pool_resize_status狀態變數報告線上緩衝池調整操作的狀態。有關更多資訊,請參見第 17.8.3.1 節,“配置 InnoDB 緩衝池大小”。

    如果啟用了innodb_dedicated_server,並且未明確定義innodb_buffer_pool_size的值,則該值會自動配置。有關更多資訊,請參見第 17.8.12 節,“為專用 MySQL 伺服器啟用自動配置”��

  • innodb_change_buffer_max_size

    命令列格式 --innodb-change-buffer-max-size=#
    系統變數 innodb_change_buffer_max_size
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 25
    最小值 0
    最大值 50

    InnoDB 更改緩衝區的最大大小,作為緩衝池總大小的百分比。您可能會增加此值,用於具有大量插入、更新和刪除活動的 MySQL 伺服器,或者減少用於報告中使用的資料保持不變的 MySQL 伺服器。有關更多資訊,請參見第 17.5.2 節,“更改緩衝區”。有關一般 I/O 調優建議,請參見第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

  • innodb_change_buffering

    命令列格式 --innodb-change-buffering=value
    系統變數 innodb_change_buffering
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 列舉
    預設值 all
    有效值 none``inserts``deletes``changes``purges``all

    InnoDB 是否執行更改緩衝,這是一種最佳化,延遲寫入操作到次要索引,以便 I/O 操作可以按順序執行。允許的值在下表中描述。值也可以用數字指定。

    表 17.25 innodb_change_buffering 允許的值

    數值 描述
    none 0 不緩衝任何操作。
    inserts 1 緩衝插入操作。
    deletes 2 緩衝刪除標記操作;嚴格來說,標記索引記錄以便稍後在清除操作期間刪除。
    changes 3 緩衝插入和刪除標記操作。
    purges 4 緩衝後臺中發生的物理刪除操作。
    all 5 預設值。緩衝插入、刪除標記操作和清除。

    有關更多資訊,請參見第 17.5.2 節,“更改緩衝區”。有關一般 I/O 調優建議,請參見第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

  • innodb_change_buffering_debug

    命令列格式 --innodb-change-buffering-debug=#
    系統變數 innodb_change_buffering_debug
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 2

    設定InnoDB更改緩衝區的除錯標誌。值為 1 會強制所有更改進入更改緩衝區。值為 2 會在合併時導致意外退出。預設值為 0 表示更改緩衝區除錯標誌未設定。此選項僅在使用WITH_DEBUG CMake 選項編譯除錯支援時才可用。

  • innodb_checkpoint_disabled

    命令列格式 --innodb-checkpoint-disabled[={OFF&#124;ON}]
    系統變數 innodb_checkpoint_disabled
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 OFF

    這是一個僅供專家除錯使用的除錯選項。它禁用了檢查點,以便有意的伺服器退出始終會啟動InnoDB恢復。通常在執行寫入重做日誌條目的 DML 操作之前,應該僅啟用它一小段時間。此選項僅在使用WITH_DEBUG CMake 選項編譯除錯支援時才可用。

  • innodb_checksum_algorithm

    命令列格式 --innodb-checksum-algorithm=value
    系統變數 innodb_checksum_algorithm
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 列舉
    預設值 crc32
    有效值 crc32``strict_crc32``innodb``strict_innodb``none``strict_none

    指定如何生成和驗證InnoDB表空間中磁碟塊中儲存的校驗和。innodb_checksum_algorithm的預設值為crc32

    MySQL 企業備份版本直到 3.8.0 不支援備份使用 CRC32 校驗和的表空間。MySQL 企業備份在 3.8.1 中新增了 CRC32 校驗和支援,但有一些限制。有關更多資訊,請參考 MySQL 企業備份 3.8.1 變更歷史。

    innodb向後相容早期版本的 MySQL。值crc32使用一種更快的演算法來計算每個修改塊的校驗和,並檢查每個磁碟讀取的校驗和。它每次掃描 64 位塊,比每次掃描 8 位塊的innodb校驗演算法更快。值none在校驗欄位中寫入一個常數值,而不是基於塊資料計算值。表空間中的塊可以使用舊、新和無校驗和值的混合,隨著資料逐漸修改而逐步更新;一旦表空間中的塊被修改為使用crc32演算法,相關表將無法被早期版本的 MySQL 讀取。

    校驗演算法的嚴格形式在表空間中遇到有效但不匹配的校驗和值時會報錯。建議您只在新例項中使用嚴格設定,首次設定表空間。嚴格設定略快,因為在磁碟讀取期間不需要計算所有校驗和值。

    以下表格顯示了noneinnodbcrc32選項值及其嚴格對應項之間的區別。noneinnodbcrc32將指定型別的校驗和值寫入每個資料塊,但在驗證讀取操作期間的塊時,也接受其他校驗和值以確保相容性。嚴格設定還接受有效的校驗和值,但在遇到有效但不匹配的校驗和值時會列印錯誤訊息。如果例項中的所有InnoDB資料檔案都是在相同的innodb_checksum_algorithm值下建立的,則使用嚴格形式可以使驗證更快。

    表 17.26 允許的 innodb_checksum_algorithm 值

    生成的校驗和(寫入時) 允許的校驗和(讀取時)
    none 一個常數值。 noneinnodbcrc32生成的任何校驗和。
    innodb 使用InnoDB原始演算法在軟體中計算的校驗和。 noneinnodbcrc32生成的任何校驗和。
    crc32 使用crc32演算法計算的校驗和,可能使用硬體輔助完成。 noneinnodbcrc32生成的任何校驗和。
    strict_none 一個常數值 noneinnodbcrc32生成的任何校驗和。如果遇到有效但不匹配的校驗和,InnoDB會列印錯誤訊息。
    strict_innodb 使用InnoDB原始演算法在軟體中計算的校驗和。 noneinnodbcrc32生成的任何校驗和。如果遇到有效但不匹配的校驗和,InnoDB會列印錯誤訊息。
    strict_crc32 使用crc32演算法計算的校驗和,可能使用硬體輔助完成。 noneinnodbcrc32生成的任何校驗和。如果遇到有效但不匹配的校驗和,InnoDB會列印錯誤訊息。
  • innodb_cmp_per_index_enabled

    命令列格式 --innodb-cmp-per-index-enabled[={OFF&#124;ON}]
    系統變數 innodb_cmp_per_index_enabled
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    啟用資訊模式INNODB_CMP_PER_INDEX表中每個索引的壓縮相關統計資訊。由於這些統計資訊可能很昂貴,只在與InnoDB 壓縮表相關的效能調優期間的開發、測試或副本例項上啟用此選項。

    更多資訊,請參閱第 28.4.8 節,“INFORMATION_SCHEMA INNODB_CMP_PER_INDEX 和 INNODB_CMP_PER_INDEX_RESET 表”,以及第 17.9.1.4 節,“執行時監視 InnoDB 表壓縮”。

  • innodb_commit_concurrency

    命令列格式 --innodb-commit-concurrency=#
    系統變數 innodb_commit_concurrency
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 1000

    可以同時提交的執行緒數量。值為 0(預設值)允許任意數量的事務同時提交。

    innodb_commit_concurrency的值不能在執行時從零更改為非零或反之。可以從一個非零值更改為另一個非零值。

  • innodb_compress_debug

    命令列格式 --innodb-compress-debug=value
    系統變數 innodb_compress_debug
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 列舉
    預設值 none
    有效值 none``zlib``lz4``lz4hc

    使用指定的壓縮演算法壓縮所有表,而無需為每個表定義COMPRESSION屬性。此選項僅在使用WITH_DEBUG CMake 選項編譯除錯支援時才可用。

    有關更多資訊,請參閱第 17.9.2 節,“InnoDB 頁面壓縮”。

  • innodb_compression_failure_threshold_pct

    命令列格式 --innodb-compression-failure-threshold-pct=#
    系統變數 innodb_compression_failure_threshold_pct
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 5
    最小值 0
    最大值 100

    定義表的壓縮失敗率閾值,以百分比表示,在此閾值之上,MySQL 開始在壓縮頁面內新增填充,以避免昂貴的壓縮失敗。當超過此閾值時,MySQL 開始在每個新的壓縮頁面內留下額外的空閒空間,動態調整空閒空間的量,直到達到由innodb_compression_pad_pct_max指定的頁面大小百分比。值為零會禁用監視壓縮效率並動態調整填充量的機制。

    有關更多資訊,請參閱第 17.9.1.6 節,“OLTP 工作負載的壓縮”。

  • innodb_compression_level

    命令列格式 --innodb-compression-level=#
    系統變數 innodb_compression_level
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 6
    最小值 0
    最大值 9

    指定用於InnoDB壓縮表和索引的 zlib 壓縮級別。較高的值可以讓您將更多資料放入儲存裝置,但會增加壓縮時的 CPU 開銷。較低的值可以減少 CPU 開銷,當儲存空間不是關鍵問題,或者您預計資料不太容易壓縮時使用。

    更多資訊,請參閱第 17.9.1.6 節,“OLTP 工作負載的壓縮”。

  • innodb_compression_pad_pct_max

    命令列格式 --innodb-compression-pad-pct-max=#
    系統變數 innodb_compression_pad_pct_max
    作用域 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 50
    最小值 0
    最大值 75

    指定每個壓縮頁內可保留為自由空間的最大百分比,以便在更新壓縮表或索引時重新組織資料和修改日誌,並在資料可能被重新壓縮時為頁內留出空間。僅在innodb_compression_failure_threshold_pct設定為非零值,並且壓縮失敗的速率超過截止點時才適用。

    更多資訊,請參閱第 17.9.1.6 節,“OLTP 工作負載的壓縮”。

  • innodb_concurrency_tickets

    命令列格式 --innodb-concurrency-tickets=#
    系統變數 innodb_concurrency_tickets
    作用域 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 5000
    最小值 1
    最大值 4294967295

    確定可以同時進入InnoDB的執行緒數量。當嘗試進入InnoDB的執行緒數已達到併發限制時,執行緒將被放置在佇列中。當執行緒被允許進入InnoDB時,它將獲得與innodb_concurrency_tickets值相等的“票”,並且執行緒可以自由進入和離開InnoDB直到使用完票為止。在那之後,執行緒再次成為併發檢查的物件(可能排隊),下次嘗試進入InnoDB時。預設值為 5000。

    具有較小的innodb_concurrency_tickets值時,只需要處理少量行的小事務與處理許多行的大事務公平競爭。較小的innodb_concurrency_tickets值的缺點是,大型事務必須多次遍歷佇列才能完成,這會延長完成任務所需的時間。

    具有較大的innodb_concurrency_tickets值,大型事務等待佇列末尾位置的時間較短(由innodb_thread_concurrency控制),更多時間用於檢索行。大型事務還需要較少的佇列遍歷次數才能完成任務。較大的innodb_concurrency_tickets值的缺點是,同時執行太多大型事務可能會透過使它們等待更長時間來執行,使較小事務飢餓。

    具有非零的innodb_thread_concurrency值時,您可能需要調整innodb_concurrency_tickets值,以找到較大和較小事務之間的最佳平衡。SHOW ENGINE INNODB STATUS報告顯示了當前透過佇列執行事務時剩餘的票數。此資料也可以從資訊模式INNODB_TRX表的TRX_CONCURRENCY_TICKETS列中獲取。

    有關更多資訊,請參見第 17.8.4 節,“配置 InnoDB 的執行緒併發性”。

  • innodb_data_file_path

    命令列格式 --innodb-data-file-path=file_name
    系統變數 innodb_data_file_path
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 字串
    預設值 ibdata1:12M:autoextend

    定義InnoDB系統表空間資料檔案的名稱、大小和屬性。如果未為innodb_data_file_path指定值,則預設行為是建立一個稍大於 12MB 的單個自動擴充套件資料檔案,命名為ibdata1

    資料檔案規範的完整語法包括檔名、檔案大小、autoextend屬性和max屬性:

    *file_name*:*file_size*[:autoextend[:max:*max_file_size*]]
    

    檔案大小透過在大小值後附加KMG來指定為千位元組、兆位元組或千兆位元組。如果以千位元組指定資料檔案大小,請以 1024 的倍數進行。否則,KB 值將四捨五入到最近的兆位元組(MB)邊界。檔案大小之和必須至少略大於 12MB。

    有關其他配置資訊,請參閱系統表空間資料檔案配置。有關調整大小的說明,請參閱調整系統表空間大小。

  • innodb_data_home_dir

    命令列格式 --innodb-data-home-dir=dir_name
    系統變數 innodb_data_home_dir
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 目錄名稱

    InnoDB系統表空間資料檔案的目錄路徑的公共部分。預設值為 MySQL 的data目錄。該設定與innodb_data_file_path設定連線在一起,除非該設定使用絕對路徑定義。

    在為innodb_data_home_dir指定值時,需要新增尾隨斜槓。例如:

    [mysqld]
    innodb_data_home_dir = /path/to/myibdata/
    

    此設定不影響 file-per-table 表空間的位置。

    有關資訊,請參閱第 17.8.1 節,“InnoDB 啟動配置”。

  • innodb_ddl_buffer_size

    命令列格式 --innodb-ddl-buffer-size=#
    引入版本 8.0.27
    系統變數 innodb_ddl_buffer_size
    範圍 全域性,會話
    動態
    SET_VAR提示適用
    型別 整數
    預設值 1048576
    最小值 65536
    最大值 4294967295
    單位 位元組

    定義了 DDL 操作的最大緩衝區大小。預設設定為 1048576 位元組(約 1 MB)。適用於建立或重建二級索引的線上 DDL 操作。請參見第 17.12.4 節,“線上 DDL 記憶體管理”。每個 DDL 執行緒的最大緩衝區大小是最大緩衝區大小除以 DDL 執行緒數(innodb_ddl_buffer_size/innodb_ddl_threads)。

  • innodb_ddl_log_crash_reset_debug

    命令列格式 --innodb-ddl-log-crash-reset-debug[={OFF&#124;ON}]
    系統變數 innodb_ddl_log_crash_reset_debug
    作用範圍 全域性
    動態
    SET_VAR Hint Applies
    型別 布林值
    預設值 OFF

    啟用此除錯選項可將 DDL 日誌崩潰注入計數器重置為 1。此選項僅在使用WITH_DEBUG CMake 選項編譯時才可用。

  • innodb_ddl_threads

    命令列格式 --innodb-ddl-threads=#
    引入版本 8.0.27
    系統變數 innodb_ddl_threads
    作用範圍 全域性,會話
    動態
    SET_VAR Hint Applies
    型別 整數
    預設值 4
    最小值 1
    最大值 64

    定義了索引建立的排序和構建階段的最大並行執行緒數。適用於建立或重建二級索引的線上 DDL 操作。有關更多資訊,請參見第 17.12.5 節,“配置線上 DDL 操作的並行執行緒”和第 17.12.4 節,“線上 DDL 記憶體管理”。

  • innodb_deadlock_detect

    命令列格式 --innodb-deadlock-detect[={OFF&#124;ON}]
    系統變數 innodb_deadlock_detect
    作用範圍 全域性
    動態
    SET_VAR Hint Applies
    型別 布林值
    預設值 ON

    此選項用於禁用死鎖檢測。在高併發系統中,死鎖檢測可能導致大量執行緒等待同一鎖時減速。有時,更有效的做法是禁用死鎖檢測,並依賴於innodb_lock_wait_timeout設定在死鎖發生時進行事務回滾。

    有關更多資訊,請參閱第 17.7.5.2 節,“死鎖檢測”。

  • innodb_dedicated_server

    命令列格式 --innodb-dedicated-server[={OFF&#124;ON}]
    系統變數 innodb_dedicated_server
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 OFF

    當啟用innodb_dedicated_server時,InnoDB會自動配置以下變數:

    • innodb_buffer_pool_size

    • innodb_redo_log_capacity或在 MySQL 8.0.30 之前,innodb_log_file_sizeinnodb_log_files_in_group

      注意

      innodb_log_file_sizeinnodb_log_files_in_group在 MySQL 8.0.30 中已棄用。這些變數已被innodb_redo_log_capacity取代。有關更多資訊,請參閱第 17.6.5 節,“重做日誌”。

    • innodb_flush_method

    只有在 MySQL 例項位於可以使用所有可用系統資源的專用伺服器上時,才考慮啟用innodb_dedicated_server。如果 MySQL 例項與其他應用程式共享系統資源,則不建議啟用innodb_dedicated_server

    更多資訊,請參閱第 17.8.12 節,“為專用 MySQL 伺服器啟用自動配置”。

  • innodb_default_row_format

    命令列格式 --innodb-default-row-format=value
    系統變數 innodb_default_row_format
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 列舉
    預設值 DYNAMIC
    有效值 REDUNDANT``COMPACT``DYNAMIC

    innodb_default_row_format選項定義了InnoDB表和使用者建立的臨時表的預設行格式。預設設定為DYNAMIC。其他允許的值為COMPACTREDUNDANT。不支援在系統表空間中使用的COMPRESSED行格式不能定義為預設值。

    新建立的表在未明確指定ROW_FORMAT選項或使用ROW_FORMAT=DEFAULT時,會使用由innodb_default_row_format定義的行格式。

    當未明確指定ROW_FORMAT選項或使用ROW_FORMAT=DEFAULT時,任何重建表的操作都會悄無聲息地將表的行格式更改為由innodb_default_row_format定義的格式。更多資訊,請參閱定義表的行格式。

    伺服器為處理查詢而建立的內部InnoDB臨時表使用DYNAMIC行格式,不受innodb_default_row_format設定的影響。

  • innodb_directories

    命令列格式 --innodb-directories=dir_name
    系統變數 innodb_directories
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 目錄名稱
    預設值 NULL

    定義在啟動時掃描用於表空間檔案的目錄。在伺服器離線時移動或恢復表空間檔案到新位置時使用此選項。還用於指定使用絕對路徑建立或位於資料目錄之外的表空間檔案的目錄。

    在崩潰恢復期間,表空間的發現依賴於innodb_directories設定來識別重做日誌中引用的表空間。更多資訊,請參閱崩潰恢復期間的表空間發現。

    預設值為 NULL,但由innodb_data_home_dirinnodb_undo_directorydatadir定義的目錄始終會在InnoDB在啟動時構建要掃描的目錄列表時附加到innodb_directories引數值。這些目錄會被附加,無論是否明確指定了innodb_directories設定。

    innodb_directories可以作為啟動命令中的選項或 MySQL 選項檔案中的選項指定。引號包圍引數值,否則某些命令直譯器會將分號(;)解釋為特殊字元。(例如,Unix shell 將其視為命令終止符。)

    啟動命令:

    mysqld --innodb-directories="*directory_path_1*;*directory_path_2*"
    

    MySQL 選項檔案:

    [mysqld]
    innodb_directories="*directory_path_1*;*directory_path_2*"
    

    不能使用萬用字元表示式來指定目錄。

    innodb_directories掃描還會遍歷指���目錄的子目錄。重複的目錄和子目錄將從要掃描的目錄列表中丟棄。

    有關更多資訊,請參見第 17.6.3.6 節,“伺服器離線時移動表空間檔案”。

  • innodb_disable_sort_file_cache

    命令列格式 --innodb-disable-sort-file-cache[={OFF&#124;ON}]
    系統變數 innodb_disable_sort_file_cache
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 OFF

    禁用合併排序臨時檔案的作業系統檔案系統快取。效果是以O_DIRECT的等效方式開啟這些檔案。

  • innodb_doublewrite

    命令列格式 --innodb-doublewrite=value(≥ 8.0.30)--innodb-doublewrite[={OFF&#124;ON}](≤ 8.0.29)
    系統變數 innodb_doublewrite
    作用範圍 全域性
    動態(≥ 8.0.30)
    動態(≤ 8.0.29)
    SET_VAR提示適用
    型別(≥ 8.0.30) 列舉
    型別(≤ 8.0.29) 布林值
    預設值 ON
    有效值 ON``OFF``DETECT_AND_RECOVER``DETECT_ONLY

    innodb_doublewrite變數控制雙寫緩衝。在大多數情況下,預設情況下啟用雙寫緩衝。

    在 MySQL 8.0.30 之前,您可以在啟動伺服器時將innodb_doublewrite設定為ONOFF以分別啟用或禁用雙寫緩衝,從 MySQL 8.0.30 開始,innodb_doublewrite還支援DETECT_AND_RECOVERDETECT_ONLY設定。

    DETECT_AND_RECOVER設定與ON設定相同。使用此設定,雙寫緩衝區完全啟用,資料庫頁面內容被寫入雙寫緩衝區,在恢復過程中訪問以修復不完整的頁面寫入。

    使用DETECT_ONLY設定時,只有後設資料被寫入雙寫緩衝區。資料庫頁面內容不會被寫入雙寫緩衝區,並且恢復不使用雙寫緩衝區來修復不完整的頁面寫入。此輕量級設定僅用於檢測不完整的頁面寫入。

    MySQL 8.0.30 及更高版本支援動態更改innodb_doublewrite設定,可以在ONDETECT_AND_RECOVERDETECT_ONLY之間啟用雙寫緩衝區。MySQL 不支援在啟用雙寫緩衝區和OFF之間進行動態更改。

    如果雙寫緩衝區位於支援原子寫入的 Fusion-io 裝置上,則雙寫緩衝區將自動禁用,並且資料檔案寫入將使用 Fusion-io 原子寫入。但是,請注意innodb_doublewrite設定是全域性的。當雙寫緩衝區被禁用時,所有資料檔案都被禁用,包括那些不位於 Fusion-io 硬體上的檔案。此功能僅在 Fusion-io 硬體上受支援,並且僅在 Linux 上為 Fusion-io NVMFS 啟用。為了充分利用此功能,建議將innodb_flush_method設定為O_DIRECT

    有關相關資訊,請參見第 17.6.4 節,“雙寫緩衝區”。

  • innodb_doublewrite_batch_size

    命令列格式 --innodb-doublewrite-batch-size=#
    引入版本 8.0.20
    系統變數 innodb_doublewrite_batch_size
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 256

    定義要批次寫入的雙寫頁面數。

    有關更多資訊,請參見第 17.6.4 節,“雙寫緩衝區”。

  • innodb_doublewrite_dir

    命令列格式 --innodb-doublewrite-dir=dir_name
    引入版本 8.0.20
    系統變數 innodb_doublewrite_dir
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 目錄名稱

    定義雙寫檔案的目錄。如果未指定目錄,則雙寫檔案將在innodb_data_home_dir目錄中建立,預設情況下為資料目錄(如果未指定)。

    更多資訊,請參見第 17.6.4 節,“雙寫緩衝區”。

  • innodb_doublewrite_files

    命令列格式 --innodb-doublewrite-files=#
    引入版本 8.0.20
    系統變數 innodb_doublewrite_files
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 innodb_buffer_pool_instances * 2
    最小值 2
    最大值 256

    定義雙寫檔案的數量。預設情況下,為每個緩衝池例項建立兩個雙寫檔案。

    至少有兩個雙寫檔案。雙寫檔案的最大數量是緩衝池例項數量的兩倍。(緩衝池例項數量由innodb_buffer_pool_instances變數控制。)

    更多資訊,請參見第 17.6.4 節,“雙寫緩衝區”。

  • innodb_doublewrite_pages

    命令列格式 --innodb-doublewrite-pages=#
    引入版本 8.0.20
    系統變數 innodb_doublewrite_pages
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 innodb_write_io_threads value
    最小值 innodb_write_io_threads value
    最大值 512

    定義每個執行緒的批次寫入的雙寫頁面的最大數量。如果未指定值,則innodb_doublewrite_pages設定為innodb_write_io_threads的值。

    更多資訊,請參見第 17.6.4 節,“雙寫緩衝區”。

  • innodb_extend_and_initialize

    命令列格式 --innodb=extend-and-initialize[={OFF&#124;ON}]
    引入版本 8.0.22
    系統變數 innodb_extend_and_initialize
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 ON

    控制在 Linux 系統上為每個表和通用表空間分配空間的方式。

    啟用時,InnoDB會將 NULL 寫入新分配的頁面。禁用時,空間是透過posix_fallocate()呼叫進行分配的,該呼叫保留空間而不實際寫入 NULL。

    欲瞭解更多資訊,請參閱第 17.6.3.8 節,“最佳化 Linux 上的表空間空間分配”。

  • innodb_fast_shutdown

    命令列格式 --innodb-fast-shutdown=#
    系統變數 innodb_fast_shutdown
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 1
    有效值 0``1``2

    InnoDB 關閉模式。如果值為 0,則InnoDB在關閉之前執行慢關閉、完全清理和更改緩衝區合併。如果值為 1(預設值),InnoDB在關閉時跳過這些操作,這個過程稱為快速關閉。如果值為 2,則InnoDB重新整理其日誌並冷靜���閉,就像 MySQL 崩潰了一樣;沒有提交的事務會丟失,但崩潰恢復操作會使下一次啟動時間變長。

    慢關閉可能需要幾分鐘,甚至在極端情況下,仍有大量資料緩衝時可能需要幾個小時。在升級或降級 MySQL 主要版本之前,請使用慢關閉技術,以便在升級過程中更新檔案格式時,所有資料檔案都已準備就緒。

    在緊急情況或故障排除情況下使用innodb_fast_shutdown=2,以獲得絕對最快的關閉速度,如果資料有損壞風險。

  • innodb_fil_make_page_dirty_debug

    命令列格式 --innodb-fil-make-page-dirty-debug=#
    系統變數 innodb_fil_make_page_dirty_debug
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 2**32-1

    預設情況下,將 innodb_fil_make_page_dirty_debug 設定為表空間的 ID 會立即使表空間的第一頁變髒。如果 innodb_saved_page_number_debug 設定為非預設值,則設定 innodb_fil_make_page_dirty_debug 會使指定頁變髒。只有在使用 WITH_DEBUG CMake 選項編譯時,才能使用 innodb_fil_make_page_dirty_debug 選項。

  • innodb_file_per_table

    命令列格式 --innodb-file-per-table[={OFF&#124;ON}]
    系統變數 innodb_file_per_table
    作用域 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 ON

    當啟用 innodb_file_per_table 時,預設情況下表會在檔案表空間中建立。當禁用時,預設情況下表會在系統表空間中建立。有關檔案表空間的資訊,請參閱 第 17.6.3.2 節,“檔案表空間”。有關 InnoDB 系統表空間的資訊,請參閱 第 17.6.3.1 節,“系統表空間”。

    innodb_file_per_table 變數可以透過 SET GLOBAL 語句在執行時配置,在啟動時在命令列上指定,或在選項檔案中指定。在執行時配置需要足夠的許可權來設定全域性系統變數(參見 第 7.1.9.1 節,“系統變數許可權”),並立即影響所有連線的操作。

    當位於檔案表空間中的表被截斷或刪除時,釋放的空間會返回給作業系統。截斷或刪除位於系統表空間中的表只會釋放系統表空間中的空間。系統表空間中釋放的空間可以再次用於 InnoDB 資料,但不會返回給作業系統,因為系統表空間資料檔案永遠不會收縮。

    innodb_file_per-table 設定不影響臨時表的建立。從 MySQL 8.0.14 開始,臨時表在會話臨時表空間中建立,在此之前是在全域性臨時表空間中建立。請參閱 第 17.6.3.5 節,“臨時表空間”。

  • innodb_fill_factor

    命令列格式 --innodb-fill-factor=#
    系統變數 innodb_fill_factor
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 100
    最小值 10
    最大值 100

    InnoDB 在建立或重建索引時執行批次載入。這種索引建立方法被稱為“排序索引構建”。

    innodb_fill_factor 定義了在排序索引構建期間填充在每個 B 樹頁上的空間百分比,剩餘空間保留用於未來的索引增長���例如,將 innodb_fill_factor 設定為 80,將在每個 B 樹頁上保留 20% 的空間用於未來的索引增長。實際百分比可能有所不同。innodb_fill_factor 設定被解釋為提示而不是硬限制。

    innodb_fill_factor 設定為 100,將聚簇索引頁中的 1/16 空間留給未來的索引增長。

    innodb_fill_factor 適用於 B 樹葉子頁和非葉子頁。它不適用於用於 TEXTBLOB 條目的外部頁。

    欲瞭解更多資訊,請參閱 第 17.6.2.3 節,“排序索引構建”。

  • innodb_flush_log_at_timeout

    命令列格式 --innodb-flush-log-at-timeout=#
    系統變數 innodb_flush_log_at_timeout
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 1
    最小值 1
    最大值 2700
    單位

    每隔N秒寫入並重新整理日誌。innodb_flush_log_at_timeout允許增加重新整理之間的超時時間,以減少重新整理並避免影響二進位制日誌組提交的效能。innodb_flush_log_at_timeout的預設設定是每秒一次。

  • innodb_flush_log_at_trx_commit

    命令列格式 --innodb-flush-log-at-trx-commit=#
    系統變數 innodb_flush_log_at_trx_commit
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 列舉
    預設值 1
    有效值 0``1``2

    控制嚴格的 ACID 合規性和在重新排列和批次執行與提交相關的 I/O 操作時可能實現的更高效能之間的平衡。透過更改預設值,您可以獲得更好的效能,但在崩潰時可能會丟失事務。

    • 預設設定為 1 是為了完全符合 ACID 要求。日誌在每次事務提交時被寫入並重新整理到磁碟。

    • 設定為 0 時,日誌每秒寫入並重新整理到磁碟一次。在崩潰時可能會丟失未重新整理日誌的事務。

    • 設定為 2 時,日誌在每次事務提交後寫入並每秒重新整理到磁碟一次。在崩潰時可能會丟失未重新整理日誌的事務。

    • 對於設定為 0 和 2 的情況,每秒重新整理並不是 100%保證的。由於 DDL 更改和其他內部InnoDB活動可能導致日誌獨立於innodb_flush_log_at_trx_commit設定而更頻繁地重新整理,有時由於排程問題而更少地重新整理。如果日誌每秒重新整理一次,在崩潰時可能會丟失最多一秒鐘的事務。如果日誌的重新整理頻率高於或低於每秒一次,可能會相應地丟失不同數量的事務。

    • 日誌重新整理頻率由innodb_flush_log_at_timeout控制,允許您將日誌重新整理頻率設定為N秒(其中N1 ... 2700,預設值為 1)。然而,任何意外的mysqld程序退出可能會擦除最多N秒的事務。

    • DDL 更改和其他內部InnoDB活動會獨立於innodb_flush_log_at_trx_commit設定重新整理日誌。

    • InnoDB 崩潰恢復無論innodb_flush_log_at_trx_commit設定如何都能正常工作。事務要麼完全應用,要麼完全擦除。

    對於使用帶有事務的InnoDB的複製設定中的耐用性和一致性:

    • 如果啟用了二進位制日誌記錄,請設定sync_binlog=1

    • 始終設定innodb_flush_log_at_trx_commit=1

    對於在複製品上組合設定的資訊,以使其對意外停機最具彈性,請參閱第 19.4.2 節,“處理複製品意外停機”。

    警告

    許多作業系統和一些磁碟硬體欺騙了重新整理到磁碟的操作。它們可能會告訴mysqld重新整理已經完成,儘管實際上並沒有。在這種情況下,即使使用推薦的設定,事務的永續性也無法得到保證,最壞的情況下,斷電可能會損壞InnoDB資料。在 SCSI 磁碟控制器或磁碟本身中使用帶電池後備的磁碟快取可以加快檔案重新整理速度,並使操作更安全。您還可以嘗試禁用硬體快取中的磁碟寫入快取。

  • innodb_flush_method

    命令列格式 --innodb-flush-method=value
    系統變數 innodb_flush_method
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 字串
    預設值(Unix) fsync
    預設值(Windows) unbuffered
    有效值(Unix) fsync``O_DSYNC``littlesync``nosync``O_DIRECT``O_DIRECT_NO_FSYNC
    有效值(Windows) unbuffered``normal

    定義用於將資料重新整理到InnoDB資料檔案和日誌檔案的方法,這可能會影響 I/O 吞吐量。

    在類 Unix 系統上,預設值為fsync。在 Windows 上,預設值為unbuffered

    注意

    在 MySQL 8.0 中,可以透過數字方式指定innodb_flush_method選項。

    適用於類 Unix 系統的innodb_flush_method選項包括:

    • fsync0InnoDB使用fsync()系統呼叫來重新整理資料和日誌檔案。fsync是預設設定。

    • O_DSYNC1InnoDB使用O_SYNC來開啟和重新整理日誌檔案,並使用fsync()來重新整理資料檔案。InnoDB不直接使用O_DSYNC,因為在許多 Unix 變種上存在問題。

    • littlesync2:此選項用於內部效能測試,目前不受支援。請自行承擔風險。

    • nosync3:此選項用於內部效能測試,目前不受支援。請自行承擔風險。

    • O_DIRECT4InnoDB使用O_DIRECT(或 Solaris 上的directio())來開啟資料檔案,並使用fsync()來重新整理資料和日誌檔案。此選項適用於某些 GNU/Linux 版本、FreeBSD 和 Solaris。

    • O_DIRECT_NO_FSYNCInnoDB在重新整理 I/O 時使用O_DIRECT,但在每次寫操作後跳過fsync()系統呼叫。

      在 MySQL 8.0.14 之前,此設定不適用於需要fsync()系統呼叫同步檔案系統後設資料更改的檔案系統,如 XFS 和 EXT4。如果不確定您的檔案系統是否需要fsync()系統呼叫來同步檔案系統後設資料更改,請改用O_DIRECT

      自 MySQL 8.0.14 起,在建立新檔案、增加檔案大小和關閉檔案後,會呼叫fsync()以確保檔案系統後設資料更改被同步。每次寫操作後仍會跳過fsync()系統呼叫。

      如果重做日誌檔案和資料檔案位於不同儲存裝置上,並且在資料檔案寫入未從非帶電池備份的裝置快取中重新整理時發生意外退出,則可能會發生資料丟失。如果您使用或打算使用不同的儲存裝置用於重做日誌檔案和資料檔案,並且您的資料檔案位於沒有帶電池備份的快取的裝置上,請改用O_DIRECT

    在支援fdatasync()系統呼叫的平臺上,MySQL 8.0.26 中引入的innodb_use_fdatasync變數允許使用fsync()innodb_flush_method選項來代替fdatasync()fdatasync()系統呼叫不會重新整理檔案後設資料,除非需要用於後續資料檢索,從而提供潛在的效能優勢。

    Windows 系統的innodb_flush_method選項包括:

    • unbuffered0InnoDB使用模擬非同步 I/O 和非緩衝 I/O。

    • normal1InnoDB使用模擬非同步 I/O 和緩衝 I/O。

    每個設定如何影響效能取決於硬體配置和工作負載。基準測試您的特定配置以決定使用哪個設定,或者是否保留預設設定。檢查Innodb_data_fsyncs狀態變數,檢視每個設定的fsync()呼叫總數(如果啟用了innodb_use_fdatasync,則為fdatasync()呼叫)。工作負載中讀取和寫入操作的混合可能會影響設定的效能。例如,在具有硬體 RAID 控制器和帶電池後備寫快取的系統上,O_DIRECT可以幫助避免InnoDB緩衝池和作業系統檔案系統快取之間的雙重緩衝。在一些InnoDB資料和日誌檔案位於 SAN 上的系統中,預設值或O_DSYNC可能對大部分為SELECT語句的讀取密集型工作負載更快。始終使用反映生產環境的硬體和工作負載測試此引數。有關一般 I/O 調優建議,請參見第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

    如果啟用了innodb_dedicated_server,則如果未明確定義,innodb_flush_method值將自動配置。有關更多資訊,請參見第 17.8.12 節,“為專用 MySQL 伺服器啟用自動配置”。

  • innodb_flush_neighbors

    命令列格式 --innodb-flush-neighbors=#
    系統變數 innodb_flush_neighbors
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 列舉
    預設值 0
    有效值 0``1``2

    指定從InnoDB緩衝池重新整理頁面時是否也重新整理同一範圍中的其他髒頁。

    • 設定為 0 會禁用innodb_flush_neighbors。同一範圍內的髒頁不會被重新整理。

    • 設定為 1 會重新整理同一範圍內連續的髒頁。

    • 設定為 2 會重新整理同一範圍內的髒頁。

    當表資料儲存在傳統的 HDD 儲存裝置上時,一次重新整理這樣的相鄰頁減少了 I/O 開銷(主要是磁碟尋道操作)與在不同時間重新整理單個頁相比。對於儲存在 SSD 上的表資料,尋道時間不是一個重要因素,您可以將此選項設定為 0 以分散寫操作。有關相關資訊,請參見第 17.8.3.5 節,“配置緩衝池重新整理”。

  • innodb_flush_sync

    命令列格式 --innodb-flush-sync[={OFF&#124;ON}]
    系統變數 innodb_flush_sync
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林
    預設值 ON

    預設情況下啟用的innodb_flush_sync變數導致在檢查點發生 I/O 活動突發時忽略innodb_io_capacity設定。要遵守由innodb_io_capacity設定定義的 I/O 速率,在 I/O 活動突發時禁用innodb_flush_sync

    有關配置innodb_flush_sync變數的資訊,請參見第 17.8.7 節,“配置 InnoDB I/O 容量”。

  • innodb_flushing_avg_loops

    命令列格式 --innodb-flushing-avg-loops=#
    系統變數 innodb_flushing_avg_loops
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 30
    最小值 1
    最大值 1000

    InnoDB保留先前計算的重新整理狀態快照的迭代次數,控制自適應重新整理對變化的工作負載作出響應的速度。增加該值使得重新整理操作的速率在工作負載變化時平穩逐漸變化。減少該值使得自適應重新整理快速調整到工作負載變化,這可能導致重新整理活動在工作負載突然增加和減少時出現波動。

    有關相關資訊,請參閱第 17.8.3.5 節,“配置緩衝池重新整理”。

  • innodb_force_load_corrupted

    命令列格式 --innodb-force-load-corrupted[={OFF&#124;ON}]
    系統變數 innodb_force_load_corrupted
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 OFF

    允許InnoDB在啟動時載入標記為損壞的表格。僅在故障排除期間使用,以恢復其他無法訪問的資料。故障排除完成後,請禁用此設定並重新啟動伺服器。

  • innodb_force_recovery

    命令列格式 --innodb-force-recovery=#
    系統變數 innodb_force_recovery
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 6

    崩潰恢復模式,通常僅在嚴重故障排除情況下更改。可能的值為 0 到 6。有關這些值的含義以及關於innodb_force_recovery的重要資訊,請參閱第 17.21.3 節,“強制 InnoDB 恢復”。

    警告

    僅在緊急情況下將此變數設定為大於 0 的值,以便您可以啟動InnoDB並轉儲表格。作為安全措施,當innodb_force_recovery大於 0 時,InnoDB會阻止INSERTUPDATEDELETE操作。innodb_force_recovery設定為 4 或更高時,將InnoDB置於只讀模式。

    這些限制可能導致複製管理命令失敗並顯示錯誤,因為複製將副本狀態日誌儲存在InnoDB表中。

  • innodb_fsync_threshold

    命令列格式 --innodb-fsync-threshold=#
    引入版本 8.0.13
    系統變數 innodb_fsync_threshold
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 2**64-1

    預設情況下,當InnoDB建立新的資料檔案,例如新的日誌檔案或表空間檔案時,檔案在重新整理到磁碟之前會完全寫入作業系統快取,這可能導致大量的磁碟寫入活動一次性發生。為了強制從作業系統快取中定期重新整理較小的資料塊,您可以使用innodb_fsync_threshold變數定義一個閾值值,以位元組為單位。當達到位元組閾值時,作業系統快取的內容會重新整理到磁碟。預設值為 0,強制預設行為,即僅在檔案完全寫入快取後才將資料重新整理到磁碟。

    指定閾值以強制較小的定期重新整理可能有益於多個 MySQL 例項使用相同儲存裝置的情況。例如,建立新的 MySQL 例項及其關聯的資料檔案可能導致大量的磁碟寫入活動激增,影響使用相同儲存裝置的其他 MySQL 例項的效能。配置閾值有助於避免此類寫入活動激增。

  • innodb_ft_aux_table

    系統變數 innodb_ft_aux_table
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 字串

    指定包含FULLTEXT索引的InnoDB表的限定名稱。此變數僅用於診斷目的,並且只能在執行時設定。例如:

    SET GLOBAL innodb_ft_aux_table = 'test/t1';
    

    將此變數設定為格式為*db_name*/*table_name*的名稱後,INFORMATION_SCHEMAINNODB_FT_INDEX_TABLEINNODB_FT_INDEX_CACHEINNODB_FT_CONFIGINNODB_FT_DELETEDINNODB_FT_BEING_DELETED顯示關於指定表的搜尋索引的資訊。

    更多資訊,請參見 第 17.15.4 節,“InnoDB INFORMATION_SCHEMA FULLTEXT Index Tables”。

  • innodb_ft_cache_size

    命令列格式 --innodb-ft-cache-size=#
    系統變數 innodb_ft_cache_size
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 8000000
    最小值 1600000
    最大值 80000000
    單位 位元組

    InnoDB FULLTEXT 搜尋索引快取分配的記憶體量(以位元組為單位),在建立 InnoDB FULLTEXT 索引時,該快取在記憶體中儲存解析的文件。僅當達到 innodb_ft_cache_size 大小限制時,索引插入和更新才會提交到磁碟。innodb_ft_cache_size 定義了每個表的快取大小。要為所有表設定全侷限制,請參閱 innodb_ft_total_cache_size

    欲瞭解更多資訊,請參閱 InnoDB 全文索引快取。

  • innodb_ft_enable_diag_print

    命令列格式 --innodb-ft-enable-diag-print[={OFF&#124;ON}]
    系統變數 innodb_ft_enable_diag_print
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    是否啟用額外的全文搜尋(FTS)診斷輸出。此選項主要用於高階 FTS 除錯,對大多數使用者不感興趣。輸出列印到錯誤日誌中,包括以下資訊:

    • FTS 索引同步進度(當達到 FTS 快取限制時)。例如:

      FTS SYNC for table test, deleted count: 100 size: 10000 bytes
      SYNC words: 100
      
    • FTS 最佳化進度。例如:

      FTS start optimize test
      FTS_OPTIMIZE: optimize "mysql"
      FTS_OPTIMIZE: processed "mysql"
      
    • FTS 索引構建進度。例如:

      Number of doc processed: 1000
      
    • 對於 FTS 查詢,會列印查詢解析樹、詞權重、查詢處理時間和記憶體使用情況。例如:

      FTS Search Processing time: 1 secs: 100 millisec: row(s) 10000
      Full Search Memory: 245666 (bytes),  Row: 10000
      
  • innodb_ft_enable_stopword

    命令列格式 --innodb-ft-enable-stopword[={OFF&#124;ON}]
    系統變數 innodb_ft_enable_stopword
    作用範圍 全域性,會話
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 ON

    指定在建立 InnoDB FULLTEXT 索引時,與之關聯的一組停用詞。如果設定了 innodb_ft_user_stopword_table 選項,則從該表中獲取停用詞。否則,如果設定了 innodb_ft_server_stopword_table 選項,則從該表中獲取停用詞。否則,將使用內建的預設停用詞集。

    欲瞭解更多資訊,請參閱 第 14.9.4 節,“全文搜尋停用詞”。

  • innodb_ft_max_token_size

    命令列格式 --innodb-ft-max-token-size=#
    系統變數 innodb_ft_max_token_size
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 84
    最小值 10
    最大值 84

    儲存在 InnoDB FULLTEXT 索引中的單詞的最大字元長度。設定此值的限制會減小索引的大小,從而加快查詢速度,透過省略長關鍵詞或不是真實單詞且不太可能是搜尋詞的任意字母集合。

    欲瞭解更多資訊,請參閱 第 14.9.6 節,“調整 MySQL 全文搜尋”。

  • innodb_ft_min_token_size

    命令列格式 --innodb-ft-min-token-size=#
    系統變數 innodb_ft_min_token_size
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 3
    最小值 0
    最大值 16

    儲存在 InnoDB FULLTEXT 索引中的單詞的最小長度。增加此值會減小索引的大小,從而加快查詢速度,透過省略在搜尋上下文中不太可能重要的常見單詞,例如英語單詞“a”和“to”。對於使用 CJK(中文、日文、韓文)字符集的內容,請指定值為 1。

    欲瞭解更多資訊,請參閱 第 14.9.6 節,“調整 MySQL 全文搜尋”。

  • innodb_ft_num_word_optimize

    命令列格式 --innodb-ft-num-word-optimize=#
    系統變數 innodb_ft_num_word_optimize
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 2000
    最小值 1000
    最大值 10000

    在每次對 InnoDB FULLTEXT 索引執行 OPTIMIZE TABLE 操作期間要處理的單詞數。因為對包含全文搜尋索引的表進行大量插入或更新操作可能需要大量的索引維護來合併所有更改,您可能需要執行一系列 OPTIMIZE TABLE 語句,每個語句從上一個語句結束的地方開始。

    更多資訊,請參見 第 14.9.6 節,“調整 MySQL 全文搜尋”。

  • innodb_ft_result_cache_limit

    命令列格式 --innodb-ft-result-cache-limit=#
    系統變數 innodb_ft_result_cache_limit
    作用範圍 全域性
    動態
    SET_VAR 提��適用
    型別 整數
    預設值 2000000000
    最小值 1000000
    最大值 2**32-1
    單位 位元組

    每個全文搜尋查詢或每個執行緒的 InnoDB 全文搜尋查詢結果快取限制(以位元組為單位)。中間和最終的 InnoDB 全文搜尋查詢結果在記憶體中處理。使用 innodb_ft_result_cache_limit 來對全文搜尋查詢結果快取設定大小限制,以避免在出現非常大的 InnoDB 全文搜尋查詢結果(例如數百萬或數億行)時導致過多的記憶體消耗。在處理全文搜尋查詢時根據需要分配記憶體。如果達到結果快取大小限制,將返回錯誤,指示查詢超過允許的最大記憶體。

    所有平臺型別和位數的 innodb_ft_result_cache_limit 的最大值為 2**32-1。

  • innodb_ft_server_stopword_table

    命令列格式 --innodb-ft-server-stopword-table=db_name/table_name
    系統變數 innodb_ft_server_stopword_table
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 字串
    預設值 NULL

    此選項用於為所有 InnoDB 表指定自己的 InnoDB FULLTEXT 索引停用詞列表。要為特定的 InnoDB 表配置自己的停用詞列表,請使用 innodb_ft_user_stopword_table

    innodb_ft_server_stopword_table設定為包含停用詞列表的表的名稱,格式為*db_name*/*table_name*

    在配置innodb_ft_server_stopword_table之前,停用詞表必須存在。在建立FULLTEXT索引之前,必須啟用innodb_ft_enable_stopword,並配置innodb_ft_server_stopword_table選項。

    停用詞表必須是一個InnoDB表,包含一個名為value的單個VARCHAR列。

    更多資訊,請參見第 14.9.4 節,“全文停用詞”。

  • innodb_ft_sort_pll_degree

    命令列格式 --innodb-ft-sort-pll-degree=#
    系統變數 innodb_ft_sort_pll_degree
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 2
    最小值 1
    最大值 16

    在構建搜尋索引時,用於並行索引和標記InnoDB FULLTEXT索引中文字的執行緒數。

    有關資訊,請參見第 17.6.2.4 節,“InnoDB 全文索引”,以及innodb_sort_buffer_size

  • innodb_ft_total_cache_size

    命令列格式 --innodb-ft-total-cache-size=#
    系統變數 innodb_ft_total_cache_size
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 640000000
    最小值 32000000
    最大值 1600000000
    單位 位元組

    為所有表的InnoDB全文搜尋索引快取分配的總記憶體,以位元組為單位。建立多個具有FULLTEXT搜尋索引的表可能會消耗大量可用記憶體。innodb_ft_total_cache_size定義了所有全文搜尋索引的全域性記憶體限制,以幫助避免過度記憶體消耗。如果索引操作達到全侷限制,將觸發強制同步。

    更多資訊,請參見 InnoDB 全文索引快取。

  • innodb_ft_user_stopword_table

    命令列格式 --innodb-ft-user-stopword-table=db_name/table_name
    系統變數 innodb_ft_user_stopword_table
    範圍 全域性,會話
    動態
    SET_VAR 提示適用
    型別 字串
    預設值 NULL

    此選項用於在特定表上指定自己的 InnoDB FULLTEXT 索引停用詞列表。要為所有 InnoDB 表配置自己的停用詞列表,請使用 innodb_ft_server_stopword_table

    innodb_ft_user_stopword_table 設定為包含停用詞列表的表的名稱,格式為 *db_name*/*table_name*

    在配置 innodb_ft_user_stopword_table 之前,停用詞表必須存在。在建立 FULLTEXT 索引之前,必須啟用 innodb_ft_enable_stopword 並配置 innodb_ft_user_stopword_table

    停用詞表必須是一個 InnoDB 表,包含一個名為 value 的單個 VARCHAR 列。

    更多資訊,請參閱 第 14.9.4 節,“全文字停用詞”。

  • innodb_idle_flush_pct

    命令列格式 --innodb-idle-flush-pct=#
    引入版本 8.0.18
    系統變數 innodb_idle_flush_pct
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 100
    最小值 0
    最大值 100

    InnoDB 空閒時限制頁面重新整理。innodb_idle_flush_pct 值是 innodb_io_capacity 設定的百分比,該設定定義了 InnoDB 每秒可用的 I/O 運算元。更多資訊,請參閱 在空閒時期限制緩衝區重新整理。

  • innodb_io_capacity

    命令列格式 --innodb-io-capacity=#
    系統變數 innodb_io_capacity
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 200
    最小值 100
    最大值(64 位平臺) 2**64-1
    最大值(32 位平臺) 2**32-1

    innodb_io_capacity變數定義了InnoDB後臺任務每秒(IOPS)可用的 I/O 運算元量,例如從緩衝池重新整理頁面和從更改緩衝區合併資料。

    有關配置innodb_io_capacity變數的資訊,請參見第 17.8.7 節,“配置 InnoDB I/O 容量”。

  • innodb_io_capacity_max

    命令列格式 --innodb-io-capacity-max=#
    系統變數 innodb_io_capacity_max
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 見描述
    最小值 100
    最大值(32 位平臺) 2**32-1
    最大值(Unix,64 位平臺,≥ 8.0.29) 2**32-1
    最大值(Unix,64 位平臺,≤ 8.0.28) 2**64-1
    最大值(Windows,64 位平臺) 2**32-1

    如果重新整理活動落後,InnoDB可以以比innodb_io_capacity變數定義的更高的 I/O 操作每秒(IOPS)速率更積極地重新整理。innodb_io_capacity_max變數定義了在這種情況下InnoDB後臺任務執行的最大 IOPS 數量。

    有關配置innodb_io_capacity_max變數的資訊,請參見第 17.8.7 節,“配置 InnoDB I/O 容量”。

  • innodb_limit_optimistic_insert_debug

    命令列格式 --innodb-limit-optimistic-insert-debug=#
    系統變數 innodb_limit_optimistic_insert_debug
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 2**32-1

    限制每個 B 樹頁面的記錄數。預設值為 0 表示不施加限制。此選項僅在使用WITH_DEBUG CMake 選項編譯除錯支援時才可用。

  • innodb_lock_wait_timeout

    命令列格式 --innodb-lock-wait-timeout=#
    系統變數 innodb_lock_wait_timeout
    範圍 全域性,會話
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 50
    最小值 1
    最大值 1073741824
    單位

    InnoDB 事務在放棄之前等待行鎖的時間長度(以秒為單位)。預設值為 50 秒。嘗試訪問被另一個InnoDB事務鎖定的行的事務在發出以下錯誤之前最多等待這麼多秒以獲得對行的寫訪問:

    ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
    

    當發生鎖等待超時時,當前語句會被回滾(而不是整個事務)。要使整個事務回滾,請使用--innodb-rollback-on-timeout選項啟動伺服器。另請參見第 17.21.5 節,“InnoDB 錯誤處理”。

    對於高度互動式應用程式或 OLTP 系統,您可以減少此值,以便快速顯示使用者反饋或將更新放入佇列以供稍後處理。對於長時間執行的後端操作,例如資料倉儲中等待其他大型插入或更新操作完成的轉換步驟,您可以增加此值。

    innodb_lock_wait_timeout 適用於 InnoDB 行鎖。MySQL 的表鎖不會發生在 InnoDB 中,因此此超時不適用於等待表鎖。

    當啟用(預設)innodb_deadlock_detect 時,鎖等待超時值不適用於死鎖,因為 InnoDB 立即檢測到死鎖並回滾其中一個死鎖事務。當禁用innodb_deadlock_detect 時,InnoDB 依賴於innodb_lock_wait_timeout 在發生死鎖時進行事務回滾。參見第 17.7.5.2 節,“死鎖檢測”。

    innodb_lock_wait_timeout可以使用SET GLOBALSET SESSION語句在執行時設定。更改GLOBAL設定需要足夠許可權來設定全域性系統變數(請參閱第 7.1.9.1 節,“系統變數許可權”),並影響隨後連線的所有客戶端的操作。任何客戶端都可以更改innodb_lock_wait_timeoutSESSION設定,這僅影響該客戶端。

  • innodb_log_buffer_size

    命令列格式 --innodb-log-buffer-size=#
    系統變數 innodb_log_buffer_size
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 16777216
    最小值 1048576
    最大值 4294967295

    InnoDB用於在磁碟上寫入日誌檔案的緩衝區大小(以位元組為單位)。預設值為 16MB。較大的日誌緩衝區使得大型事務可以在提交之前無需將日誌寫入磁碟。因此,如果您有更新、插入或刪除多行的事務,增大日誌緩衝區可以節省磁碟 I/O。有關相關資訊,請參閱記憶體配置和第 10.5.4 節,“最佳化 InnoDB 重做日誌記錄”。有關一般 I/O 調優建議,請參閱第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

  • innodb_log_checkpoint_fuzzy_now

    命令列格式 --innodb-log-checkpoint-fuzzy-now[={OFF&#124;ON}]
    引入版本 8.0.13
    系統變數 innodb_log_checkpoint_fuzzy_now
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    啟用此除錯選項以強制InnoDB執行模糊檢查點。此選項僅在使用WITH_DEBUG CMake 選項編譯時才可用。

  • innodb_log_checkpoint_now

    命令列格式 --innodb-log-checkpoint-now[={OFF&#124;ON}]
    系統變數 innodb_log_checkpoint_now
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 OFF

    啟用此除錯選項以強制InnoDB寫入檢查點。此選項僅在使用WITH_DEBUG CMake選項編譯時才可用。

  • innodb_log_checksums

    命令列格式 --innodb-log-checksums[={OFF&#124;ON}]
    系統變數 innodb_log_checksums
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 ON

    啟用或禁用重做日誌頁面的校驗和。

    innodb_log_checksums=ON啟用CRC-32C校驗演算法用於重做日誌頁面。當禁用innodb_log_checksums時,重做日誌頁面校驗欄位的內容將被忽略。

    重做日誌頭頁面和重做日誌檢查點頁面上的校驗和永遠不會被禁用。

  • innodb_log_compressed_pages

    命令列格式 --innodb-log-compressed-pages[={OFF&#124;ON}]
    系統變數 innodb_log_compressed_pages
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 ON

    指定是否將重新壓縮的頁面影像寫入重做日誌。當對壓縮資料進行更改時可能會發生重新壓縮。

    innodb_log_compressed_pages預設啟用,以防止在恢復期間使用不同版本的zlib壓縮演算法時可能發生的損壞。如果您確定zlib版本不會更改,可以禁用innodb_log_compressed_pages以減少修改壓縮資料的工作負載的重做日誌生成。

    要衡量啟用或禁用innodb_log_compressed_pages的影響,請比較相同工作負載下兩種設定的重做日誌生成情況。衡量重做日誌生成的選項包括觀察SHOW ENGINE INNODB STATUS輸出中LOG部分中的Log sequence number(LSN),或監視Innodb_os_log_written狀態,檢視寫入重做日誌檔案的位元組數。

    有關相關資訊,請參閱第 17.9.1.6 節,“OLTP 工作負載的壓縮”。

  • innodb_log_file_size

    命令列格式 --innodb-log-file-size=#
    已棄用 8.0.30
    系統變數 innodb_log_file_size
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 50331648
    最小值 4194304
    最大值 512GB / innodb_log_files_in_group
    單位 位元組

    注意

    innodb_log_file_sizeinnodb_log_files_in_group在 MySQL 8.0.30 中已棄用。這些變數已被innodb_redo_log_capacity取代。有關更多資訊,請參閱第 17.6.5 節,“重做日誌”。

    每個日誌組中每個日誌檔案的大小(innodb_log_file_size * innodb_log_files_in_group)。日誌檔案的組合大小(innodb_log_file_size * innodb_log_files_in_group)不能超過略小於 512GB 的最大值。例如,一對 255GB 的日誌檔案接近限制但不超過。預設值為 48MB。

    通常,日誌檔案的組合大小應足夠大,以便伺服器可以平滑處理工作負載活動的峰值和谷值,這通常意味著有足夠的重做日誌空間來處理超過一個小時的寫入活動。數值越大,在緩衝池中需要的檢查點重新整理活動就越少,從而節省磁碟 I/O。更大的日誌檔案也會使崩潰恢復變慢。

    innodb_log_file_size的最小值為 4MB。

    有關更多資訊,請參閱重做日誌配置。有關一般 I/O 調優建議,請參閱第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

    如果啟用了innodb_dedicated_server,並且未明確定義,則innodb_log_file_size的值將自動配置。有關更多資訊,請參閱第 17.8.12 節,“為專用 MySQL 伺服器啟用自動配置”。

  • innodb_log_files_in_group

    命令列格式 --innodb-log-files-in-group=#
    已棄用 8.0.30
    系統變數 innodb_log_files_in_group
    作用域 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 2
    最小值 2
    最大值 100

    注意

    innodb_log_file_sizeinnodb_log_files_in_group在 MySQL 8.0.30 中已棄用。這些變數已被innodb_redo_log_capacity取代。有關更多資訊,請參閱第 17.6.5 節,“重做日誌”。

    日誌檔案在日誌組中的數量。InnoDB以迴圈方式寫入這些檔案。預設(也是推薦的)值為 2。檔案的位置由innodb_log_group_home_dir指定。日誌檔案的組合大小(innodb_log_file_size * innodb_log_files_in_group)最多可達 512GB。

    有關更多資訊,請參閱重做日誌配置。

    如果啟用了innodb_dedicated_server,並且未明確定義,則innodb_log_files_in_group將自動配置。有關更多資訊,請參閱第 17.8.12 節,“為專用 MySQL 伺服器啟用自動配置”。

  • innodb_log_group_home_dir

    命令列格式 --innodb-log-group-home-dir=dir_name
    系統變數 innodb_log_group_home_dir
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 目錄名稱

    InnoDB 重做日誌檔案的目錄路徑。

    有關資訊,請參閱重做日誌配置。

  • innodb_log_spin_cpu_abs_lwm

    命令列格式 --innodb-log-spin-cpu-abs-lwm=#
    系統變數 innodb_log_spin_cpu_abs_lwm
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 80
    最小值 0
    最大值 4294967295

    定義了使用者執行緒在等待重新整理的重做時不再自旋的最小 CPU 使用率。該值表示為 CPU 核心使用率的總和。例如,80 的預設值是單個 CPU 核心的 80%。在具有多核處理器的系統上,值為 150 表示一個 CPU 核心的 100%使用率加上第二個 CPU 核心的 50%使用率。

    有關資訊,請參閱第 10.5.4 節,“最佳化 InnoDB 重做日誌”。

  • innodb_log_spin_cpu_pct_hwm

    命令列格式 --innodb-log-spin-cpu-pct-hwm=#
    系統變數 innodb_log_spin_cpu_pct_hwm
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 50
    最小值 0
    最大值 100

    定義了使用者執行緒在等待重新整理的重做時不再自旋的最大 CPU 使用率。該值表示為所有 CPU 核心的總處理能力的百分比。預設值為 50%。例如,對於具有四個 CPU 核心的伺服器,兩個 CPU 核心的 100%使用率是組合 CPU 處理能力的 50%。

    innodb_log_spin_cpu_pct_hwm變數遵守處理器親和性。例如,如果伺服器有 48 個核心,但mysqld程序只固定在四個 CPU 核心上,則其他 44 個 CPU 核心將被忽略。

    有關資訊,請參閱第 10.5.4 節,“最佳化 InnoDB 重做日誌”。

  • innodb_log_wait_for_flush_spin_hwm

    命令列格式 --innodb-log-wait-for-flush-spin-hwm=#
    系統變數 innodb_log_wait_for_flush_spin_hwm
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 400
    最小值 0
    最大值(64 位平臺) 2**64-1
    最大值(32 位平臺) 2**32-1
    單位 微秒

    定義了超過最大平均日誌重新整理時間的值,使用者執行緒在等待重新整理的重做時不再旋轉。預設值為 400 微秒。

    有關資訊,請參見 Section 10.5.4, “Optimizing InnoDB Redo Logging”。

  • innodb_log_write_ahead_size

    命令列格式 --innodb-log-write-ahead-size=#
    系統變數 innodb_log_write_ahead_size
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 8192
    最小值 512(日誌檔案塊大小)
    最大值 等於 innodb_page_size
    單位 位元組

    定義了重做日誌的預寫塊大小,以位元組為單位。為避免“讀寫”,將innodb_log_write_ahead_size設定為與作業系統或檔案系統快取塊大小相匹配。預設設定為 8192 位元組。當由於重做日誌塊與作業系統或檔案系統的快取塊大小不匹配而導致重做日誌塊未完全快取在作業系統或檔案系統中時,就會發生讀寫。

    innodb_log_write_ahead_size的有效值是InnoDB日誌檔案塊大小(2^n)的倍數。最小值是InnoDB日誌檔案塊大小(512)。當指定最小值時,不會發生預寫。最大值等於innodb_page_size值。如果為innodb_log_write_ahead_size指定的值大於innodb_page_size值,則innodb_log_write_ahead_size設定將被截斷為innodb_page_size值。

    如果innodb_log_write_ahead_size的值相對於作業系統或檔案系統快取塊大小設定得太低,會導致“寫入時讀取”。如果值設定得太高,可能會對fsync效能產生輕微影響,因為多個塊一次被寫入。

    有關更多資訊,請參閱第 10.5.4 節,“最佳化 InnoDB 重做日誌記錄”。

  • innodb_log_writer_threads

    命令列格式 --innodb-log-writer-threads[={OFF&#124;ON}]
    引入版本 8.0.22
    系統變數 innodb_log_writer_threads
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 ON

    啟用專用日誌寫入執行緒,用於將重做日誌記錄從日誌緩衝區寫入系統緩衝區並將系統緩衝區重新整理到重做日誌檔案。專用日誌寫入執行緒可以提高高併發系統的效能,但對於低併發系統,禁用專用日誌寫入執行緒可以提供更好的效能。

    有關更多資訊,請參閱第 10.5.4 節,“最佳化 InnoDB 重做日誌記錄”。

  • innodb_lru_scan_depth

    命令列格式 --innodb-lru-scan-depth=#
    系統變數 innodb_lru_scan_depth
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 1024
    最小值 100
    最大值(64 位平臺) 2**64-1
    最大值(32 位平臺) 2**32-1

    影響InnoDB緩衝池的重新整理操作演算法和啟發式的引數。主要關注效能專家調整 I/O 密集型工作負載。它指定了每個緩衝池例項,頁面清理執行緒在 LRU 頁面列表中掃描多深以查詢要重新整理的髒頁。這是一個每秒執行一次的後臺操作。

    一般來說,比預設值小的設定對大多數工作負載都適用。如果值遠高於必要值,可能會影響效能。只有在典型工作負載下有多餘 I/O 容量時才考慮增加該值。相反,如果寫入密集型工作負載使 I/O 容量飽和,降低該值,尤其是在有大緩衝池的情況下。

    在調整innodb_lru_scan_depth時,從一個較低值開始,並將設定向上配置,目標是很少看到零空閒頁。此外,考慮在更改緩衝池例項數時調整innodb_lru_scan_depth,因為innodb_lru_scan_depth * innodb_buffer_pool_instances定義了頁面清理執行緒每秒執行的工作量。

    有關相關資訊,請參見第 17.8.3.5 節,“配置緩衝池重新整理”。有關一般 I/O 調優建議,請參見第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

  • innodb_max_dirty_pages_pct

    命令列格式 --innodb-max-dirty-pages-pct=#
    系統變數 innodb_max_dirty_pages_pct
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 數值
    預設值 90
    最小值 0
    最大值 99.999

    InnoDB嘗試從緩衝池中重新整理資料,以使髒頁的百分比不超過此值。

    innodb_max_dirty_pages_pct 設定了重新整理活動的目標,不影響重新整理速率。有關管理重新整理速率的資訊,請參見第 17.8.3.5 節,“配置緩衝池重新整理”。

    有關相關資訊,請參見第 17.8.3.5 節,“配置緩衝池重新整理”。有關一般 I/O 調優建議,請參見第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

  • innodb_max_dirty_pages_pct_lwm

    命令列格式 --innodb-max-dirty-pages-pct-lwm=#
    系統變數 innodb_max_dirty_pages_pct_lwm
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 數值
    預設值 10
    最小值 0
    最大值 99.999

    定義了表示髒頁百分比的低水位,當預刷寫啟用以控制髒頁比率時。值為 0 會完全禁用預刷寫行為。配置的值應始終低於innodb_max_dirty_pages_pct的值。更多資訊,請參見第 17.8.3.5 節,“配置緩衝池重新整理”。

  • innodb_max_purge_lag

    命令列格式 --innodb-max-purge-lag=#
    系統變數 innodb_max_purge_lag
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 4294967295

    定義了期望的最大清除延遲。如果超過此值,將對INSERTUPDATEDELETE操作施加延遲,以便清除趕上。預設值為 0,這意味著沒有最大清除延遲和沒有延遲。

    更多資訊,請參見第 17.8.9 節,“清除配置”。

  • innodb_max_purge_lag_delay

    命令列格式 --innodb-max-purge-lag-delay=#
    系統變數 innodb_max_purge_lag_delay
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 10000000
    單位 微秒

    指定了當超過innodb_max_purge_lag閾值時施加的延遲的最大延遲時間(以微秒為單位)。指定的innodb_max_purge_lag_delay值是由innodb_max_purge_lag公式計算的延遲期限的上限。

    更多資訊,請參見第 17.8.9 節,“清除配置”。

  • innodb_max_undo_log_size

    命令列格式 --innodb-max-undo-log-size=#
    系統變數 innodb_max_undo_log_size
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 1073741824
    最小值 10485760
    最大值 2**64-1
    單位 位元組

    定義回滾表空間的閾值大小。如果回滾表空間超過閾值,則在啟用innodb_undo_log_truncate時可以標記為截斷。預設值為 1073741824 位元組(1024 MiB)。

    更多資訊,請參見截斷回滾表空間。

  • innodb_merge_threshold_set_all_debug

    命令列格式 --innodb-merge-threshold-set-all-debug=#
    系統變數 innodb_merge_threshold_set_all_debug
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 50
    最小值 1
    最大值 50

    定義索引頁的頁面滿百分比值,該值覆蓋當前字典快取中當前所有索引的MERGE_THRESHOLD設定。僅當使用WITH_DEBUG CMake選項編譯除錯支援時才可用此選項。有關相關資訊,請參見第 17.8.11 節,“配置索引頁合併閾值”。

  • innodb_monitor_disable

    命令列格式 --innodb-monitor-disable={counter&#124;module&#124;pattern&#124;all}
    系統變數 innodb_monitor_disable
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 字串

    此變數充當開關,禁用InnoDB度量計數器。可以使用資訊模式INNODB_METRICS表查詢計數器資料。有關使用資訊,請參見第 17.15.6 節,“InnoDB INFORMATION_SCHEMA 度量表”。

    innodb_monitor_disable='latch' 禁用 SHOW ENGINE INNODB MUTEX 的統計資訊收集。更多資訊,請參見 第 15.7.7.15 節,“SHOW ENGINE 語句”。

  • innodb_monitor_enable

    命令列格式 --innodb-monitor-enable={counter&#124;module&#124;pattern&#124;all}
    系統變數 innodb_monitor_enable
    作用域 全域性
    動態
    SET_VAR 提示適用
    型別 字串

    該變數充當開關,啟用 InnoDB 的 度量計數器。可以使用資訊模式 INNODB_METRICS 表查詢計數器資料。有關使用資訊,請參見 第 17.15.6 節,“InnoDB INFORMATION_SCHEMA Metrics Table”。

    innodb_monitor_enable='latch' 啟用統計資訊收集,用於 SHOW ENGINE INNODB MUTEX。更多資訊,請參見 第 15.7.7.15 節,“SHOW ENGINE 語句”。

  • innodb_monitor_reset

    命令列格式 --innodb-monitor-reset={counter&#124;module&#124;pattern&#124;all}
    系統變數 innodb_monitor_reset
    作用域 ��局
    動態
    SET_VAR 提示適用
    型別 列舉
    預設值 NULL
    有效值 counter``module``pattern``all

    該變數充當開關,將 InnoDB 的 度量計數器 的計數值重置為零。可以使用資訊模式 INNODB_METRICS 表查詢計數器資料。有關使用資訊,請參見 第 17.15.6 節,“InnoDB INFORMATION_SCHEMA Metrics Table”。

    innodb_monitor_reset='latch' 重置由 SHOW ENGINE INNODB MUTEX 報告的統計資訊。更多資訊,請參見 第 15.7.7.15 節,“SHOW ENGINE 語句”。

  • innodb_monitor_reset_all

    命令列格式 --innodb-monitor-reset-all={counter&#124;module&#124;pattern&#124;all}
    系統變數 innodb_monitor_reset_all
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 列舉
    預設值 NULL
    有效值 counter``module``pattern``all

    此變數充當開關,重置所有InnoDB度量計數器的值(最小值、最大值等)。可以使用資訊模式INNODB_METRICS表查詢計數器資料。有關使用資訊,請參見第 17.15.6 節,“InnoDB INFORMATION_SCHEMA 度量表”。

  • innodb_numa_interleave

    命令列格式 --innodb-numa-interleave[={OFF&#124;ON}]
    系統變數 innodb_numa_interleave
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林
    預設值 OFF

    啟用 NUMA 交錯記憶體策略以分配InnoDB緩衝池。當啟用innodb_numa_interleave時,NUMA 記憶體策略設定為MPOL_INTERLEAVE用於mysqld程序。分配InnoDB緩衝池後,NUMA 記憶體策略將恢復為MPOL_DEFAULT。要使innodb_numa_interleave選項可用,必須在啟用 NUMA 的 Linux 系統上編譯 MySQL。

    CMake根據當前平臺是否支援NUMA,設定預設WITH_NUMA值。有關更多資訊,請參見第 2.8.7 節,“MySQL 源配置選項”。

  • innodb_old_blocks_pct

    命令列格式 --innodb-old-blocks-pct=#
    系統變數 innodb_old_blocks_pct
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 37
    最小值 5
    最大值 95

    指定用於舊塊 sublist 的InnoDB緩衝池的近似百分比。值的範圍為 5 到 95。預設值為 37(即池的 3/8)。通常與innodb_old_blocks_time結合使用。

    更多資訊,請參閱第 17.8.3.3 節,“使緩衝池具有掃描抵抗力”。有關緩衝池管理、LRU 演算法和驅逐策略的資訊,請參閱第 17.5.1 節,“緩衝池”。

  • innodb_old_blocks_time

    命令列格式 --innodb-old-blocks-time=#
    系統變數 innodb_old_blocks_time
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 1000
    最小值 0
    最大值 2**32-1
    單位 毫秒

    非零值可防止緩衝池被僅在短時間內引用的資料填滿,例如在全表掃描期間。增加此值可提供更多保護,防止全表掃描干擾緩衝池中快取的資料。

    指定一個塊插入到舊 sublist 後,在第一次訪問之後必須在那裡停留多長時間(以毫秒為單位),然後才能移動到新的子列表。如果值為 0,則插入到舊子列表的塊在第一次訪問時立即移動到新子列表,無論插入後多久發生訪問。如果值大於 0,則塊保留在舊子列表中,直到第一次訪問後至少經過那麼多毫秒。例如,值為 1000 會導致塊在第一次訪問後在舊子列表中停留 1 秒,然後才能移動到新子列表。

    預設值為 1000。

    這個變數通常與innodb_old_blocks_pct結合使用。更多資訊,請參閱第 17.8.3.3 節,“使緩衝池具有掃描抵抗力”。有關緩衝池管理、LRU 演算法和驅逐策略的資訊,請參閱第 17.5.1 節,“緩衝池”。

  • innodb_online_alter_log_max_size

    命令列格式 --innodb-online-alter-log-max-size=#
    系統變數 innodb_online_alter_log_max_size
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 134217728
    最小值 65536
    最大值 2**64-1
    單位 位元組

    指定InnoDB表的線上 DDL 操作期間使用的臨時日誌檔案大小上限(以位元組為單位)。每個正在建立的索引或正在更改的表都有一個這樣的日誌檔案。此日誌檔案儲存在 DDL 操作期間插入、更新或刪除的表中的資料。臨時日誌檔案在需要時透過innodb_sort_buffer_size的值擴充套件,最多擴充套件到innodb_online_alter_log_max_size指定的最大值。如果臨時日誌檔案超過上限大小,ALTER TABLE操作將失敗,並且所有未提交的併發 DML 操作都將被回滾。因此,此選項的較大值允許在線上 DDL 操作期間發生更多的 DML 操作,但也會延長 DDL 操作結束時表被鎖定以應用日誌中資料的時間。

  • innodb_open_files

    命令列格式 --innodb-open-files=#
    系統變數 innodb_open_files
    範圍 全域性
    動態 (≥ 8.0.28)
    動態 (≤ 8.0.27)
    SET_VAR 提示適用
    型別 整數
    預設值 -1(表示自動調整大小;不要分配此字面值)
    最小值 10
    最大值 2147483647

    指定InnoDB在同一時間內可以開啟的檔案的最大數量。最小值為 10。如果禁用了innodb_file_per_table,預設值為 300;否則,預設值為 300 或table_open_cache設定中的較高值。

    截至 MySQL 8.0.28,可以使用SELECT innodb_set_open_files_limit(*N*)語句在執行時設定innodb_open_files限制,其中N是所需的innodb_open_files限制;例如:

    mysql> SELECT innodb_set_open_files_limit(1000);
    

    該語句執行一個儲存過程,設定新的限制。如果過程成功,則返回新設定限制的值;否則,返回失敗訊息。

    不允許使用SET語句設定innodb_open_files。要在執行時設定innodb_open_files,請使用上述描述的SELECT innodb_set_open_files_limit(*N*)語句。

    設定innodb_open_files=default不受支援。只允許整數值。

    從 MySQL 8.0.28 開始,為防止非 LRU 管理檔案佔用整個innodb_open_files限制,非 LRU 管理檔案限制為innodb_open_files限制的 90%,這樣就為 LRU 管理檔案保留了innodb_open_files限制的 10%。

    從 MySQL 8.0.24 到 MySQL 8.0.27,臨時表空間檔案不計入innodb_open_files限制。

  • innodb_optimize_fulltext_only

    命令列格式 --innodb-optimize-fulltext-only[={OFF&#124;ON}]
    系統變數 innodb_optimize_fulltext_only
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    改變了OPTIMIZE TABLEInnoDB表上的操作方式。旨在在具有FULLTEXT索引的InnoDB表的維護操作期間暫時啟用。

    預設情況下,OPTIMIZE TABLE 重新組織表的聚簇索引中的資料。當啟用此選項時,OPTIMIZE TABLE 將跳過表資料的重新組織,而是處理InnoDB FULLTEXT索引中新新增、刪除和更新的標記資料。更多資訊,請參見最佳化 InnoDB 全文索引。

  • innodb_page_cleaners

    命令列格式 --innodb-page-cleaners=#
    系統變數 innodb_page_cleaners
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 4
    最小值 1
    最大值 64

    從緩衝池例項重新整理髒頁的頁面清理執行緒數量。頁面清理執行緒執行重新整理列表和 LRU 重新整理。當存在多個頁面清理執行緒時,每個緩衝池例項的緩衝池重新整理任務將分派給空閒的頁面清理執行緒。innodb_page_cleaners 的預設值為 4。如果頁面清理執行緒的數量超過緩衝池例項的數量,則 innodb_page_cleaners 會自動設定為與 innodb_buffer_pool_instances 相同的值。

    如果在將髒頁從緩衝池例項重新整理到資料檔案時,您的工作負載受寫入 IO 限制,並且系統硬體有可用容量,則增加頁面清理執行緒的數量可能有助於提高寫入 IO 吞吐量。

    多執行緒頁面清理支援擴充套件到關閉和恢復階段。

    setpriority() 系統呼叫在支援的 Linux 平臺上使用,在 mysqld 執行使用者被授權為幫助頁面重新整理跟上當前工作負載而給 page_cleaner 執行緒優先順序高於其他 MySQL 和 InnoDB 執行緒的情況下。setpriority() 支援由此 InnoDB 啟動訊息指示:

    [Note] InnoDB: If the mysqld execution user is authorized, page cleaner
    thread priority can be changed. See the man page of setpriority().
    

    對於不由 systemd 管理伺服器啟動和關閉的系統,可以在 /etc/security/limits.conf 中配置 mysqld 執行使用者授權。例如,如果 mysqldmysql 使用者下執行,則可以透過將以下行新增到 /etc/security/limits.conf 來授權 mysql 使用者:

    mysql              hard    nice       -20
    mysql              soft    nice       -20
    

    對於由 systemd 管理的系統,可以透過在本地化 systemd 配置檔案中指定 LimitNICE=-20 來實現相同的效果。例如,在 /etc/systemd/system/mysqld.service.d/override.conf 中建立一個名為 override.conf 的檔案,並新增以下條目:

    [Service]
    LimitNICE=-20
    

    建立或更改 override.conf 後,重新載入 systemd 配置,然後告訴 systemd 重新啟動 MySQL 服務:

    systemctl daemon-reload
    systemctl restart mysqld  # RPM platforms
    systemctl restart mysql   # Debian platforms
    

    有關使用本地化 systemd 配置檔案的更多資訊,請參見為 MySQL 配置 systemd。

    授權 mysqld 執行使用者後,使用 cat 命令驗證 mysqld 程序配置的 Nice 限制:

    $> cat /proc/*mysqld_pid*/limits | grep nice
    Max nice priority         18446744073709551596 18446744073709551596
    
  • innodb_page_size

    命令列格式 --innodb-page-size=#
    系統變數 innodb_page_size
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 列舉
    預設值 16384
    有效值 4096``8192``16384``32768``65536

    指定InnoDB表空間的頁面大小。值可以以位元組或千位元組為單位指定。例如,可以將 16KB 頁面大小值指定為 16384、16KB 或 16k。

    innodb_page_size只能在初始化 MySQL 例項之前配置,之後不能更改。如果未指定任何值,則例項將使用預設頁面大小進行初始化。請參閱第 17.8.1 節,“InnoDB 啟動配置”。

    對於 32KB 和 64KB 頁面大小,最大行長度約為 16000 位元組。當innodb_page_size設定為 32KB 或 64KB 時,不支援ROW_FORMAT=COMPRESSED。對於innodb_page_size=32KB,擴充套件大小為 2MB。對於innodb_page_size=64KB,擴充套件大小為 4MB。在使用 32KB 或 64KB 頁面大小時,innodb_log_buffer_size應至少設定為 16M(預設值)。

    預設的 16KB 頁面大小或更大適用於各種工作負載,特別是涉及表掃描和涉及大量更新的 DML 操作的查詢。較小的頁面大小可能對涉及許多小寫入的 OLTP 工作負載更有效,當單個頁面包含許多行時,爭用可能是一個問題。較小的頁面在通常使用小塊大小的 SSD 儲存裝置上也可能更有效。保持InnoDB頁面大小接近儲存裝置塊大小可以最大程度地減少被重寫到磁碟的未更改資料量。

    第一個系統表空間資料檔案(ibdata1)的最小檔案大小取決於innodb_page_size值。有關更多資訊,請參閱innodb_data_file_path選項描述。

    使用特定InnoDB頁面大小的 MySQL 例項不能使用來自使用不同頁面大小的例項的資料檔案或日誌檔案。

    有關一般 I/O 調優建議,請參閱第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

  • innodb_parallel_read_threads

    命令列格式 --innodb-parallel-read-threads=#
    引入 8.0.14
    系統變數 innodb_parallel_read_threads
    作用範圍 會話
    動態
    SET_VAR Hint Applies
    型別 整數
    預設值 4
    最小值 1
    最大值 256

    定義可用於並行叢集索引讀取的執行緒數。截至 MySQL 8.0.17 版本,支援對分割槽進行並行掃描。並行讀取執行緒可以提高CHECK TABLE效能。InnoDBCHECK TABLE操作期間兩次讀取聚簇索引。第二次讀取可以並行執行。此功能不適用於二級索引掃描。必須將innodb_parallel_read_threads會話變數設定為大於 1 的值,才能進行並行叢集索引讀取。執行並行叢集索引讀取的實際執行緒數由innodb_parallel_read_threads設定或要掃描的索引子樹數量決定,取兩者中較小的值。掃描期間讀取到緩衝池的頁面保持在緩衝池 LRU 列表的尾部,以便在需要空閒緩衝池頁面時可以快速丟棄它們。

    截至 MySQL 8.0.17 版本,最大並行讀取執行緒數(256)是所有客戶端連線的匯流排程數。如果達到執行緒限制,連線將回退到使用單個執行緒。

  • innodb_print_all_deadlocks

    命令列格式 --innodb-print-all-deadlocks[={OFF&#124;ON}]
    系統變數 innodb_print_all_deadlocks
    作用範圍 全域性
    動態
    SET_VAR Hint Applies
    型別 布林值
    預設值 OFF

    當啟用此選項時,InnoDB 使用者事務中所有 死鎖 的資訊都記錄在 mysqld 錯誤日誌 中。否則,您只會看到關於最後一個死鎖的資訊,使用 SHOW ENGINE INNODB STATUS 命令。偶爾的 InnoDB 死鎖並不一定是問題,因為 InnoDB 立即檢測到條件並自動回滾其中一個事務。如果應用程式沒有適當的錯誤處理邏輯來檢測回滾並重試其操作,您可能會使用此選項來排除死鎖發生的原因。大量的死鎖可能表明需要重新構造為多個表發出 DML 或 SELECT ... FOR UPDATE 語句的事務,以便每個事務以相同順序訪問表,從而避免死鎖條件。

    有關更多資訊,請參見 第 17.7.5 節,“InnoDB 中的死鎖”。

  • innodb_print_ddl_logs

    命令列格式 --innodb-print-ddl-logs[={OFF&#124;ON}]
    系統變數 innodb_print_ddl_logs
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    啟用此選項會導致 MySQL 將 DDL 日誌寫入 stderr。更多資訊,請參見 檢視 DDL 日誌。

  • innodb_purge_batch_size

    命令列格式 --innodb-purge-batch-size=#
    系統變數 innodb_purge_batch_size
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 300
    最小值 1
    最大值 5000

    定義了一批從 歷史列表 中解析和處理的撤銷日誌頁數。在多執行緒清除配置中,協調員清除執行緒將 innodb_purge_batch_size 除以 innodb_purge_threads,並將該數量的頁分配給每個清除執行緒。innodb_purge_batch_size 變數還定義了清除在透過撤銷日誌的每 128 次迭代後釋放的撤銷日誌頁數。

    innodb_purge_batch_size 選項旨在與 innodb_purge_threads 設定結合進行高階效能調優。大多數使用者不需要更改 innodb_purge_batch_size 的預設值。

    有關更多資訊,請參見 第 17.8.9 節,“清除配置”。

  • innodb_purge_threads

    命令列格式 --innodb-purge-threads=#
    系統變數 innodb_purge_threads
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 4
    最小值 1
    最大值 32

    專用於 InnoDB 清除 操作的後臺執行緒數。增加該值會建立額外的清除執行緒,可以提高在執行多個表的 DML 操作的系統上的效率。

    有關更多資訊,請參見 第 17.8.9 節,“清除配置”。

  • innodb_purge_rseg_truncate_frequency

    命令列格式 --innodb-purge-rseg-truncate-frequency=#
    系統變數 innodb_purge_rseg_truncate_frequency
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 128
    最小值 1
    最大值 128

    定義清除系統釋放回滾段的頻率,以呼叫清除的次數來衡量。在回滾段被釋放之前,無法截斷撤消表空間。通常,清除系統每呼叫 128 次就會釋放一次回滾段。預設值為 128。減少此值會增加清除執行緒釋放回滾段的頻率。

    innodb_purge_rseg_truncate_frequency 旨在與 innodb_undo_log_truncate 一起使用。有關更多資訊,請參見 截斷撤消表空間。

  • innodb_random_read_ahead

    命令列格式 --innodb-random-read-ahead[={OFF&#124;ON}]
    系統變數 innodb_random_read_ahead
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 關閉

    啟用隨機預讀技術,最佳化InnoDB I/O。

    有關不同型別預讀請求的效能考慮的詳細資訊,請參見第 17.8.3.4 節,“配置 InnoDB 緩衝池預取(預讀)”。有關一般 I/O 調優建議,請參見第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

  • innodb_read_ahead_threshold

    命令列格式 --innodb-read-ahead-threshold=#
    系統變數 innodb_read_ahead_threshold
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 56
    最小值 0
    最大值 64

    控制InnoDB用於預取頁面到緩衝池的線性預讀的靈敏度。如果InnoDB按順序從一個 extent(64 頁)中至少讀取innodb_read_ahead_threshold頁,它將啟動對整個後續 extent 的非同步讀取。允許的值範圍是 0 到 64。值為 0 表示禁用預讀。對於預設值 56,InnoDB必須按順序從一個 extent 中至少讀取 56 頁,才能啟動對後續 extent 的非同步讀取。

    瞭解透過預讀機制讀取了多少頁面,以及這些頁面中有多少被從緩衝池中驅逐而從未被訪問,對於微調innodb_read_ahead_threshold設定可能是有用的。SHOW ENGINE INNODB STATUS輸出顯示了來自Innodb_buffer_pool_read_aheadInnodb_buffer_pool_read_ahead_evicted全域性狀態變數的計數器資訊,這些變數報告了透過預讀請求帶入緩衝池的頁面數,以及這些頁面從未被訪問而從緩衝池中驅逐的頁面數。這些狀態變數報告自上次伺服器重啟以來的全域性值。

    SHOW ENGINE INNODB STATUS還顯示了預讀頁面的讀取速率以及這些頁面被驅逐而沒有被訪問的速率。每秒平均值基於自上次呼叫SHOW ENGINE INNODB STATUS以來收集的統計資料,並顯示在SHOW ENGINE INNODB STATUS輸出的BUFFER POOL AND MEMORY部分。

    更多資訊,請參見第 17.8.3.4 節,“配置 InnoDB 緩衝池預取(預讀)”。有關一般 I/O 調優建議,請參見第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

  • innodb_read_io_threads

    命令列格式 --innodb-read-io-threads=#
    系統變數 innodb_read_io_threads
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 4
    最小值 1
    最大值 64

    用於InnoDB讀操作的 I/O 執行緒數。其寫執行緒的對應項是innodb_write_io_threads。有關更多資訊,請參見第 17.8.5 節,“配置後臺 InnoDB I/O 執行緒數”。有關一般 I/O 調優建議,請參見第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

    注意

    在 Linux 系統上,使用預設設定的innodb_read_io_threadsinnodb_write_io_threads和 Linux 的aio-max-nr設定執行多個 MySQL 伺服器(通常超過 12 個)可能超出系統限制。理想情況下,增加aio-max-nr設定;作為解決方法,您可以減少一個或兩個 MySQL 變數的設定。

  • innodb_read_only

    命令列格式 --innodb-read-only[={OFF&#124;ON}]
    系統變數 innodb_read_only
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 OFF

    以只讀模式啟動InnoDB。用於在只讀媒體上分發資料庫應用程式或資料集。也可用於資料倉儲,在多個例項之間共享相同的資料目錄。有關更多資訊,請參見第 17.8.2 節,“配置 InnoDB 進行只讀操作”。

    以前,啟用innodb_read_only系統變數僅阻止了InnoDB儲存引擎的表的建立和刪除。從 MySQL 8.0 開始,啟用innodb_read_only將阻止所有儲存引擎的這些操作。任何儲存引擎的表建立和刪除操作都會修改mysql系統資料庫中的資料字典表,但這些表使用InnoDB儲存引擎,在啟用innodb_read_only時無法修改。同樣的原則也適用於其他需要修改資料字典表的表操作。例如:

    • 如果啟用了innodb_read_only系統變數,ANALYZE TABLE可能會失敗,因為它無法更新使用InnoDB的資料字典中的統計表。對於更新鍵分佈的ANALYZE TABLE操作,即使操作更新了表本身(例如,如果它是一個MyISAM表),也可能會發生失敗。要獲取更新後的分佈統計資訊,請設定information_schema_stats_expiry=0

    • ALTER TABLE *tbl_name* ENGINE=*engine_name* 失敗,因為它更新了儲存引擎的指定,這些資訊儲存在資料字典中。

    此外,MySQL 8.0 中 mysql 系統資料庫中的其他表使用 InnoDB 儲存引擎。將這些表設定為只讀會導致修改它們的操作受到限制。例如:

    • 帳戶管理語句,如 CREATE USERGRANT 失敗,因為授權表使用了 InnoDB

    • INSTALL PLUGINUNINSTALL PLUGIN 外掛管理語句失敗,因為 mysql.plugin 系統表使用了 InnoDB

    • CREATE FUNCTIONDROP FUNCTION 可載入函式管理語句失敗,因為 mysql.func 系統表使用了 InnoDB

  • innodb_redo_log_archive_dirs

    命令列格式 --innodb-redo-log-archive-dirs
    引入 8.0.17
    系統變數 innodb_redo_log_archive_dirs
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 字串
    預設值 NULL

    定義標記目錄,可以在其中建立重做日誌歸檔檔案。您可以在分號分隔的列表中定義多個標記目錄。例如:

    innodb_redo_log_archive_dirs='label1:/backups1;label2:/backups2'
    

    標籤可以是任意字元的字串,但不允許使用冒號(:)。空標籤也是允許的,但在這種情況下仍然需要冒號(😃。

    必須指定路徑,並且目錄必須存在。路徑可以包含冒號(':'),但不允許使用分號(;)。

  • innodb_redo_log_capacity

    命令列格式 --innodb-redo-log-capacity=#
    引入 8.0.30
    系統變數 innodb_redo_log_capacity
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 104857600
    最小值 8388608
    最大值 (≥ 8.0.34) 549755813888
    最大值 (≥ 8.0.30, ≤ 8.0.33) 137438953472
    單位 位元組

    定義重做日誌檔案佔用的磁碟空間量。

    此變數取代了innodb_log_files_in_groupinnodb_log_file_size變數。當定義了innodb_redo_log_capacity設定時,innodb_log_files_in_groupinnodb_log_file_size設定將被忽略;否則,這些設定將用於計算innodb_redo_log_capacity設定(innodb_log_files_in_group * innodb_log_file_size = innodb_redo_log_capacity)。如果沒有設定這些變數中的任何一個,重做日誌容量將設定為innodb_redo_log_capacity的預設值。

    有關更多資訊,請參見第 17.6.5 節,“重做日誌”。

  • innodb_redo_log_encrypt

    命令列格式 --innodb-redo-log-encrypt[={OFF&#124;ON}]
    系統變數 innodb_redo_log_encrypt
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    控制使用InnoDB資料靜態加密功能加密的表的重做日誌資料的加密。預設情況下,重做日誌資料的加密是禁用的。有關更多資訊,請參見重做日誌加密。

  • innodb_replication_delay

    命令列格式 --innodb-replication-delay=#
    系統變數 innodb_replication_delay
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 4294967295
    單位 毫秒

    如果達到innodb_thread_concurrency時,在副本伺服器上的複製執行緒延遲���以毫秒為單位)。

  • innodb_rollback_on_timeout

    命令列格式 --innodb-rollback-on-timeout[={OFF&#124;ON}]
    系統變數 innodb_rollback_on_timeout
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    InnoDB 預設僅在事務超時時回滾最後一個語句。如果指定了 --innodb-rollback-on-timeout,事務超時會導致 InnoDB 中止並回滾整個事務。

    更多資訊,請參見 第 17.21.5 節,“InnoDB 錯誤處理”。

  • innodb_rollback_segments

    命令列格式 --innodb-rollback-segments=#
    系統變數 innodb_rollback_segments
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 128
    最小值 1
    最大值 128

    innodb_rollback_segments 定義了分配給每個撤消表空間和生成撤消記錄的全域性臨時表空間的撤消段數量。每個撤消段支援的事務數量取決於 InnoDB 頁大小和分配給每個事務的撤消日誌數量。更多資訊,請參見 第 17.6.6 節,“撤消日誌”。

    相關資訊,請參見 第 17.3 節,“InnoDB 多版本”。有關撤消表空間的資訊,請參見 第 17.6.3.4 節,“撤消表空間”。

  • innodb_saved_page_number_debug

    命令列格式 --innodb-saved-page-number-debug=#
    系統變數 innodb_saved_page_number_debug
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 2**32-1

    儲存一個頁面編號。設定 innodb_fil_make_page_dirty_debug 選項會使由 innodb_saved_page_number_debug 定義的頁面變髒。只有在使用 WITH_DEBUG CMake 選項編譯支援除錯時,才能使用 innodb_saved_page_number_debug 選項。

  • innodb_segment_reserve_factor

    命令列格式 --innodb-segment-reserve-factor=#
    引入版本 8.0.26
    系統變數 innodb_segment_reserve_factor
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 數值
    預設值 12.5
    最小值 0.03
    最大值 40

    定義表空間檔案段頁面保留為空頁面的百分比。該設定適用於每表檔案和通用表空間。innodb_segment_reserve_factor預設設定為 12.5%,這與之前的 MySQL 版本中保留的頁面百分比相同。

    更多資訊,請參閱配置保留檔案段頁面的百分比。

  • innodb_sort_buffer_size

    命令列格式 --innodb-sort-buffer-size=#
    系統變數 innodb_sort_buffer_size
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 1048576
    最小值 65536
    最大值 67108864
    單位 位元組

    此變數定義:

    • 用於建立或重建二級索引的線上 DDL 操作的排序緩衝區大小。然而,從 MySQL 8.0.27 開始,這一責任被innodb_ddl_buffer_size變數所取代。

    • 在線上 DDL 操作期間記錄併發 DML 時,臨時日誌檔案擴充套件的量,以及臨時日誌檔案讀緩衝區和寫緩衝區的大小。

    有關更多資訊,請參閱第 17.12.3 節,“線上 DDL 空間要求”。

  • innodb_spin_wait_delay

    命令列格式 --innodb-spin-wait-delay=#
    系統變數 innodb_spin_wait_delay
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 6
    最小值 0
    最大值(64 位平臺,≤ 8.0.13) 2**64-1
    最大值(32 位平臺,≤ 8.0.13) 2**32-1
    最大值(≥ 8.0.14) 1000

    自旋鎖之間輪詢的最大延遲。此機制的底層實現因硬體和作業系統的組合而異,因此延遲不對應固定的時間間隔。

    可與innodb_spin_wait_pause_multiplier變數結合使用,以更好地控制自旋鎖輪詢延遲的持續時間。

    更多資訊,請參閱��17.8.8 節,“配置自旋鎖輪詢”。

  • innodb_spin_wait_pause_multiplier

    命令列格式 --innodb-spin-wait-pause-multiplier=#
    引入版本 8.0.16
    系統變數 innodb_spin_wait_pause_multiplier
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 50
    最小值 0
    最大值 100

    定義一個乘數值,用於確定執行緒在等待獲取互斥鎖或讀寫鎖時發生自旋等待迴圈中的 PAUSE 指令數量。

    更多資訊,請參閱第 17.8.8 節,“配置自旋鎖輪詢”。

  • innodb_stats_auto_recalc

    命令列格式 --innodb-stats-auto-recalc[={OFF&#124;ON}]
    系統變數 innodb_stats_auto_recalc
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 ON

    導致InnoDB在表中的資料發生重大更改後自動重新計算永續性統計資訊。閾值為表中行數的 10%。此設定適用於啟用innodb_stats_persistent選項時建立的表。還可以透過在CREATE TABLEALTER TABLE語句中指定STATS_PERSISTENT=1來配置自動統計資訊重新計算。用於生成統計資訊的取樣資料量由innodb_stats_persistent_sample_pages變數控制。

    更多資訊,請參閱第 17.8.10.1 節,“配置永續性最佳化器統計引數”。

  • innodb_stats_include_delete_marked

    命令列格式 --innodb-stats-include-delete-marked[={OFF&#124;ON}]
    系統變數 innodb_stats_include_delete_marked
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 OFF

    預設情況下,InnoDB在計算統計資訊時讀取未提交的資料。在未提交事務刪除表中的行的情況下,InnoDB在計算行估計和索引統計資訊時排除了被標記為刪除的記錄,這可能導致其他使用事務隔離級別為READ UNCOMMITTED併發操作表的事務執行計劃不佳。為避免這種情況,可以啟用innodb_stats_include_delete_marked以確保InnoDB在計算持久最佳化器統計資訊時包括被標記為刪除的記錄。

    當啟用innodb_stats_include_delete_marked時,ANALYZE TABLE在重新計算統計資訊時考慮了刪除標記記錄。

    innodb_stats_include_delete_marked是一個影響所有InnoDB表的全域性設定。僅適用於持久最佳化器統計資訊。

    有關相關資訊,請參閱第 17.8.10.1 節,“配置持久最佳化器統計引數”。

  • innodb_stats_method

    命令列格式 --innodb-stats-method=value
    系統變數 innodb_stats_method
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 列舉
    預設值 nulls_equal
    有效取值 nulls_equal``nulls_unequal``nulls_ignored

    伺服器在收集關於InnoDB表索引值分佈的統計資訊時如何處理NULL值。允許的取值為nulls_equalnulls_unequalnulls_ignored。對於nulls_equal,所有NULL索引值被視為相等,並形成一個大小等於NULL值數量的值組。對於nulls_unequalNULL值被視為不相等,每個NULL形成一個大小為 1 的獨立值組。對於nulls_ignoredNULL值被忽略。

    生成表統計資訊的方法會影響最佳化器選擇查詢執行時使用的索引,詳見第 10.3.8 節,“InnoDB 和 MyISAM 索引統計資訊收集”。

  • innodb_stats_on_metadata

    命令列格式 --innodb-stats-on-metadata[={OFF&#124;ON}]
    系統變數 innodb_stats_on_metadata
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    此選項僅在最佳化器統計資訊配置為非永續性時適用。當禁用innodb_stats_persistent或使用STATS_PERSISTENT=0建立或更改單個表時,最佳化器統計資訊不會持久儲存到磁碟。有關更多資訊,請參閱第 17.8.10.2 節,“配置非永續性最佳化器統計引數”。

    當啟用innodb_stats_on_metadata時,InnoDB在後設資料語句(如SHOW TABLE STATUS)或訪問資訊模式TABLESSTATISTICS表時更新非永續性統計資訊。(這些更新類似於ANALYZE TABLE的操作。)禁用時,InnoDB在這些操作期間不會更新統計資訊。保持禁用設定可以提高對具有大量表或索引的模式的訪問速度。它還可以改善涉及InnoDB表的查詢的執行計劃的穩定性。

    要更改設定,請發出語句SET GLOBAL innodb_stats_on_metadata=*mode*,其中*mode*ONOFF(或10)。更改設定需要足夠設定全域性系統變數的許可權(請參閱第 7.1.9.1 節,“系統變數許可權”),並立即影響所有連線的操作。

  • innodb_stats_persistent

    命令列格式 --innodb-stats-persistent[={OFF&#124;ON}]
    系統變數 innodb_stats_persistent
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林
    預設值 ON

    指定InnoDB索引統計資訊是否持久化到磁碟。否則,統計資訊可能會經常重新計算,這可能導致查詢執行計劃的變化。此設定在建立表時與每個表一起儲存。您可以在建立表之前在全域性級別設定innodb_stats_persistent,或者使用CREATE TABLEALTER TABLE語句的STATS_PERSISTENT子句覆蓋系統級設定,併為單個表配置永續性統計資訊。

    更多資訊,請參閱 第 17.8.10.1 節,“配置永續性最佳化器統計引數”。

  • innodb_stats_persistent_sample_pages

    命令列格式 --innodb-stats-persistent-sample-pages=#
    系統變數 innodb_stats_persistent_sample_pages
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 20
    最小值 1
    最大值 18446744073709551615

    用於估算索引列的基數和其他統計資訊的索引頁的數量,例如ANALYZE TABLE計算的那些。增加該值可以提高索引統計資訊的準確性,從而可以改善查詢執行計劃,但會增加執行ANALYZE TABLEInnoDB表的 I/O 開銷。更多資訊,請參閱 第 17.8.10.1 節,“配置永續性最佳化器統計引數”。

    注意

    innodb_stats_persistent_sample_pages 設定一個較高的值可能導致 ANALYZE TABLE 執行時間過長。要估算 ANALYZE TABLE 訪問的資料庫頁數,請參見 Section 17.8.10.3, “Estimating ANALYZE TABLE Complexity for InnoDB Tables”。

    當為表啟用 innodb_stats_persistent 時,innodb_stats_persistent_sample_pages 才適用;當禁用 innodb_stats_persistent 時,將使用 innodb_stats_transient_sample_pages

  • innodb_stats_transient_sample_pages

    命令列格式 --innodb-stats-transient-sample-pages=#
    系統變數 innodb_stats_transient_sample_pages
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 8
    最小值 1
    最大值 18446744073709551615

    在估算索引列的基數和其他統計資訊時要取樣的索引頁數,例如透過 ANALYZE TABLE 計算的那些。預設值為 8。增加該值可以提高索引統計資訊的準確性,從而改善查詢執行計劃,但會增加開啟 InnoDB 表或重新計算統計資訊時的 I/O。有關更多資訊,請參見 Section 17.8.10.2, “Configuring Non-Persistent Optimizer Statistics Parameters”。

    注意

    innodb_stats_transient_sample_pages 設定一個較高的值可能導致 ANALYZE TABLE 執行時間過長。要估算 ANALYZE TABLE 訪問的資料庫頁數,請參見 Section 17.8.10.3, “Estimating ANALYZE TABLE Complexity for InnoDB Tables”。

    innodb_stats_transient_sample_pages僅在為表禁用innodb_stats_persistent時適用;當啟用innodb_stats_persistent時,將使用innodb_stats_persistent_sample_pages。取代innodb_stats_sample_pages。更多資訊,請參見第 17.8.10.2 節,“配置非永續性最佳化器統計引數”。

  • innodb_status_output

    命令列格式 `--innodb-status-output[={OFF ON}]`
    系統變數 innodb_status_output
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林
    預設值 OFF

    啟用或禁用標準InnoDB監視器的定期輸出。也與innodb_status_output_locks結合使用,以啟用或禁用InnoDB鎖監視器的定期輸出。更多資訊,請參見第 17.17.2 節,“啟用 InnoDB 監視器”。

  • innodb_status_output_locks

    命令列格式 `--innodb-status-output-locks[={OFF ON}]`
    系統變數 innodb_status_output_locks
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林
    預設值 OFF

    啟用或禁用InnoDB鎖監視器。啟用後,InnoDB鎖監視器會在SHOW ENGINE INNODB STATUS輸出和定期輸出中列印有關鎖的附加資訊,並在 MySQL 錯誤日誌中列印。InnoDB鎖監視器的定期輸出作為標準InnoDB監視器輸出的一部分列印。因此,必須啟用標準InnoDB監視器,InnoDB鎖監視器才能定期將資料列印到 MySQL 錯誤日誌中。更多資訊,請參見第 17.17.2 節,“啟用 InnoDB 監視器”。

  • innodb_strict_mode

    命令列格式 `--innodb-strict-mode[={OFF ON}]`
    系統變數 innodb_strict_mode
    範圍 全域性,會話
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 ON

    當啟用innodb_strict_mode時,InnoDB在檢查無效或不相容表選項時返回錯誤而不是警告。

    它檢查KEY_BLOCK_SIZEROW_FORMATDATA DIRECTORYTEMPORARYTABLESPACE選項是否與彼此和其他設定相容。

    innodb_strict_mode=ON還在建立或更改表時啟用行大小檢查,以防止由於記錄對所選頁面大小過大而導致INSERTUPDATE失敗。

    您可以在啟動mysqld時在命令列上啟用或禁用innodb_strict_mode,或者在 MySQL 配置檔案中啟用或禁用innodb_strict_mode。您還可以使用語句SET [GLOBAL|SESSION] innodb_strict_mode=mode在執行時啟用或禁用innodb_strict_mode,其中modeONOFF。更改GLOBAL設定需要具有足夠許可權設定全域性系統變數的許可權(請參閱 Section 7.1.9.1, “系統變數許可權”),並影響隨後連線的所有客戶端的操作。任何客戶端都可以更改innodb_strict_modeSESSION設定,該設定僅影響該客戶端。

    從 MySQL 8.0.26 開始,設定此係統變數的會話值是受限制的操作。會話使用者必須具有足夠的許可權來設定受限制的會話變數。請參閱 Section 7.1.9.1, “系統變數許可權”。

  • innodb_sync_array_size

    | 命令列格式 | --innodb-sync-array-size=#` |

    系統變數 innodb_sync_array_size
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 1
    最小值 1
    最大值 1024

    定義互斥鎖/鎖等待陣列的大小。增加該值會分割用於協調執行緒的內部資料結構,以提高在具有大量等待執行緒的工作負載中的併發性。必須在 MySQL 例項啟動時配置此設定,之後無法更改。建議增加該值以適應頻繁產生大量等待執行緒的工作負載,通常大於 768 個。`

  • innodb_sync_spin_loops

    | 命令列格式 | --innodb-sync-spin-loops=#` |

    System Variable innodb_sync_spin_loops
    Scope Global
    Dynamic Yes
    SET_VAR Hint Applies No
    Type Integer
    Default Value 30
    Minimum Value 0
    Maximum Value 4294967295

    執行緒等待InnoDB互斥鎖被釋放的次數,超過後執行緒將被掛起。

  • innodb_sync_debug

    | Command-Line Format | --innodb-sync-debug[={OFF|ON}]` |

    System Variable innodb_sync_debug
    Scope Global
    Dynamic No
    SET_VAR Hint Applies No
    Type Boolean
    Default Value OFF

    啟用InnoDB儲存引擎的同步除錯檢查。此選項僅在使用WITH_DEBUG CMake選項編譯時才可用。

  • innodb_table_locks

    | Command-Line Format | --innodb-table-locks[={OFF|ON}]` |

    System Variable innodb_table_locks
    Scope Global, Session
    Dynamic Yes
    SET_VAR Hint Applies No
    Type Boolean
    Default Value ON

    如果autocommit = 0InnoDB會遵守LOCK TABLES;MySQL 在LOCK TABLES ... WRITE直到所有其他執行緒都釋放對錶的鎖之前不會返回。innodb_table_locks的預設值為 1,這意味著LOCK TABLES會導致 InnoDB 在autocommit = 0時內部鎖定表。

    innodb_table_locks = 0對使用LOCK TABLES ... WRITE顯式鎖定的表沒有影響。但對透過觸發器隱式鎖定的表或透過LOCK TABLES ... READ讀寫鎖定的表有影響。

    有關更多資訊,請參見第 17.7 節,“InnoDB 鎖定和事務模型”。

  • innodb_temp_data_file_path

    | Command-Line Format | --innodb-temp-data-file-path=file_name` |

    系統變數 innodb_temp_data_file_path
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 字串
    預設值 ibtmp1:12M:autoextend

    定義全域性臨時表空間資料檔案的相對路徑、名稱、大小和屬性。全域性臨時表空間儲存對使用者建立的臨時表所做更改的回滾段。

    如果未為 innodb_temp_data_file_path 指定任何值,則預設行為是在 innodb_data_home_dir 目錄中建立一個名為 ibtmp1 的單個自動擴充套件資料檔案。初始檔案大小略大於 12MB。

    全域性臨時表空間資料檔案規範的語法包括檔名、檔案大小以及 autoextendmax 屬性���

    *file_name*:*file_size*[:autoextend[:max:*max_file_size*]]
    

    全域性臨時表空間資料檔案的名稱不能與另一個 InnoDB 資料檔案相同。任何無法建立全域性臨時表空間資料檔案或出現錯誤的情況都被視為致命,伺服器啟動將被拒絕。

    檔案大小透過在大小值後附加 KMG 來指定為 KB、MB 或 GB。檔案大小之和必須略大於 12MB。

    單個檔案的大小限制由作業系統確定。在支援大檔案的作業系統上,檔案大小可以超過 4GB。不支援使用原始磁碟分割槽用於全域性臨時表空間資料檔案。

    autoextendmax 屬性只能用於在 innodb_temp_data_file_path 設定中指定的最後一個資料檔案。例如:

    [mysqld]
    innodb_temp_data_file_path=ibtmp1:50M;ibtmp2:12M:autoextend:max:500M
    

    autoextend 選項會在資料檔案用盡空間時自動增加大小。autoextend 增量預設為 64MB。要修改增量,請更改 innodb_autoextend_increment 變數設定。

    全域性臨時表空間資料檔案的目錄路徑是透過連線由 innodb_data_home_dirinnodb_temp_data_file_path 定義的路徑形成的。

    在以只讀模式執行 InnoDB 之前,將 innodb_temp_data_file_path 設定為資料目錄之外的位置。路徑必須相對於資料目錄。例如:

    --innodb-temp-data-file-path=../../../tmp/ibtmp1:12M:autoextend
    

    有關更多資訊,請參閱 全域性臨時表空間。`

  • innodb_temp_tablespaces_dir

    | 命令列格式 | --innodb-temp-tablespaces-dir=dir_name` |

    引入版本 8.0.13
    系統變數 innodb_temp_tablespaces_dir
    範圍 全域性
    Dynamic No
    SET_VAR Hint Applies No
    型別 目錄名稱
    Default Value #innodb_temp

    定義InnoDB在啟動時建立會話臨時表空間池的位置。預設位置是資料目錄中的#innodb_temp目錄。允許使用完全限定路徑或相對於資料目錄的路徑。

    截至 MySQL 8.0.16,會話臨時表空間始終儲存使用者建立的臨時表和使用InnoDB建立的最佳化器內部臨時表。(以前,內部臨時表的磁碟儲存引擎由不再支援的internal_tmp_disk_storage_engine系統變數確定。請參閱磁碟內部臨時表的儲存引擎。)

    更多資訊,請參閱會話臨時表空間。

  • innodb_thread_concurrency

    | 命令列格式 | --innodb-thread-concurrency=#` |

    系統變數 innodb_thread_concurrency
    Scope Global
    動態
    SET_VAR Hint Applies No
    型別 整數
    Default Value 0
    最小值 0
    最大值 1000

    定義InnoDB內允許的最大執行緒數。值為 0(預設值)被解釋為無限併發(無限制)。此變數旨在用於高併發系統的效能調優。

    InnoDB試圖保持InnoDB內部執行緒的數量小於或等於innodb_thread_concurrency限制。等待鎖的執行緒不計入併發執行執行緒數。

    正確的設定取決於工作負載和計算環境。如果你的 MySQL 例項與其他應用程式共享 CPU 資源,或者你的工作負載或併發使用者數量正在增加,考慮設定這個變數。測試一系列值以確定提供最佳效能的設定。innodb_thread_concurrency是一個動態變數,允許在實時測試系統上嘗試不同的設定。如果某個設定表現不佳,你可以快速將innodb_thread_concurrency設定回 0。

    使用以下準則來幫助找到並保持適當的設定:

    • 如果工作負載的併發使用者執行緒數量始終很少且不影響效能,設定innodb_thread_concurrency=0(無限制)。

    • 如果你的工作負載始終很重或偶爾會出現峰值,設定一個innodb_thread_concurrency值,並調整直到找到提供最佳效能的執行緒數量。例如,假設你的系統通常有 40 到 50 個使用者,但有時使用者數量增加到 60、70 或更多。透過測試,你發現限制為 80 個併發使用者時效能基本穩定。在這種情況下,將innodb_thread_concurrency設定為 80。

    • 如果你不希望InnoDB為使用者執行緒使用超過一定數量的虛擬 CPU(例如 20 個虛擬 CPU),將innodb_thread_concurrency設定為這個數字(或根據效能測試可能更低)。如果你的目標是將 MySQL 與其他應用程式隔離開來,考慮將mysqld程序專門繫結到虛擬 CPU。然而,請注意,獨佔繫結可能導致硬體使用不佳,如果mysqld程序沒有持續繁忙。在這種情況下,你可以將mysqld程序繫結到虛擬 CPU,但允許其他應用程式使用部分或全部虛擬 CPU。

      注意

      從作業系統的角度來看,使用資源管理解決方案來管理 CPU 時間在應用程式之間的共享可能比繫結mysqld程序更可取。例如,你可以在其他關鍵程序不執行時將 90% 的虛擬 CPU 時間分配給特定應用程式,而在其他關鍵程序執行時將該值縮減到 40%。

    • 在某些情況下,最佳的innodb_thread_concurrency設定可能小於虛擬 CPU 的數量。

    • 如果innodb_thread_concurrency值過高,可能會導致效能下降,因為系統內部和資源的爭用增加。

    • 定期監視和分析您的系統。工作負載、使用者數量或計算環境的變化可能需要您調整innodb_thread_concurrency設定。

    值為 0 會禁用SHOW ENGINE INNODB STATUS輸出中ROW OPERATIONS部分的InnoDB內部查詢和佇列中查詢計數器。

    有關更多資訊,請參閱第 17.8.4 節,“配置 InnoDB 的執行緒併發性”。

  • innodb_thread_sleep_delay

    | 命令列格式 | --innodb-thread-sleep-delay=#` |

    系統變數 innodb_thread_sleep_delay
    作用範圍 全域性
    動態
    SET_VAR Hint Applies
    型別 整數
    預設值 10000
    最小值 0
    最大值 1000000
    單位 微秒

    InnoDB執行緒在加入InnoDB佇列之前睡眠的時間,單位為微秒。預設值為 10000。值為 0 會禁用睡眠。您可以將innodb_adaptive_max_sleep_delay設定為允許的最高值,以供innodb_thread_sleep_delay使用,InnoDB會根據當前執行緒排程活動自動調整innodb_thread_sleep_delay的值,以適應系統輕載或接近滿負荷執行時的情況,這種動態調整有助於執行緒排程機制在系統輕載或接近滿負荷執行時平穩工作。

    有關更多資訊,請參閱第 17.8.4 節,“配置 InnoDB 的執行緒併發性”。

  • innodb_tmpdir

    | 命令列格式 | --innodb-tmpdir=dir_name` |

    系統變數 innodb_tmpdir
    作用範圍 全域性,會話
    動態
    SET_VAR Hint Applies
    型別 目錄名稱
    預設值 NULL

    用於定義線上ALTER TABLE操作重建表時建立的臨時排序檔案的替代目錄。

    線上ALTER TABLE操作重建表時,還會在與原始表相同目錄中建立一個中間表檔案。innodb_tmpdir選項不適用於中間表檔案。

    有效值是除 MySQL 資料目錄路徑之外的任何目錄路徑。如果值為 NULL(預設值),則臨時檔案將在 MySQL 臨時目錄(Unix 上的$TMPDIR,Windows 上的%TEMP%,或由--tmpdir配置選項指定的目錄)中建立。如果指定了目錄,則僅在使用SET語句配置innodb_tmpdir時才檢查目錄的存在和許可權。如果在目錄字串中提供了符號連結,則符號連結將被解析並儲存為絕對路徑。路徑不應超過 512 位元組。如果將innodb_tmpdir設定為無效目錄,則線上ALTER TABLE操作將報告錯誤。innodb_tmpdir覆蓋了 MySQL 的tmpdir設定,但僅適用於線上ALTER TABLE操作。

    配置innodb_tmpdir需要FILE許可權。

    innodb_tmpdir 選項的引入是為了幫助避免在tmpfs檔案系統上的臨時檔案目錄溢位。這種溢位可能是由線上ALTER TABLE操作中建立的大型臨時排序檔案導致的,這些操作會重建表。

    在複製環境中,只有當所有伺服器具有相同的作業系統環境時,才考慮複製innodb_tmpdir設定。否則,在執行重建表的線上ALTER TABLE操作時,複製innodb_tmpdir設定可能導致複製失敗。如果伺服器操作環境不同,建議在每臺伺服器上單獨配置innodb_tmpdir

    更多資訊,請參見第 17.12.3 節,“線上 DDL 空間要求”。有關線上ALTER TABLE操作的資訊,請參見第 17.12 節,“InnoDB 和線上 DDL”。

  • innodb_trx_purge_view_update_only_debug

    | 命令列格式 | --innodb-trx-purge-view-update-only-debug[={OFF|ON}]` |

    系統變數 innodb_trx_purge_view_update_only_debug
    範圍 全域性
    動態
    SET_VAR提示適用
    型別 布林值
    預設值 OFF

    暫停刪除標記記錄的清除,同時允許更新清除檢視。此選項人為地建立了一種情況,即清除檢視已更新但尚未執行清除。此選項僅在使用WITH_DEBUG CMake選項編譯時才可用。

  • innodb_trx_rseg_n_slots_debug

    | 命令列格式 | --innodb-trx-rseg-n-slots-debug=# |

    系統變數 innodb_trx_rseg_n_slots_debug
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 整數
    預設值 0
    最小值 0
    最大值 1024

    設定一個除錯標誌,將TRX_RSEG_N_SLOTS限制為trx_rsegf_undo_find_free函式中查詢撤銷日誌段的空閒槽位的給定值。此選項僅在使用WITH_DEBUG CMake選項編譯時才可用。

  • innodb_undo_directory

    | 命令列格式 | --innodb-undo-directory=dir_name |

    系統變數 innodb_undo_directory
    作用範圍 全域性
    動態
    SET_VAR提示適用
    型別 目錄名稱

    InnoDB建立撤銷表空間的路徑。通常用於將撤銷表空間放置在不同的儲存裝置上。

    沒有預設值(為 NULL)。如果未定義innodb_undo_directory變數,則撤銷表空間將在資料目錄中建立。

    MySQL 例項初始化時建立的預設撤銷表空間(innodb_undo_001innodb_undo_002)始終駐留在由innodb_undo_directory變數定義的目錄中。

    使用CREATE UNDO TABLESPACE語法建立的撤銷表空間將在由innodb_undo_directory變數定義的目錄中建立,如果沒有指定不同的路徑。

    更多資訊,請參閱第 17.6.3.4 節,“撤銷表空間”。

  • innodb_undo_log_encrypt

    | 命令列格式 | --innodb-undo-log-encrypt[={OFF&#124;ON}] |

    系統變數 innodb_undo_log_encrypt
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    控制使用 InnoDB 資料靜態加密功能加密的表的撤消日誌資料的加密。僅適用於駐留在單獨的撤消表空間中的撤消日誌。請參閱第 17.6.3.4 節,“撤消表空間”。不支援對駐留在系統表空間中的撤消日誌資料進行加密。有關更多資訊,請參閱撤消日誌加密。

  • innodb_undo_log_truncate

    | 命令列格式 | --innodb-undo-log-truncate[={OFF|ON}]` |

    系統變數 innodb_undo_log_truncate
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 ON

    啟用後,超過由 innodb_max_undo_log_size 定義的閾值的撤消表空間將被標記為截斷。只能截斷撤消表空間。不支援截斷駐留在系統表空間中的撤消日誌。要進行截斷,必須至少有兩個撤消表空間。

    innodb_purge_rseg_truncate_frequency 變數可用於加快截斷撤消表空間的速度。

    更多資訊,請參閱截斷撤消表空間。

  • innodb_undo_tablespaces

    | 命令列格式 | --innodb-undo-tablespaces=#` |

    已棄用
    系統變數 innodb_undo_tablespaces
    作用範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 2
    最小值 2
    最大值 127

    定義 InnoDB 使用的撤消表空間的數量。預設值和最小值均為 2。

    注意

    innodb_undo_tablespaces 變數已被棄用,並且自 MySQL 8.0.14 版本起不再可配置。預計在未來的版本中將被移除。

    有關更多資訊,請參見第 17.6.3.4 節,“撤銷表空間”。`

  • innodb_use_fdatasync

    | 命令列格式 | --innodb-use-fdatasync[={OFF&#124;ON}] |

    引入版本 8.0.26
    系統變數 innodb_use_fdatasync
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 OFF

    在支援fdatasync()系統呼叫的平臺上,啟用innodb_use_fdatasync變數允許使用fdatasync()而不是fsync()系統呼叫進行作業系統重新整理。fdatasync()呼叫不會重新整理檔案後設資料,除非需要進行後續資料檢索,從而提供潛在的效能優勢。

    一些innodb_flush_method設定的子集,如fsyncO_DSYNCO_DIRECT使用fsync()系統呼叫。在使用這些設定時,innodb_use_fdatasync變數是適用的。`

  • innodb_use_native_aio

    | 命令列格式 | --innodb-use-native-aio[={OFF&#124;ON}] |

    系統變數 innodb_use_native_aio
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林值
    預設值 ON

    指定是否使用 Linux 非同步 I/O 子系統。此變數僅適用於 Linux 系統,並且不能在伺服器執行時更改。通常情況下,您不需要配置此選項,因為它預設啟用。

    InnoDB 在 Windows 系統上具有的非同步 I/O 功能也適用於 Linux 系統。(其他類 Unix 系統繼續使用同步 I/O 呼叫。)此功能提高了通常在SHOW ENGINE INNODB STATUS\G輸出中顯示許多待處理讀取/寫入的 I/O 密集型系統的可伸縮性。

    使用大量InnoDB I/O 執行緒執行,尤其是在同一臺伺服器上執行多個這樣的例項,可能會超出 Linux 系統的容量限制。在這種情況下,您可能會收到以下錯誤:

    EAGAIN: The specified maxevents exceeds the user's limit of available events.
    

    通常情況下,您可以透過將更高的限制寫入/proc/sys/fs/aio-max-nr來解決此錯誤。

    然而,如果作業系統中非同步 I/O 子系統出現問題導致 InnoDB 無法啟動,您可以使用 innodb_use_native_aio=0 啟動伺服器。在啟動過程中,如果 InnoDB 檢測到潛在問題,例如 tmpdir 位置、tmpfs 檔案系統和不支援 tmpfs 上的 AIO 的 Linux 核心的組合,此選項也可能會被自動禁用。

    欲瞭解更多資訊,請參閱 第 17.8.6 節,“在 Linux 上使用非同步 I/O”。

  • innodb_validate_tablespace_paths

    | 命令列格式 | --innodb-validate-tablespace-paths[={OFF|ON}]` |

    引入版本 8.0.21
    系統變數 innodb_validate_tablespace_paths
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 布林
    預設值 ON

    控制表空間檔案路徑驗證。在啟動時,InnoDB 驗證已知表空間檔案的路徑與資料字典中儲存的表空間檔案路徑是否匹配,以防表空間檔案已移至其他位置。innodb_validate_tablespace_paths 變數允許禁用表空間路徑驗證。此功能適用於表空間檔案未移動的環境。禁用路徑驗證可提高在具有大量表空間檔案的系統上的啟動時間。

    警告

    在移動表空間檔案後以禁用表空間路徑驗證啟動伺服器可能導致未定義行為。

    欲瞭解更多資訊,請參閱 第 17.6.3.7 節,“禁用表空間路徑驗證”。

  • innodb_version

    InnoDB 版本號。在 MySQL 8.0 中,InnoDB 的單獨版本編號不適用,此值與伺服器的 version 編號相同。`

  • innodb_write_io_threads

    | 命令列格式 | --innodb-write-io-threads=#` |

    系統變數 innodb_write_io_threads
    範圍 全域性
    動態
    SET_VAR 提示適用
    型別 整數
    預設值 4
    最小值 1
    最大值 64

    InnoDB寫操作的 I/O 執行緒數。預設值為 4。讀執行緒的對應值是innodb_read_io_threads。更多資訊,請參見第 17.8.5 節,“配置後臺 InnoDB I/O 執行緒數”。有關一般 I/O 調優建議,請參見第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

    注意

    在 Linux 系統上,使用預設設定執行多個 MySQL 伺服器(通常超過 12 個),innodb_read_io_threadsinnodb_write_io_threads,以及 Linux aio-max-nr設定可能超出系統限制。理想情況下,增加aio-max-nr設定;作為解決方法,您可以減少一個或兩個 MySQL 變數的設定。

    考慮到sync_binlog的價值,它控制著二進位制日誌與磁碟的同步。

    有關一般 I/O 調優建議,請參見第 10.5.8 節,“最佳化 InnoDB 磁碟 I/O”。

17.15 InnoDB INFORMATION_SCHEMA 表

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema.html

17.15.1 InnoDB INFORMATION_SCHEMA 關於壓縮的表

17.15.2 InnoDB INFORMATION_SCHEMA 事務和鎖資訊表

17.15.3 InnoDB INFORMATION_SCHEMA 模式物件表

17.15.4 InnoDB INFORMATION_SCHEMA 全文索引表

17.15.5 InnoDB INFORMATION_SCHEMA 緩衝池表

17.15.6 InnoDB INFORMATION_SCHEMA 指標表

17.15.7 InnoDB INFORMATION_SCHEMA 臨時表資訊表

17.15.8 從 INFORMATION_SCHEMA.FILES 檢索 InnoDB 表空間後設資料

本節提供了關於InnoDB INFORMATION_SCHEMA 表的資訊和使用示例。

InnoDB INFORMATION_SCHEMA 表提供了關於InnoDB 儲存引擎各個方面的後設資料、狀態資訊和統計資訊。您可以透過在INFORMATION_SCHEMA 資料庫上發出SHOW TABLES語句來檢視InnoDB INFORMATION_SCHEMA 表的列表:

mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB%';

對於表定義,請參閱第 28.4 節,“INFORMATION_SCHEMA InnoDB 表”。關於MySQL INFORMATION_SCHEMA 資料庫的一般資訊,請參閱第二十八章,“INFORMATION_SCHEMA 表”。

17.15.1 關於壓縮的 InnoDB INFORMATION_SCHEMA 表

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-compression-tables.html

17.15.1.1 INNODB_CMP 和 INNODB_CMP_RESET

17.15.1.2 INNODB_CMPMEM 和 INNODB_CMPMEM_RESET

17.15.1.3 使用壓縮資訊模式表

有兩對InnoDB INFORMATION_SCHEMA關於壓縮的表,可以提供關於整體壓縮效果的見解:

  • INNODB_CMPINNODB_CMP_RESET 提供有關壓縮操作次數和執行壓縮所花費時間的資訊。

  • INNODB_CMPMEMINNODB_CMPMEM_RESET 提供有關為壓縮分配記憶體的資訊。

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-innodb_cmp.html

17.15.1.1 INNODB_CMP 和 INNODB_CMP_RESET

INNODB_CMPINNODB_CMP_RESET 表提供關於與壓縮表相關操作的狀態資訊,這些操作在第 17.9 節,“InnoDB 表和頁面壓縮”中有描述。PAGE_SIZE列報告了壓縮的頁面大小。

這兩個表具有相同的內容,但從INNODB_CMP_RESET讀取會重置有關壓縮和解壓操作的統計資訊。例如,如果您每 60 分鐘歸檔一次INNODB_CMP_RESET的輸出,您將看到每個小時週期的統計資訊。如果您監視INNODB_CMP的輸出(確保永遠不要讀取INNODB_CMP_RESET),您將看到自 InnoDB 啟動以來的累積統計資訊。

有關表定義,請參見第 28.4.6 節,“INFORMATION_SCHEMA INNODB_CMP 和 INNODB_CMP_RESET 表”。

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-innodb_cmpmem.html

17.15.1.2 INNODB_CMPMEM 和 INNODB_CMPMEM_RESET

INNODB_CMPMEMINNODB_CMPMEM_RESET表提供有關位於緩衝池中的壓縮頁面的狀態資訊。請參閱第 17.9 節,“InnoDB 表和頁面壓縮”以獲取有關壓縮表和緩衝池使用的更多資訊。INNODB_CMPINNODB_CMP_RESET表應提供有關壓縮的更有用的統計資訊。

內部細節

InnoDB 使用一個 buddy allocator 系統來管理分配給各種大小的頁面的記憶體,從 1KB 到 16KB。這裡描述的兩個表的每一行對應一個單獨的頁面大小。

INNODB_CMPMEMINNODB_CMPMEM_RESET表具有相同的內容,但從INNODB_CMPMEM_RESET讀取會重置有關重定位操作的統計資訊。例如,如果每 60 分鐘歸檔一次INNODB_CMPMEM_RESET的輸出,它將顯示每小時的統計資訊。如果你從未讀取過INNODB_CMPMEM_RESET,而是監視INNODB_CMPMEM的輸出,它將顯示自InnoDB啟動以來的累積統計資訊。

有關表定義,請參見第 28.4.7 節,“INFORMATION_SCHEMA INNODB_CMPMEM 和 INNODB_CMPMEM_RESET 表”。

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-examples-compression-sect.html

17.15.1.3 使用壓縮資訊模式表

示例 17.1 使用壓縮資訊模式表

以下是包含壓縮表的資料庫的示例輸出(參見第 17.9 節,“InnoDB 表和頁壓縮”,INNODB_CMPINNODB_CMP_PER_INDEXINNODB_CMPMEM)。

以下表格顯示了在輕量級工作負載下INFORMATION_SCHEMA.INNODB_CMP的內容。緩衝池中唯一包含的壓縮頁大小為 8K。自統計資料重置以來,壓縮或解壓頁的時間不到一秒,因為COMPRESS_TIMEUNCOMPRESS_TIME列的值為零。

頁大小 壓縮操作 壓縮操作成功 壓縮時間 解壓操作 解壓時間
1024 0 0 0 0 0
2048 0 0 0 0 0
4096 0 0 0 0 0
8192 1048 921 0 61 0
16384 0 0 0 0 0

根據INNODB_CMPMEM,緩衝池中有 6169 個壓縮的 8KB 頁。唯一的其他分配塊大小為 64 位元組。INNODB_CMPMEM中最小的PAGE_SIZE用於那些在緩衝池中不存在未壓縮頁的壓縮頁的塊描述符。我們看到有 5910 個這樣的頁。間接地,我們看到 259(6169-5910)個壓縮頁也以未壓縮形式存在於緩衝池中。

下表顯示了在輕負載工作負載下INFORMATION_SCHEMA.INNODB_CMPMEM的內容。由於壓縮頁記憶體分配器的碎片化,一些記憶體無法使用:SUM(PAGE_SIZE*PAGES_FREE)=6784。這是因為小記憶體分配請求透過從主緩衝池分配的 16K 塊開始,使用夥伴分配系統來拆分更大的塊來滿足。碎片化很低是因為一些已分配的塊已經被重定位(複製)以形成更大的相鄰空閒塊。這些複製的SUM(PAGE_SIZE*RELOCATION_OPS)位元組消耗不到一秒的時間(SUM(RELOCATION_TIME)=0)

頁大小 已使用頁數 空閒頁數 重定位操作 重定位時間
64 5910 0 2436 0
128 0 1 0 0
256 0 0 0 0
512 0 1 0 0
1024 0 0 0 0
2048 0 1 0 0
4096 0 1 0 0
8192 6169 0 5 0
16384 0 0 0 0

17.15.2 InnoDB INFORMATION_SCHEMA 事務和鎖定資訊

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-transactions.html

17.15.2.1 使用 InnoDB 事務和鎖定資訊

17.15.2.2 InnoDB 鎖和鎖等待資訊

17.15.2.3 InnoDB 事務和鎖定資訊的永續性和一致性

注意

本節描述由 Performance Schema data_locksdata_lock_waits 表公開的鎖定資訊,這些表在 MySQL 8.0 中取代了INFORMATION_SCHEMA INNODB_LOCKSINNODB_LOCK_WAITS 表。有關以舊的INFORMATION_SCHEMA表為基礎撰寫的類似討論,請參閱 InnoDB INFORMATION_SCHEMA 事務和鎖定資訊,在 MySQL 5.7 參考手冊中。

一個INFORMATION_SCHEMA表和兩個 Performance Schema 表使您能夠監視InnoDB事務並診斷潛在的鎖定問題:

  • INNODB_TRX:這個INFORMATION_SCHEMA表提供有關每個當前在InnoDB中執行的事務的資訊,包括事務狀態(例如,它是正在執行還是等待鎖),事務開始時間以及事務正在執行的特定 SQL 語句。

  • data_locks:這個 Performance Schema 表包含每個持有鎖和每個被阻塞等待持有鎖釋放的鎖請求的行:

    • 對於每個持有的鎖都有一行,無論持有鎖的事務的狀態如何(INNODB_TRX.TRX_STATERUNNINGLOCK WAITROLLING BACKCOMMITTING)。

    • 每個在 InnoDB 中等待另一個事務釋放鎖的事務(INNODB_TRX.TRX_STATELOCK WAIT)都被一個阻塞的鎖請求所阻塞。該阻塞的鎖請求是由另一個事務以不相容模式持有的行或表鎖引起的。鎖請求的模式總是與阻止請求的持有鎖的模式不相容(讀 vs. 寫,共享 vs. 獨佔)。

      被阻塞的事務在另一個事務提交或回滾後才能繼續,從而釋放所請求的鎖。對於每個被阻塞的事務,data_locks 包含一行,描述了事務請求的每個鎖以及等待的鎖。

  • data_lock_waits:這個效能模式表指示哪些事務正在等待特定的鎖,或者哪個鎖正在等待特定的事務。對於每個被阻塞的事務,這個表包含一個或多個行,指示它請求的鎖以及阻止該請求的任何鎖。REQUESTING_ENGINE_LOCK_ID 值指的是事務請求的鎖,BLOCKING_ENGINE_LOCK_ID 值指的是(由另一個事務持有的)阻止第一個事務繼續的鎖。對於任何被阻塞的事務,data_lock_waits 中的所有行都具有相同的 REQUESTING_ENGINE_LOCK_ID 值,但 BLOCKING_ENGINE_LOCK_ID 值不同。

有關上述表的更多資訊,請參見 第 28.4.28 節,“INFORMATION_SCHEMA INNODB_TRX 表”,第 29.12.13.1 節,“data_locks 表”,以及 第 29.12.13.2 節,“data_lock_waits 表”。

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-examples.html

17.15.2.1 使用 InnoDB 事務和鎖定資訊

注意

本節描述了由效能模式data_locksdata_lock_waits表公開的鎖定資訊,這些表在 MySQL 8.0 中取代了INFORMATION_SCHEMA中的INNODB_LOCKSINNODB_LOCK_WAITS表。有關以舊的INFORMATION_SCHEMA表為基礎的類似討論,請參閱使用 InnoDB 事務和鎖定資訊,在 MySQL 5.7 參考手冊中。

識別阻塞事務

有時候確定哪個事務阻塞另一個是有幫助的。包含有關InnoDB事務和資料鎖的資訊的表使您能夠確定哪個事務正在等待另一個事務,以及正在請求哪個資源。(有關這些表的描述,請參見第 17.15.2 節,“InnoDB INFORMATION_SCHEMA 事務和鎖定資訊”。)

假設有三個會話同時執行。每個會話對應一個 MySQL 執行緒,並在另一個之後執行一個事務。考慮當這些會話發出以下語句但尚未提交其事務時系統的狀態:

  • 會話 A:

    BEGIN;
    SELECT a FROM t FOR UPDATE;
    SELECT SLEEP(100);
    
  • 會話 B:

    SELECT b FROM t FOR UPDATE;
    
  • 會話 C:

    SELECT c FROM t FOR UPDATE;
    

在這種情況下,使用以下查詢檢視哪些事務正在等待,哪些事務正在阻塞它們:

SELECT
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  r.trx_query waiting_query,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread,
  b.trx_query blocking_query
FROM       performance_schema.data_lock_waits w
INNER JOIN information_schema.innodb_trx b
  ON b.trx_id = w.blocking_engine_transaction_id
INNER JOIN information_schema.innodb_trx r
  ON r.trx_id = w.requesting_engine_transaction_id;

或者更簡單地,使用sys模式的innodb_lock_waits檢視:

SELECT
  waiting_trx_id,
  waiting_pid,
  waiting_query,
  blocking_trx_id,
  blocking_pid,
  blocking_query
FROM sys.innodb_lock_waits;

如果阻塞查詢報告了 NULL 值,請參閱在發出會話變為空閒後識別阻塞查詢。

等待 trx id 等待執行緒 等待查詢 阻塞 trx id 阻塞執行緒 阻塞查詢
A4 6 SELECT b FROM t FOR UPDATE A3 5 SELECT SLEEP(100)
A5 7 SELECT c FROM t FOR UPDATE A3 5 SELECT SLEEP(100)
A5 7 SELECT c FROM t FOR UPDATE A4 6 SELECT b FROM t FOR UPDATE

在上表中,您可以透過“等待查詢”或“阻塞查詢”列來識別會話。正如您所看到的:

  • 會話 B(trx id A4,執行緒6)和會話 C(trx id A5,執行緒7)都在等待會話 A(trx id A3,執行緒5)。

  • 會話 C 正在等待會話 B 以及會話 A。

你可以在INFORMATION_SCHEMAINNODB_TRX表以及效能模式的data_locksdata_lock_waits表中檢視底層資料。

以下表格顯示了INNODB_TRX表的一些示例內容。

事務 ID 事務狀態 事務開始時間 請求鎖 ID 等待開始時間 權重 MySQL 執行緒 ID 查詢語句
A3 RUN­NING 2008-01-15 16:44:54 NULL NULL 2 5 SELECT SLEEP(100)
A4 LOCK WAIT 2008-01-15 16:45:09 A4:1:3:2 2008-01-15 16:45:09 2 6 SELECT b FROM t FOR UPDATE
A5 LOCK WAIT 2008-01-15 16:45:14 A5:1:3:2 2008-01-15 16:45:14 2 7 SELECT c FROM t FOR UPDATE

以下表格顯示了data_locks表的一些示例內容。

鎖 ID 鎖事務 ID 鎖模式 鎖型別 鎖模式 鎖表 鎖索引 鎖資料
A3:1:3:2 A3 X RECORD test t PRIMARY 0x0200
A4:1:3:2 A4 X RECORD test t PRIMARY 0x0200
A5:1:3:2 A5 X RECORD test t PRIMARY 0x0200

以下表格顯示了data_lock_waits表的一些示例內容。

請求事務 ID 請求鎖 ID 阻塞事務 ID 阻塞鎖 ID
A4 A4:1:3:2 A3 A3:1:3:2
A5 A5:1:3:2 A3 A3:1:3:2
A5 A5:1:3:2 A4 A4:1:3:2
在發出會話變為空閒後識別阻塞查詢

在識別阻塞事務時,如果發出查詢的會話已經變為空閒,則會報告阻塞查詢的 NULL 值。在這種情況下,使用以下步驟確定阻塞查詢:

  1. 確定阻塞事務的程序列表 ID。在sys.innodb_lock_waits表中,阻塞事務的程序列表 ID 是blocking_pid值。

  2. 使用blocking_pid,查詢 MySQL 效能模式的threads表以確定阻塞事務的THREAD_ID。例如,如果blocking_pid為 6,則發出以下查詢:

    SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = 6;
    
  3. 使用THREAD_ID,查詢效能模式events_statements_current表以確定執行緒執行的最後一個查詢。例如,如果THREAD_ID為 28,則發出此查詢:

    SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_current
    WHERE THREAD_ID = 28\G
    
  4. 如果執行緒執行的最後一個查詢不足以確定為何保持鎖定,則可以查詢效能模式events_statements_history表,檢視執行緒執行的最後 10 個語句。

    SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_history
    WHERE THREAD_ID = 28 ORDER BY EVENT_ID;
    
將 InnoDB 事務與 MySQL 會話相關聯

有時將內部InnoDB鎖定資訊與 MySQL 維護的會話級資訊相關聯是有用的。例如,您可能想要知道,對於給定的InnoDB事務 ID,持有鎖定並因此阻止其他事務的 MySQL 會話 ID 和會話名稱。

下面來自INFORMATION_SCHEMA INNODB_TRX表和效能模式data_locksdata_lock_waits表的輸出來自一個負載較重的系統。可以看到,有幾個事務正在執行。

下面的data_locksdata_lock_waits表顯示:

  • 事務77F(執行INSERTINNODB_TRX 表中顯示的查詢可能存在不一致。有關解釋,請參見 第 17.15.2.3 節,“InnoDB 事務和鎖定資訊的永續性和一致性”。

以下表格顯示了執行重 工作負載 系統的 PROCESSLIST 表的內容。

ID 使用者 主機 資料庫 命令 時間 狀態 資訊
384 root localhost test Query 10 update INSERT INTO t2 VALUES …
257 root localhost test Query 3 update INSERT INTO t2 VALUES …
130 root localhost test Query 0 update INSERT INTO t2 VALUES …
61 root localhost test Query 1 update INSERT INTO t2 VALUES …
8 root localhost test Query 1 update INSERT INTO t2 VALUES …
4 root localhost test Query 0 preparing SELECT * FROM PROCESSLIST
2 root localhost test Sleep 566 NULL

以下表格顯示了執行重 工作負載 系統的 INNODB_TRX 表的內容。

事務 ID 事務狀態 事務開始時間 事務請求鎖 ID 事務等待開始時間 事務權重 事務 MySQL 執行緒 ID 事務查詢
77F LOCK WAIT 2008-01-15 13:10:16 77F 2008-01-15 13:10:16 1 876 INSERT INTO t09 (D, B, C) VALUES …
77E LOCK WAIT 2008-01-15 13:10:16 77E 2008-01-15 13:10:16 1 875 INSERT INTO t09 (D, B, C) VALUES …
77D LOCK WAIT 2008-01-15 13:10:16 77D 2008-01-15 13:10:16 1 874 INSERT INTO t09 (D, B, C) VALUES …
77B LOCK WAIT 2008-01-15 13:10:16 77B:733:12:1 2008-01-15 13:10:16 4 873 INSERT INTO t09 (D, B, C) VALUES …
77A RUN­NING 2008-01-15 13:10:16 NULL NULL 4 872 SELECT b, c FROM t09 WHERE …
E56 LOCK WAIT 2008-01-15 13:10:06 E56:743:6:2 2008-01-15 13:10:06 5 384 INSERT INTO t2 VALUES …
E55 LOCK WAIT 2008-01-15 13:10:06 E55:743:38:2 2008-01-15 13:10:13 965 257 INSERT INTO t2 VALUES …
19C RUN­NING 2008-01-15 13:09:10 NULL NULL 2900 130 INSERT INTO t2 VALUES …
E15 執行中 2008-01-15 13:08:59 NULL NULL 5395 61 INSERT INTO t2 VALUES …
51D 執行中 2008-01-15 13:08:47 NULL NULL 9807 8 INSERT INTO t2 VALUES …
事務標識 事務狀態 事務開始時間 事務請求的鎖標識 事務等待開始時間 事務權重 事務 MySQL 執行緒標識 事務查詢

下表顯示了執行重 工作負載 系統的 data_lock_waits 表的內容。

請求事務標識 請求的鎖標識 阻塞事務標識 阻塞的鎖標識
77F 77F:806 77E 77E:806
77F 77F:806 77D 77D:806
77F 77F:806 77B 77B:806
77E 77E:806 77D 77D:806
77E 77E:806 77B 77B:806
77D 77D:806 77B 77B:806
77B 77B:733:12:1 77A 77A:733:12:1
E56 E56:743:6:2 E55 E55:743:6:2
E55 E55:743:38:2 19C 19C:743:38:2

下表顯示了執行重 工作負載 系統的 data_locks 表的內容。

鎖標識 鎖事務標識 鎖模式 鎖型別 鎖模式 鎖表 鎖索引 鎖資料
77F:806 77F AUTO_INC TABLE test t09 NULL NULL
77E:806 77E AUTO_INC TABLE test t09 NULL NULL
77D:806 77D AUTO_INC TABLE test t09 NULL NULL
77B:806 77B AUTO_INC TABLE test t09 NULL NULL
77B:733:12:1 77B X RECORD test t09 PRIMARY supremum pseudo-record
77A:733:12:1 77A X RECORD test t09 PRIMARY supremum pseudo-record
E56:743:6:2 E56 S RECORD test t2 PRIMARY 0, 0
E55:743:6:2 E55 X RECORD test t2 PRIMARY 0, 0
E55:743:38:2 E55 S RECORD test t2 PRIMARY 1922, 1922
19C:743:38:2 19C X RECORD test t2 PRIMARY 1922, 1922
鎖標識 鎖事務標識 鎖模式 鎖型別 鎖模式 鎖表 鎖索引 鎖資料

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-understanding-innodb-locking.html

17.15.2.2 InnoDB 鎖和鎖等待資訊

注意

本節描述了由 Performance Schema data_locksdata_lock_waits 表公開的鎖資訊,它們在 MySQL 8.0 中取代了INFORMATION_SCHEMA INNODB_LOCKSINNODB_LOCK_WAITS 表。對於以舊的INFORMATION_SCHEMA表為基礎編寫的類似討論,請參閱 InnoDB 鎖和鎖等待資訊,在 MySQL 5.7 參考手冊中。

當一個事務更新表中的一行,或者用SELECT FOR UPDATE鎖定它時,InnoDB會為該行建立一個鎖的列表或佇列。同樣,InnoDB為表級鎖維護一個鎖的列表。如果第二個事務想要更新一個已被先前事務以不相容模式鎖定的行,或者鎖定一個已被先前事務鎖定的表,InnoDB會為該行新增一個鎖請求到相應的佇列中。為了讓一個事務獲取鎖,所有之前為該行或表輸入的不相容鎖請求必須被移除(這發生在持有或請求這些鎖的事務提交或回滾時)。

一個事務可能對不同的行或表發出任意數量的鎖請求。在任何給定時間,一個事務可能請求另一個事務持有的鎖,此時它會被那個事務阻塞。請求鎖的事務必須等待持有阻塞鎖的事務提交或回滾。如果一個事務沒有在等待鎖,它處於RUNNING狀態。如果一個事務在等待鎖,它處於LOCK WAIT狀態。(INFORMATION_SCHEMA INNODB_TRX 表顯示事務狀態值。)

Performance Schema data_locks 表為每個LOCK WAIT事務儲存一行或多行,指示阻止其進展的任何鎖請求。該表還包含描述每個鎖的一行,該鎖在等待給定行或表的鎖佇列中。Performance Schema data_lock_waits 表顯示事務已持有的鎖阻塞了其他事務請求的鎖。

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-internal-data.html

17.15.2.3 InnoDB 事務和鎖資訊的永續性和一致性

注意

本節描述了由效能模式 data_locksdata_lock_waits 表公開的鎖資訊,這些表在 MySQL 8.0 中取代了 INFORMATION_SCHEMA INNODB_LOCKSINNODB_LOCK_WAITS 表。有關以舊的 INFORMATION_SCHEMA 表為基礎的類似討論,請參閱 InnoDB 事務和鎖資訊的永續性和一致性,在 MySQL 5.7 參考手冊 中。

事務和鎖定表(INFORMATION_SCHEMA INNODB_TRX 表,效能模式 data_locksdata_lock_waits 表)公開的資料代表了對快速變化資料的一瞥。這不像使用者表,其中資料僅在應用程式發起的更新發生時才會更改。底層資料是內部系統管理的資料,可以非常快速地更改:

  • INNODB_TRXdata_locksdata_lock_waits 表之間的資料可能不一致。

    data_locksdata_lock_waits 表公開了來自 InnoDB 儲存引擎的實時資料,提供有關 INNODB_TRX 表中事務的鎖資訊。從鎖表中檢索的資料存在於執行 SELECT 時,但在查詢結果被客戶端消耗時可能已經消失或更改。

    data_locksdata_lock_waits連線可以顯示在data_lock_waits中標識不再存在或尚不存在的data_locks中的父行的行。

  • 事務和鎖定表中的資料可能與INFORMATION_SCHEMA PROCESSLIST表或效能模式threads表中的資料不一致。

    例如,當比較InnoDB事務和鎖定表中的資料與PROCESSLIST表中的資料時,應該小心。即使您發出單個SELECT(例如連線INNODB_TRXPROCESSLIST),這些表的內容通常不一致。INNODB_TRX可能引用PROCESSLIST中不存在的行,或者當前執行的事務中INNODB_TRX.TRX_QUERY顯示的 SQL 查詢與PROCESSLIST.INFO中的查詢不同。

17.15.3 InnoDB INFORMATION_SCHEMA 模式物件表

原文:dev.mysql.com/doc/refman/8.0/en/innodb-information-schema-system-tables.html

您可以使用InnoDB INFORMATION_SCHEMA表提取關於由InnoDB管理的模式物件的後設資料。這些資訊來自資料字典。傳統上,您可以使用第 17.17 節“InnoDB 監視器”中的技術,設定InnoDB監視器並解析SHOW ENGINE INNODB STATUS語句的輸出來獲取此型別的資訊。InnoDB INFORMATION_SCHEMA表介面允許您使用 SQL 查詢這些資料。

InnoDB INFORMATION_SCHEMA模式物件表包括下面列出的表。

INNODB_DATAFILES
INNODB_TABLESTATS
INNODB_FOREIGN
INNODB_COLUMNS
INNODB_INDEXES
INNODB_FIELDS
INNODB_TABLESPACES
INNODB_TABLESPACES_BRIEF
INNODB_FOREIGN_COLS
INNODB_TABLES

表名反映��提供的資料型別:

  • INNODB_TABLES提供了關於InnoDB表的後設資料。

  • INNODB_COLUMNS提供了關於InnoDB表列的後設資料。

  • INNODB_INDEXES提供了關於InnoDB索引的後設資料。

  • INNODB_FIELDS提供了關於InnoDB索引的關鍵列(欄位)的後設資料。

  • INNODB_TABLESTATS提供了關於InnoDB表的低階狀態資訊的檢視,這些資訊是從記憶體資料結構中派生的。

  • INNODB_DATAFILES提供了InnoDB檔案表和通用表空間的資料檔案路徑資訊。

  • INNODB_TABLESPACES提供了關於InnoDB檔案表、通用表和撤銷表空間的後設資料。

  • INNODB_TABLESPACES_BRIEF提供了關於InnoDB表空間的部分後設資料。

  • INNODB_FOREIGN提供了關於在InnoDB表上定義的外來鍵的後設資料。

  • INNODB_FOREIGN_COLS提供了關於在InnoDB表上定義的外來鍵列的後設資料。

InnoDB INFORMATION_SCHEMA模式物件表可以透過TABLE_IDINDEX_IDSPACE等欄位進行連線,使您可以輕鬆檢索要研究或監視的物件的所有可用資料。

參考InnoDB INFORMATION_SCHEMA 文件,瞭解每個表的列資訊。

示例 17.2 InnoDB INFORMATION_SCHEMA 模式物件表

本示例使用一個簡單的表(t1)和一個單一索引(i1)來演示在InnoDB INFORMATION_SCHEMA模式物件表中找到的後設資料型別。

  1. 建立一個測試資料庫和表t1

    mysql> CREATE DATABASE test;
    
    mysql> USE test;
    
    mysql> CREATE TABLE t1 (
           col1 INT,
           col2 CHAR(10),
           col3 VARCHAR(10))
           ENGINE = InnoDB;
    
    mysql> CREATE INDEX i1 ON t1(col1);
    
  2. 建立表t1後,查詢INNODB_TABLES以查詢test/t1的後設資料:

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME='test/t1' \G
    *************************** 1\. row ***************************
         TABLE_ID: 71
             NAME: test/t1
             FLAG: 1
           N_COLS: 6
            SPACE: 57
       ROW_FORMAT: Compact
    ZIP_PAGE_SIZE: 0
     INSTANT_COLS: 0
    

    t1TABLE_ID為 71。FLAG欄位提供有關表格式和儲存特性的位級資訊。共有六列,其中三列是由InnoDB建立的隱藏列(DB_ROW_IDDB_TRX_IDDB_ROLL_PTR)。表的SPACE的 ID 為 57(值為 0 表示表位於系統表空間中)。ROW_FORMAT為 Compact。ZIP_PAGE_SIZE僅適用於具有Compressed行格式的表。INSTANT_COLS顯示在使用ALTER TABLE ... ADD COLUMN新增第一個即時列之前表中的列數。

  3. 使用INNODB_TABLES中的TABLE_ID資訊,查詢INNODB_COLUMNS表以獲取有關表列的資訊。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS where TABLE_ID = 71\G
    *************************** 1\. row ***************************
         TABLE_ID: 71
             NAME: col1
              POS: 0
            MTYPE: 6
           PRTYPE: 1027
              LEN: 4
      HAS_DEFAULT: 0
    DEFAULT_VALUE: NULL
    *************************** 2\. row ***************************
         TABLE_ID: 71
             NAME: col2
              POS: 1
            MTYPE: 2
           PRTYPE: 524542
              LEN: 10
      HAS_DEFAULT: 0
    DEFAULT_VALUE: NULL
    *************************** 3\. row ***************************
         TABLE_ID: 71
             NAME: col3
              POS: 2
            MTYPE: 1
           PRTYPE: 524303
              LEN: 10
      HAS_DEFAULT: 0
    DEFAULT_VALUE: NULL
    

    除了TABLE_ID和列NAME之外,INNODB_COLUMNS還提供每列的序數位置(從 0 開始遞增順序),列MTYPE或“主型別”(6 = INT,2 = CHAR,1 = VARCHAR),PRTYPE或“精確型別”(一個二進位制值,其中的位表示 MySQL 資料型別、字符集程式碼和可空性),以及列長度(LEN)。HAS_DEFAULTDEFAULT_VALUE列僅適用於使用ALTER TABLE ... ADD COLUMN立即新增的列。

  4. 再次使用INNODB_TABLES中的TABLE_ID資訊,查詢INNODB_INDEXES以獲取與表t1關聯的索引資訊。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_INDEXES WHERE TABLE_ID = 71 \G
    *************************** 1\. row ***************************
           INDEX_ID: 111
               NAME: GEN_CLUST_INDEX
           TABLE_ID: 71
               TYPE: 1
           N_FIELDS: 0
            PAGE_NO: 3
              SPACE: 57
    MERGE_THRESHOLD: 50
    *************************** 2\. row ***************************
           INDEX_ID: 112
               NAME: i1
           TABLE_ID: 71
               TYPE: 0
           N_FIELDS: 1
            PAGE_NO: 4
              SPACE: 57
    MERGE_THRESHOLD: 50
    

    INNODB_INDEXES返回兩個索引的資料。第一個索引是GEN_CLUST_INDEX,如果表沒有使用者定義的聚簇索引,則InnoDB會建立一個聚簇索引。第二個索引(i1)是使用者定義的二級索引。

    INDEX_ID是一個在例項中所有資料庫中唯一的索引識別符號。TABLE_ID標識與索引關聯的表。索引TYPE值表示索引型別(1 = 聚簇索引,0 = 二級索引)。N_FILEDS值是組成索引的欄位數。PAGE_NO是索引 B 樹的根頁號,SPACE是索引所在的表空間的 ID。非零值表示索引不位於系統表空間中。MERGE_THRESHOLD定義了索引頁中資料量的百分比閾值。如果索引頁中的資料量低於此值(預設為 50%),當刪除行或透過更新操作縮短行時,InnoDB會嘗試將索引頁與相鄰的索引頁合併。

  5. 使用INNODB_INDEXES中的INDEX_ID資訊,查詢INNODB_FIELDS以獲取索引i1的欄位資訊。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FIELDS where INDEX_ID = 112 \G
    *************************** 1\. row ***************************
    INDEX_ID: 112
        NAME: col1
         POS: 0
    

    INNODB_FIELDS提供索引欄位的NAME和其在索引中的序號位置。如果索引(i1)是在多個欄位上定義的,INNODB_FIELDS將為每個索引欄位提供後設資料。

  6. 使用INNODB_TABLES中的SPACE資訊,查詢INNODB_TABLESPACES表以獲取有關表的表空間的資訊。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE SPACE = 57 \G
    *************************** 1\. row ***************************
              SPACE: 57
              NAME: test/t1
              FLAG: 16417
        ROW_FORMAT: Dynamic
         PAGE_SIZE: 16384
     ZIP_PAGE_SIZE: 0
        SPACE_TYPE: Single
     FS_BLOCK_SIZE: 4096
         FILE_SIZE: 114688
    ALLOCATED_SIZE: 98304
    AUTOEXTEND_SIZE: 0
    SERVER_VERSION: 8.0.23
     SPACE_VERSION: 1
        ENCRYPTION: N
             STATE: normal
    

    除了表空間的SPACE ID 和關聯表的NAME之外,INNODB_TABLESPACES提供表空間FLAG資料,這是關於表空間格式和儲存特性的位級資訊。還提供了表空間ROW_FORMATPAGE_SIZE以及其他幾個表空間後設資料項。

  7. 再次使用INNODB_TABLES中的SPACE資訊,查詢INNODB_DATAFILES以獲取表空間資料檔案的位置。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_DATAFILES WHERE SPACE = 57 \G
    *************************** 1\. row ***************************
    SPACE: 57
     PATH: ./test/t1.ibd
    

    資料檔案位於 MySQL 的data目錄下的test目錄中。如果在 MySQL 資料目錄之外的位置使用CREATE TABLE語句的DATA DIRECTORY子句建立了 file-per-table 表空間,則表空間PATH將是一個完全限定的目錄路徑。

  8. 最後一步,向表t1TABLE_ID = 71)插入一行資料,並檢視INNODB_TABLESTATS表中的資料。此表中的資料由 MySQL 最佳化器用於計算在查詢InnoDB表時使用哪個索引。這些資訊來自記憶體資料結構。

    mysql> INSERT INTO t1 VALUES(5, 'abc', 'def');
    Query OK, 1 row affected (0.06 sec)
    
    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLESTATS where TABLE_ID = 71 \G
    *************************** 1\. row ***************************
             TABLE_ID: 71
                 NAME: test/t1
    STATS_INITIALIZED: Initialized
             NUM_ROWS: 1
     CLUST_INDEX_SIZE: 1
     OTHER_INDEX_SIZE: 0
     MODIFIED_COUNTER: 1
              AUTOINC: 0
            REF_COUNT: 1
    

    STATS_INITIALIZED欄位指示表是否已收集統計資訊。NUM_ROWS是表中當前估計的行數。CLUST_INDEX_SIZEOTHER_INDEX_SIZE欄位分別報告儲存表的聚集索引和輔助索引的磁碟上的頁面數。MODIFIED_COUNTER值顯示被 DML 操作和外來鍵級聯操作修改的行數。AUTOINC值是任何自增操作即將發行的下一個數字。在表t1上沒有定義自增列,因此該值為 0。REF_COUNT值是一個計數器。當計數器達到 0 時,表示表後設資料可以從表快取中驅逐。

示例 17.3 外來鍵 INFORMATION_SCHEMA 模式物件表

INNODB_FOREIGNINNODB_FOREIGN_COLS表提供有關外來鍵關係的資料。此示例使用具有外來鍵關係的父表和子表來演示在INNODB_FOREIGNINNODB_FOREIGN_COLS表中找到的資料。

  1. 建立具有父表和子表的測試資料庫:

    mysql> CREATE DATABASE test;
    
    mysql> USE test;
    
    mysql> CREATE TABLE parent (id INT NOT NULL,
           PRIMARY KEY (id)) ENGINE=INNODB;
    
    mysql> CREATE TABLE child (id INT, parent_id INT,
           INDEX par_ind (parent_id),
           CONSTRAINT fk1
           FOREIGN KEY (parent_id) REFERENCES parent(id)
           ON DELETE CASCADE) ENGINE=INNODB;
    
  2. 建立父表和子表後,查詢INNODB_FOREIGN並找到test/childtest/parent外來鍵關係的外來鍵資料:

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FOREIGN \G
    *************************** 1\. row ***************************
          ID: test/fk1
    FOR_NAME: test/child
    REF_NAME: test/parent
      N_COLS: 1
        TYPE: 1
    

    後設資料包括外來鍵IDfk1),該外來鍵是在子表上定義的CONSTRAINT的名稱。FOR_NAME是定義外來鍵的子表的名稱。REF_NAME是父表(“被引用”表)的名稱。N_COLS是外來鍵索引中的列數。TYPE是表示有關外來鍵列的其他資訊的位標誌的數值。在這種情況下,TYPE值為 1,表示為外來鍵指定了ON DELETE CASCADE選項。有關TYPE值的更多資訊,請參閱INNODB_FOREIGN表定義。

  3. 使用外來鍵ID,查詢INNODB_FOREIGN_COLS以檢視有關外來鍵列的資料。

    mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FOREIGN_COLS WHERE ID = 'test/fk1' \G
    *************************** 1\. row ***************************
              ID: test/fk1
    FOR_COL_NAME: parent_id
    REF_COL_NAME: id
             POS: 0
    

    FOR_COL_NAME是子表中外來鍵列的名稱,REF_COL_NAME是父表中引用列的名稱。POS值是外來鍵索引中鍵欄位的序數位置,從零開始。

示例 17.4 連線 InnoDB INFORMATION_SCHEMA 模式物件表

此示例演示了連線三個InnoDB INFORMATION_SCHEMA模式物件表(INNODB_TABLESINNODB_TABLESPACESINNODB_TABLESTATS)以收集有關員工示例資料庫中表的檔案格式、行格式、頁面大小和索引大小資訊。

以下表別名用於縮短查詢字串:

  • INFORMATION_SCHEMA.INNODB_TABLES:a

  • INFORMATION_SCHEMA.INNODB_TABLESPACES:b

  • INFORMATION_SCHEMA.INNODB_TABLESTATS:c

使用IF()控制流函式來處理壓縮表。如果表被壓縮,索引大小將使用ZIP_PAGE_SIZE而不是PAGE_SIZE來計算。CLUST_INDEX_SIZEOTHER_INDEX_SIZE以位元組報告,透過1024*1024除以以提供以兆位元組(MB)為單位的索引大小。MB 值使用ROUND()函式四捨五入到零位小數。

mysql> SELECT a.NAME, a.ROW_FORMAT,
        @page_size :=
         IF(a.ROW_FORMAT='Compressed',
          b.ZIP_PAGE_SIZE, b.PAGE_SIZE)
          AS page_size,
         ROUND((@page_size * c.CLUST_INDEX_SIZE)
          /(1024*1024)) AS pk_mb,
         ROUND((@page_size * c.OTHER_INDEX_SIZE)
          /(1024*1024)) AS secidx_mb
       FROM INFORMATION_SCHEMA.INNODB_TABLES a
       INNER JOIN INFORMATION_SCHEMA.INNODB_TABLESPACES b on a.NAME = b.NAME
       INNER JOIN INFORMATION_SCHEMA.INNODB_TABLESTATS c on b.NAME = c.NAME
       WHERE a.NAME LIKE 'employees/%'
       ORDER BY a.NAME DESC;
+------------------------+------------+-----------+-------+-----------+
| NAME                   | ROW_FORMAT | page_size | pk_mb | secidx_mb |
+------------------------+------------+-----------+-------+-----------+
| employees/titles       | Dynamic    |     16384 |    20 |        11 |
| employees/salaries     | Dynamic    |     16384 |    93 |        34 |
| employees/employees    | Dynamic    |     16384 |    15 |         0 |
| employees/dept_manager | Dynamic    |     16384 |     0 |         0 |
| employees/dept_emp     | Dynamic    |     16384 |    12 |        10 |
| employees/departments  | Dynamic    |     16384 |     0 |         0 |
+------------------------+------------+-----------+-------+-----------+

相關文章