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:初始化
在初始化階段,伺服器確定操作期間允許多少併發性,考慮到儲存引擎的能力、語句中指定的操作以及使用者指定的
ALGORITHM
和LOCK
選項。在此階段,會獲取一個共享可升級的後設資料鎖以保護當前表定義。 -
階段 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=INSTANT
、ALGORITHM=INPLACE
和ALGORITHM=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 操作之前,請按以下方式檢查操作是快還是慢:
-
克隆表結構。
-
使用少量資料填充克隆表。
-
在克隆表上執行 DDL 操作。
-
檢查“受影響行數”值是否為零。非零值表示操作複製表資料,這可能需要特殊規劃。例如,您可以在計劃的停機期間執行 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=COPY
或old_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
子句指定了一個低程度的鎖定(SHARED
或NONE
),這與特定型別的 DDL 操作不相容。 -
在等待對錶的獨佔鎖時發生超時,這可能在 DDL 操作的初始和最終階段短暫需要。
-
當 MySQL 在索引建立過程中在磁碟上寫入臨時排序檔案時,
tmpdir
或innodb_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...CASCADE
或ON...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 之前建立的包含時間列(
DATE
、DATETIME
或TIMESTAMP
)且未使用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_file
和 component_keyring_encrypted_file
元件,以及 keyring_file
和 keyring_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_file
或component_keyring_encrypted_file
元件,或者keyring_file
或keyring_encrypted_file
外掛,在建立第一個加密表空間後立即建立金鑰環資料檔案的備份,在主金鑰輪換之前和之後。對於每個元件,其配置檔案指示資料檔案位置。keyring_file_data
配置選項定義了keyring_file
外掛的金鑰環資料檔案位置。keyring_encrypted_file_data
配置選項定義了keyring_encrypted_file
外掛的金鑰環資料檔案位置。如果您使用keyring_okv
或keyring_aws
外掛,請確保已執行必要的配置。有關說明,請參見 Section 8.4.4,“MySQL 金鑰環”。
為模式和常規表空間定義加密預設值
從 MySQL 8.0.16 開始,default_table_encryption
系統變數定義了模式和常規表空間的預設加密設定。在未明確指定ENCRYPTION
子句時,CREATE TABLESPACE
和CREATE SCHEMA
操作將應用default_table_encryption
設定。
ALTER SCHEMA
和ALTER 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_file
或keyring_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 TABLE
或ALTER TABLE
語句中指定ENCRYPTION
選項時,它將記錄在INFORMATION_SCHEMA.TABLES
的CREATE_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_ESTIMATED
和WORK_COMPLETED
資訊。
以下示例演示瞭如何啟用stage/innodb/alter tablespace (encryption)
階段事件工具和相關消費者表,以監視通用表空間或mysql
系統表空間的加密進度。有關效能模式階段事件工具和相關消費者的資訊,請參閱第 29.12.5 節,“效能模式階段事件表”。
-
啟用
stage/innodb/alter tablespace (encryption)
工具:mysql> USE performance_schema; mysql> UPDATE setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/alter tablespace (encryption)';
-
啟用包括
events_stages_current
、events_stages_history
和events_stages_history_long
的階段事件消費者表。mysql> UPDATE setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
-
執行表空間加密操作。在此示例中,一個名為
ts1
的通用表空間被加密。mysql> ALTER TABLESPACE ts1 ENCRYPTION = 'Y';
-
透過查詢效能模式
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
操作,不需要重新構建駐留在表空間中的表。 -
如果一個表同時使用
COMPRESSION
和ENCRYPTION
選項建立,壓縮會在表空間資料加密之前執行。 -
如果一個金鑰環資料檔案(由
keyring_file_data
或keyring_encrypted_file_data
命名的檔案)為空或丟失,第一次執行ALTER INSTANCE ROTATE INNODB MASTER KEY
將建立一個主加密金鑰。 -
解除安裝
component_keyring_file
或component_keyring_encrypted_file
元件不會刪除現有的金鑰環資料檔案。解除安裝keyring_file
或keyring_encrypted_file
外掛不會刪除現有的金鑰環資料檔案。 -
建議不要將金鑰環資料檔案放在與表空間資料檔案相同的目錄下。
-
在執行時或重新啟動伺服器時修改
keyring_file_data
或keyring_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_encrypt
和innodb_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_index
或skip_innodb_adaptive_hash_index
。 -
一些變數描述涉及“啟用”或“禁用”變數。這些變數可以透過將它們設定為
ON
或1
來使用SET
語句啟用,或透過將它們設定為OFF
或0
來禁用。布林變數可以在啟動時設定為ON
、TRUE
、OFF
和FALSE
(不區分大小寫),以及1
和0
的值。參見第 6.2.2.4 節,“程式選項修飾符”。 -
���受數值的系統變數���以在命令列上指定為
--*
var_name*=*
value*
,也可以在選項檔案中指定為*
var_name*=*
value*
。 -
許多系統變數可以在執行時更改(參見第 7.1.9.2 節,“動態系統變數”)。
-
有關
GLOBAL
和SESSION
變數範圍修飾符的資訊,請參考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
。此選項具有三態格式,可能的值為OFF
、ON
或FORCE
。請參閱 第 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
選項啟動 mysqld。InnoDB
在伺服器正常關閉時會刪除該檔案。如果發生異常關閉,則可能需要手動刪除狀態檔案。--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寫操作,例如
add
、set
和incr
。與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 請求行鎖用於get
和set
操作。當啟用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_size
,innodb_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_shutdown
和innodb_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
會觸發記錄操作,但不會改變變數設定,該設定始終保持OFF
或0
。要在觸發轉儲後檢視緩衝池轉儲狀態,請查詢Innodb_buffer_pool_dump_status
變數。啟用
innodb_buffer_pool_dump_now
會觸發轉儲操作,但不會改變變數設定,該設定始終保持OFF
或0
。要在觸發轉儲後檢視緩衝池轉儲狀態,請查詢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_shutdown
或innodb_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_instances
和innodb_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|ON}]
系統變數 innodb_buffer_pool_load_abort
範圍 全域性 動態 是 SET_VAR
提示適用否 型別 布林值 預設值 OFF
中斷由
innodb_buffer_pool_load_at_startup
或innodb_buffer_pool_load_now
觸發的InnoDB
緩衝池內容恢復過程。啟用
innodb_buffer_pool_load_abort
會觸發中止操作,但不會改變變數設定,其始終保持為OFF
或0
。要在觸發中止操作後檢視緩衝池載入狀態,請查詢Innodb_buffer_pool_load_status
變數。有關更多資訊,請參見第 17.8.3.6 節,“儲存和恢復緩衝池狀態”。
-
innodb_buffer_pool_load_at_startup
命令列格式 --innodb-buffer-pool-load-at-startup[={OFF|ON}]
系統變數 innodb_buffer_pool_load_at_startup
範圍 全域性 動態 否 SET_VAR
提示適用否 型別 布林值 預設值 ON
指定在 MySQL 伺服器啟動時,
InnoDB
緩衝池會自動透過載入先前儲存的頁面來預熱。通常與innodb_buffer_pool_dump_at_shutdown
一起使用。innodb_buffer_pool_dump_at_shutdown
和innodb_buffer_pool_load_at_startup
預設啟用。有關更多資訊,請參見第 17.8.3.6 節,“儲存和恢復緩衝池狀態”。
-
innodb_buffer_pool_load_now
命令列格式 --innodb-buffer-pool-load-now[={OFF|ON}]
系統變數 innodb_buffer_pool_load_now
範圍 全域性 動態 是 SET_VAR
提示適用否 型別 布林值 預設值 OFF
透過載入資料頁立即 預熱
InnoDB
緩衝池,無需等待伺服器重新啟動。在進行基準測試期間,或在執行報告或維護查詢後準備 MySQL 伺服器恢復其正常工作負載時,這可能很有用。啟用
innodb_buffer_pool_load_now
觸發載入操作,但不會改變變數設定,變數始終保持OFF
或0
。在觸發載入後檢視緩衝池載入進度,請查詢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|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 讀取。校驗演算法的嚴格形式在表空間中遇到有效但不匹配的校驗和值時會報錯。建議您只在新例項中使用嚴格設定,首次設定表空間。嚴格設定略快,因為在磁碟讀取期間不需要計算所有校驗和值。
以下表格顯示了
none
、innodb
和crc32
選項值及其嚴格對應項之間的區別。none
、innodb
和crc32
將指定型別的校驗和值寫入每個資料塊,但在驗證讀取操作期間的塊時,也接受其他校驗和值以確保相容性。嚴格設定還接受有效的校驗和值,但在遇到有效但不匹配的校驗和值時會列印錯誤訊息。如果例項中的所有InnoDB
資料檔案都是在相同的innodb_checksum_algorithm
值下建立的,則使用嚴格形式可以使驗證更快。表 17.26 允許的 innodb_checksum_algorithm 值
值 生成的校驗和(寫入時) 允許的校驗和(讀取時) none 一個常數值。 由 none
、innodb
或crc32
生成的任何校驗和。innodb 使用 InnoDB
原始演算法在軟體中計算的校驗和。由 none
、innodb
或crc32
生成的任何校驗和。crc32 使用 crc32
演算法計算的校驗和,可能使用硬體輔助完成。由 none
、innodb
或crc32
生成的任何校驗和。strict_none 一個常數值 由 none
、innodb
或crc32
生成的任何校驗和。如果遇到有效但不匹配的校驗和,InnoDB
會列印錯誤訊息。strict_innodb 使用 InnoDB
原始演算法在軟體中計算的校驗和。由 none
、innodb
或crc32
生成的任何校驗和。如果遇到有效但不匹配的校驗和,InnoDB
會列印錯誤訊息。strict_crc32 使用 crc32
演算法計算的校驗和,可能使用硬體輔助完成。由 none
、innodb
或crc32
生成的任何校驗和。如果遇到有效但不匹配的校驗和,InnoDB
會列印錯誤訊息。 -
innodb_cmp_per_index_enabled
命令列格式 --innodb-cmp-per-index-enabled[={OFF|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*]]
檔案大小透過在大小值後附加
K
、M
或G
來指定為千位元組、兆位元組或千兆位元組。如果以千位元組指定資料檔案大小,請以 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|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|ON}]
系統變數 innodb_deadlock_detect
作用範圍 全域性 動態 是 SET_VAR
Hint Applies否 型別 布林值 預設值 ON
此選項用於禁用死鎖檢測。在高併發系統中,死鎖檢測可能導致大量執行緒等待同一鎖時減速。有時,更有效的做法是禁用死鎖檢測,並依賴於
innodb_lock_wait_timeout
設定在死鎖發生時進行事務回滾。有關更多資訊,請參閱第 17.7.5.2 節,“死鎖檢測”。
-
innodb_dedicated_server
命令列格式 --innodb-dedicated-server[={OFF|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_size
和innodb_log_files_in_group
。注意
innodb_log_file_size
和innodb_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
。其他允許的值為COMPACT
和REDUNDANT
。不支援在系統表空間中使用的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_dir
、innodb_undo_directory
和datadir
定義的目錄始終會在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|ON}]
系統變數 innodb_disable_sort_file_cache
作用範圍 全域性 動態 是 SET_VAR
提示適用否 型別 布林值 預設值 OFF
禁用合併排序臨時檔案的作業系統檔案系統快取。效果是以
O_DIRECT
的等效方式開啟這些檔案。 -
innodb_doublewrite
命令列格式 --innodb-doublewrite=value
(≥ 8.0.30)--innodb-doublewrite[={OFF|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
設定為ON
或OFF
以分別啟用或禁用雙寫緩衝,從 MySQL 8.0.30 開始,innodb_doublewrite
還支援DETECT_AND_RECOVER
和DETECT_ONLY
設定。DETECT_AND_RECOVER
設定與ON
設定相同。使用此設定,雙寫緩衝區完全啟用,資料庫頁面內容被寫入雙寫緩衝區,在恢復過程中訪問以修復不完整的頁面寫入。使用
DETECT_ONLY
設定時,只有後設資料被寫入雙寫緩衝區。資料庫頁面內容不會被寫入雙寫緩衝區,並且恢復不使用雙寫緩衝區來修復不完整的頁面寫入。此輕量級設定僅用於檢測不完整的頁面寫入。MySQL 8.0.30 及更高版本支援動態更改
innodb_doublewrite
設定,可以在ON
、DETECT_AND_RECOVER
和DETECT_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|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|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 樹葉子頁和非葉子頁。它不適用於用於TEXT
或BLOB
條目的外部頁。欲瞭解更多資訊,請參閱 第 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
秒(其中N
為1 ... 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
選項包括:-
fsync
或0
:InnoDB
使用fsync()
系統呼叫來重新整理資料和日誌檔案。fsync
是預設設定。 -
O_DSYNC
或1
:InnoDB
使用O_SYNC
來開啟和重新整理日誌檔案,並使用fsync()
來重新整理資料檔案。InnoDB
不直接使用O_DSYNC
,因為在許多 Unix 變種上存在問題。 -
littlesync
或2
:此選項用於內部效能測試,目前不受支援。請自行承擔風險。 -
nosync
或3
:此選項用於內部效能測試,目前不受支援。請自行承擔風險。 -
O_DIRECT
或4
:InnoDB
使用O_DIRECT
(或 Solaris 上的directio()
)來開啟資料檔案,並使用fsync()
來重新整理資料和日誌檔案。此選項適用於某些 GNU/Linux 版本、FreeBSD 和 Solaris。 -
O_DIRECT_NO_FSYNC
:InnoDB
在重新整理 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
選項包括:-
unbuffered
或0
:InnoDB
使用模擬非同步 I/O 和非緩衝 I/O。 -
normal
或1
:InnoDB
使用模擬非同步 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|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|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
會阻止INSERT
、UPDATE
或DELETE
操作。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_SCHEMA
表INNODB_FT_INDEX_TABLE
、INNODB_FT_INDEX_CACHE
、INNODB_FT_CONFIG
、INNODB_FT_DELETED
和INNODB_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|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|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 GLOBAL
或SET SESSION
語句在執行時設定。更改GLOBAL
設定需要足夠許可權來設定全域性系統變數(請參閱第 7.1.9.1 節,“系統變數許可權”),並影響隨後連線的所有客戶端的操作。任何客戶端都可以更改innodb_lock_wait_timeout
的SESSION
設定,這僅影響該客戶端。 -
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|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|ON}]
系統變數 innodb_log_checkpoint_now
範圍 全域性 動態 是 SET_VAR
提示適用否 型別 布林值 預設值 OFF
啟用此除錯選項以強制
InnoDB
寫入檢查點。此選項僅在使用WITH_DEBUG
CMake選項編譯時才可用。 -
innodb_log_checksums
命令列格式 --innodb-log-checksums[={OFF|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|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_size
和innodb_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_size
和innodb_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|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
定義了期望的最大清除延遲。如果超過此值,將對
INSERT
、UPDATE
和DELETE
操作施加延遲,以便清除趕上。預設值為 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|module|pattern|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|module|pattern|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|module|pattern|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|module|pattern|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|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|ON}]
系統變數 innodb_optimize_fulltext_only
範圍 全域性 動態 是 SET_VAR
提示適用否 型別 布林值 預設值 OFF
改變了
OPTIMIZE TABLE
在InnoDB
表上的操作方式。旨在在具有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 執行使用者授權。例如,如果 mysqld 在mysql
使用者下執行,則可以透過將以下行新增到/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
效能。InnoDB
在CHECK 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|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|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|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_ahead
和Innodb_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_threads
、innodb_write_io_threads
和 Linux 的aio-max-nr
設定執行多個 MySQL 伺服器(通常超過 12 個)可能超出系統限制。理想情況下,增加aio-max-nr
設定;作為解決方法,您可以減少一個或兩個 MySQL 變數的設定。 -
innodb_read_only
命令列格式 --innodb-read-only[={OFF|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 USER
和GRANT
失敗,因為授權表使用了InnoDB
。 -
INSTALL PLUGIN
和UNINSTALL PLUGIN
外掛管理語句失敗,因為mysql.plugin
系統表使用了InnoDB
。 -
CREATE FUNCTION
和DROP 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_group
和innodb_log_file_size
變數。當定義了innodb_redo_log_capacity
設定時,innodb_log_files_in_group
和innodb_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|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|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|ON}]
系統變數 innodb_stats_auto_recalc
範圍 全域性 動態 是 SET_VAR
提示適用否 型別 布林值 預設值 ON
導致
InnoDB
在表中的資料發生重大更改後自動重新計算永續性統計資訊。閾值為表中行數的 10%。此設定適用於啟用innodb_stats_persistent
選項時建立的表。還可以透過在CREATE TABLE
或ALTER TABLE
語句中指定STATS_PERSISTENT=1
來配置自動統計資訊重新計算。用於生成統計資訊的取樣資料量由innodb_stats_persistent_sample_pages
變數控制。更多資訊,請參閱第 17.8.10.1 節,“配置永續性最佳化器統計引數”。
-
innodb_stats_include_delete_marked
命令列格式 --innodb-stats-include-delete-marked[={OFF|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_equal
、nulls_unequal
和nulls_ignored
。對於nulls_equal
,所有NULL
索引值被視為相等,並形成一個大小等於NULL
值數量的值組。對於nulls_unequal
,NULL
值被視為不相等,每個NULL
形成一個大小為 1 的獨立值組。對於nulls_ignored
,NULL
值被忽略。生成表統計資訊的方法會影響最佳化器選擇查詢執行時使用的索引,詳見第 10.3.8 節,“InnoDB 和 MyISAM 索引統計資訊收集”。
-
innodb_stats_on_metadata
命令列格式 --innodb-stats-on-metadata[={OFF|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
)或訪問資訊模式TABLES
或STATISTICS
表時更新非永續性統計資訊。(這些更新類似於ANALYZE TABLE
的操作。)禁用時,InnoDB
在這些操作期間不會更新統計資訊。保持禁用設定可以提高對具有大量表或索引的模式的訪問速度。它還可以改善涉及InnoDB
表的查詢的執行計劃的穩定性。要更改設定,請發出語句
SET GLOBAL innodb_stats_on_metadata=*
mode*
,其中*
mode*
為ON
或OFF
(或1
或0
)。更改設定需要足夠設定全域性系統變數的許可權(請參閱第 7.1.9.1 節,“系統變數許可權”),並立即影響所有連線的操作。 -
innodb_stats_persistent
命令列格式 --innodb-stats-persistent[={OFF|ON}]
系統變數 innodb_stats_persistent
範圍 全域性 動態 是 SET_VAR
提示適用否 型別 布林 預設值 ON
指定
InnoDB
索引統計資訊是否持久化到磁碟。否則,統計資訊可能會經常重新計算,這可能導致查詢執行計劃的變化。此設定在建立表時與每個表一起儲存。您可以在建立表之前在全域性級別設定innodb_stats_persistent
,或者使用CREATE TABLE
和ALTER 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 TABLE
時InnoDB
表的 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_SIZE
、ROW_FORMAT
、DATA DIRECTORY
、TEMPORARY
和TABLESPACE
選項是否與彼此和其他設定相容。innodb_strict_mode=ON
還在建立或更改表時啟用行大小檢查,以防止由於記錄對所選頁面大小過大而導致INSERT
或UPDATE
失敗。您可以在啟動
mysqld時在命令列上啟用或禁用
innodb_strict_mode,或者在 MySQL 配置檔案中啟用或禁用
innodb_strict_mode。您還可以使用語句
SET [GLOBAL|SESSION] innodb_strict_mode=mode
在執行時啟用或禁用
innodb_strict_mode,其中
mode
為
ON或
OFF。更改
GLOBAL設定需要具有足夠許可權設定全域性系統變數的許可權(請參閱 Section 7.1.9.1, “系統變數許可權”),並影響隨後連線的所有客戶端的操作。任何客戶端都可以更改
innodb_strict_mode的
SESSION設定,該設定僅影響該客戶端。
從 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 AppliesNo 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 AppliesNo 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 AppliesNo Type Boolean Default Value ON
如果
autocommit = 0
,InnoDB
會遵守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。全域性臨時表空間資料檔案規範的語法包括檔名、檔案大小以及
autoextend
和max
屬性���*file_name*:*file_size*[:autoextend[:max:*max_file_size*]]
全域性臨時表空間資料檔案的名稱不能與另一個
InnoDB
資料檔案相同。任何無法建立全域性臨時表空間資料檔案或出現錯誤的情況都被視為致命,伺服器啟動將被拒絕。檔案大小透過在大小值後附加
K
、M
或G
來指定為 KB、MB 或 GB。檔案大小之和必須略大於 12MB。單個檔案的大小限制由作業系統確定。在支援大檔案的作業系統上,檔案大小可以超過 4GB。不支援使用原始磁碟分割槽用於全域性臨時表空間資料檔案。
autoextend
和max
屬性只能用於在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_dir
和innodb_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 AppliesNo 型別 目錄名稱 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 AppliesNo 型別 整數 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_001
和innodb_undo_002
)始終駐留在由innodb_undo_directory
變數定義的目錄中。使用
CREATE UNDO TABLESPACE
語法建立的撤銷表空間將在由innodb_undo_directory
變數定義的目錄中建立,如果沒有指定不同的路徑。更多資訊,請參閱第 17.6.3.4 節,“撤銷表空間”。
-
innodb_undo_log_encrypt
| 命令列格式 |
--innodb-undo-log-encrypt[={OFF|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|ON}]
|引入版本 8.0.26 系統變數 innodb_use_fdatasync
範圍 全域性 動態 是 SET_VAR
提示適用否 型別 布林值 預設值 OFF
在支援
fdatasync()
系統呼叫的平臺上,啟用innodb_use_fdatasync
變數允許使用fdatasync()
而不是fsync()
系統呼叫進行作業系統重新整理。fdatasync()
呼叫不會重新整理檔案後設資料,除非需要進行後續資料檢索,從而提供潛在的效能優勢。一些
innodb_flush_method
設定的子集,如fsync
、O_DSYNC
和O_DIRECT
使用fsync()
系統呼叫。在使用這些設定時,innodb_use_fdatasync
變數是適用的。` -
innodb_use_native_aio
| 命令列格式 |
--innodb-use-native-aio[={OFF|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_threads
,innodb_write_io_threads
,以及 Linuxaio-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_CMP
和INNODB_CMP_RESET
提供有關壓縮操作次數和執行壓縮所花費時間的資訊。 -
INNODB_CMPMEM
和INNODB_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_CMP
和 INNODB_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_CMPMEM
和INNODB_CMPMEM_RESET
表提供有關位於緩衝池中的壓縮頁面的狀態資訊。請參閱第 17.9 節,“InnoDB 表和頁面壓縮”以獲取有關壓縮表和緩衝池使用的更多資訊。INNODB_CMP
和INNODB_CMP_RESET
表應提供有關壓縮的更有用的統計資訊。
內部細節
InnoDB
使用一個 buddy allocator 系統來管理分配給各種大小的頁面的記憶體,從 1KB 到 16KB。這裡描述的兩個表的每一行對應一個單獨的頁面大小。
INNODB_CMPMEM
和INNODB_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_CMP
,INNODB_CMP_PER_INDEX
和INNODB_CMPMEM
)。
以下表格顯示了在輕量級工作負載下INFORMATION_SCHEMA.INNODB_CMP
的內容。緩衝池中唯一包含的壓縮頁大小為 8K。自統計資料重置以來,壓縮或解壓頁的時間不到一秒,因為COMPRESS_TIME
和UNCOMPRESS_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_locks
和 data_lock_waits
表公開的鎖定資訊,這些表在 MySQL 8.0 中取代了INFORMATION_SCHEMA
INNODB_LOCKS
和 INNODB_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_STATE
為RUNNING
,LOCK WAIT
,ROLLING BACK
或COMMITTING
)。 -
每個在 InnoDB 中等待另一個事務釋放鎖的事務(
INNODB_TRX.TRX_STATE
為LOCK 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_locks
和data_lock_waits
表公開的鎖定資訊,這些表在 MySQL 8.0 中取代了INFORMATION_SCHEMA
中的INNODB_LOCKS
和INNODB_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 idA5
,執行緒7
)都在等待會話 A(trx idA3
,執行緒5
)。 -
會話 C 正在等待會話 B 以及會話 A。
你可以在INFORMATION_SCHEMA
的INNODB_TRX
表以及效能模式的data_locks
和data_lock_waits
表中檢視底層資料。
以下表格顯示了INNODB_TRX
表的一些示例內容。
事務 ID | 事務狀態 | 事務開始時間 | 請求鎖 ID | 等待開始時間 | 權重 | MySQL 執行緒 ID | 查詢語句 |
---|---|---|---|---|---|---|---|
A3 |
RUNNING |
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 值。在這種情況下,使用以下步驟確定阻塞查詢:
-
確定阻塞事務的程序列表 ID。在
sys.innodb_lock_waits
表中,阻塞事務的程序列表 ID 是blocking_pid
值。 -
使用
blocking_pid
,查詢 MySQL 效能模式的threads
表以確定阻塞事務的THREAD_ID
。例如,如果blocking_pid
為 6,則發出以下查詢:SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID = 6;
-
使用
THREAD_ID
,查詢效能模式events_statements_current
表以確定執行緒執行的最後一個查詢。例如,如果THREAD_ID
為 28,則發出此查詢:SELECT THREAD_ID, SQL_TEXT FROM performance_schema.events_statements_current WHERE THREAD_ID = 28\G
-
如果執行緒執行的最後一個查詢不足以確定為何保持鎖定,則可以查詢效能模式
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_locks
和data_lock_waits
表的輸出來自一個負載較重的系統。可以看到,有幾個事務正在執行。
下面的data_locks
和data_lock_waits
表顯示:
- 事務
77F
(執行INSERT
和INNODB_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 |
RUNNING |
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 |
RUNNING |
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_locks
和 data_lock_waits
表公開的鎖資訊,它們在 MySQL 8.0 中取代了INFORMATION_SCHEMA
INNODB_LOCKS
和 INNODB_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_locks
和 data_lock_waits
表公開的鎖資訊,這些表在 MySQL 8.0 中取代了 INFORMATION_SCHEMA
INNODB_LOCKS
和 INNODB_LOCK_WAITS
表。有關以舊的 INFORMATION_SCHEMA
表為基礎的類似討論,請參閱 InnoDB 事務和鎖資訊的永續性和一致性,在 MySQL 5.7 參考手冊 中。
事務和鎖定表(INFORMATION_SCHEMA
INNODB_TRX
表,效能模式 data_locks
和 data_lock_waits
表)公開的資料代表了對快速變化資料的一瞥。這不像使用者表,其中資料僅在應用程式發起的更新發生時才會更改。底層資料是內部系統管理的資料,可以非常快速地更改:
-
INNODB_TRX
、data_locks
和data_lock_waits
表之間的資料可能不一致。data_locks
和data_lock_waits
表公開了來自InnoDB
儲存引擎的實時資料,提供有關INNODB_TRX
表中事務的鎖資訊。從鎖表中檢索的資料存在於執行SELECT
時,但在查詢結果被客戶端消耗時可能已經消失或更改。將
data_locks
與data_lock_waits
連線可以顯示在data_lock_waits
中標識不再存在或尚不存在的data_locks
中的父行的行。 -
事務和鎖定表中的資料可能與
INFORMATION_SCHEMA
PROCESSLIST
表或效能模式threads
表中的資料不一致。例如,當比較
InnoDB
事務和鎖定表中的資料與PROCESSLIST
表中的資料時,應該小心。即使您發出單個SELECT
(例如連線INNODB_TRX
和PROCESSLIST
),這些表的內容通常不一致。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_ID
、INDEX_ID
和SPACE
等欄位進行連線,使您可以輕鬆檢索要研究或監視的物件的所有可用資料。
參考InnoDB
INFORMATION_SCHEMA 文件,瞭解每個表的列資訊。
示例 17.2 InnoDB INFORMATION_SCHEMA 模式物件表
本示例使用一個簡單的表(t1
)和一個單一索引(i1
)來演示在InnoDB
INFORMATION_SCHEMA
模式物件表中找到的後設資料型別。
-
建立一個測試資料庫和表
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);
-
建立表
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
表
t1
的TABLE_ID
為 71。FLAG
欄位提供有關表格式和儲存特性的位級資訊。共有六列,其中三列是由InnoDB
建立的隱藏列(DB_ROW_ID
、DB_TRX_ID
和DB_ROLL_PTR
)。表的SPACE
的 ID 為 57(值為 0 表示表位於系統表空間中)。ROW_FORMAT
為 Compact。ZIP_PAGE_SIZE
僅適用於具有Compressed
行格式的表。INSTANT_COLS
顯示在使用ALTER TABLE ... ADD COLUMN
新增第一個即時列之前表中的列數。 -
使用
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_DEFAULT
和DEFAULT_VALUE
列僅適用於使用ALTER TABLE ... ADD COLUMN
立即新增的列。 -
再次使用
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
會嘗試將索引頁與相鄰的索引頁合併。 -
使用
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
將為每個索引欄位提供後設資料。 -
使用
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_FORMAT
,PAGE_SIZE
以及其他幾個表空間後設資料項。 -
再次使用
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
將是一個完全限定的目錄路徑。 -
最後一步,向表
t1
(TABLE_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_SIZE
和OTHER_INDEX_SIZE
欄位分別報告儲存表的聚集索引和輔助索引的磁碟上的頁面數。MODIFIED_COUNTER
值顯示被 DML 操作和外來鍵級聯操作修改的行數。AUTOINC
值是任何自增操作即將發行的下一個數字。在表t1
上沒有定義自增列,因此該值為 0。REF_COUNT
值是一個計數器。當計數器達到 0 時,表示表後設資料可以從表快取中驅逐。
示例 17.3 外來鍵 INFORMATION_SCHEMA 模式物件表
INNODB_FOREIGN
和INNODB_FOREIGN_COLS
表提供有關外來鍵關係的資料。此示例使用具有外來鍵關係的父表和子表來演示在INNODB_FOREIGN
和INNODB_FOREIGN_COLS
表中找到的資料。
-
建立具有父表和子表的測試資料庫:
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;
-
建立父表和子表後,查詢
INNODB_FOREIGN
並找到test/child
和test/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
後設資料包括外來鍵
ID
(fk1
),該外來鍵是在子表上定義的CONSTRAINT
的名稱。FOR_NAME
是定義外來鍵的子表的名稱。REF_NAME
是父表(“被引用”表)的名稱。N_COLS
是外來鍵索引中的列數。TYPE
是表示有關外來鍵列的其他資訊的位標誌的數值。在這種情況下,TYPE
值為 1,表示為外來鍵指定了ON DELETE CASCADE
選項。有關TYPE
值的更多資訊,請參閱INNODB_FOREIGN
表定義。 -
使用外來鍵
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_TABLES
、INNODB_TABLESPACES
和INNODB_TABLESTATS
)以收集有關員工示例資料庫中表的檔案格式、行格式、頁面大小和索引大小資訊。
以下表別名用於縮短查詢字串:
-
INFORMATION_SCHEMA.INNODB_TABLES
:a -
INFORMATION_SCHEMA.INNODB_TABLESPACES
:b -
INFORMATION_SCHEMA.INNODB_TABLESTATS
:c
使用IF()
控制流函式來處理壓縮表。如果表被壓縮,索引大小將使用ZIP_PAGE_SIZE
而不是PAGE_SIZE
來計算。CLUST_INDEX_SIZE
和OTHER_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 |
+------------------------+------------+-----------+-------+-----------+