文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  LOCK_ORDER 工具

7.9.3 LOCK_ORDER 工具

MySQL 伺服器是一個多執行緒應用程式,它使用許多內部鎖定和與鎖定相關的基礎程式,例如互斥鎖、讀寫鎖(包括 prlock 和 sxlock)、條件以及檔案。在伺服器內,鎖定相關物件的集合會隨著新功能的實作和為效能改進而進行的程式碼重構而變更。與任何使用鎖定基礎程式的多執行緒應用程式一樣,當一次持有許多鎖時,總會存在執行期間遇到死鎖的風險。對於 MySQL 來說,死鎖的影響是災難性的,會導致完全喪失服務。

為了能夠偵測鎖定取得死鎖並強制執行執行階段執行不受其影響,MySQL 支援 LOCK_ORDER 工具。這能讓鎖定順序相依性圖表定義為伺服器設計的一部分,並讓伺服器執行階段檢查以確保鎖定取得是非循環的,且執行路徑符合圖表。

本節提供關於使用 LOCK_ORDER 工具的資訊,但僅限於基本層級。如需完整詳細資訊,請參閱 MySQL 伺服器 Doxygen 文件的「鎖定順序」章節,網址為 https://mysqldev.dev.org.tw/doc/index-other.html

LOCK_ORDER 工具適用於除錯伺服器,而非用於生產環境。

若要使用 LOCK_ORDER 工具,請遵循此程序

  1. 從原始碼建置 MySQL,並使用 -DWITH_LOCK_ORDER=ON CMake 選項設定,讓組建包含 LOCK_ORDER 工具。

    注意

    啟用 WITH_LOCK_ORDER 選項後,MySQL 組建需要 flex 程式。

  2. 若要使用已啟用的 LOCK_ORDER 工具執行伺服器,請在伺服器啟動時啟用 lock_order 系統變數。還有其他幾個用於 LOCK_ORDER 設定的系統變數也可供使用。

  3. 針對 MySQL 測試套件作業,mysql-test-run.pl 有一個 --lock-order 選項,可控制在測試案例執行期間是否啟用 LOCK_ORDER 工具。

假設 MySQL 已建置為包含 LOCK_ORDER 工具,以下說明的系統變數會設定 LOCK_ORDER 工具的運作。主要變數是 lock_order,它表示是否在執行階段啟用 LOCK_ORDER 工具。

  • 如果 lock_order 已停用 (預設值),則其他 LOCK_ORDER 系統變數不會有任何作用。

  • 如果 lock_order 已啟用,則其他系統變數會設定要啟用哪些 LOCK_ORDER 功能。

注意

一般來說,LOCK_ORDER 工具的設定方式是使用 --lock-order 選項執行 mysql-test-run.pl,並讓 mysql-test-run.plLOCK_ORDER 系統變數設定為適當的值。

所有 LOCK_ORDER 系統變數都必須在伺服器啟動時設定。在執行階段,其值是可見的,但無法變更。

有些系統變數會成對存在,例如 lock_order_debug_looplock_order_trace_loop。對於這種成對的變數,當發生與它們相關的條件時,它們會以下列方式區分:

  • 如果啟用 _debug_ 變數,則會引發偵錯斷言。

  • 如果啟用 _trace_ 變數,則會在日誌中印出錯誤訊息。

表 7.8 LOCK_ORDER 系統變數摘要

變數名稱 變數類型 變數範圍
lock_order 布林值 全域
lock_order_debug_loop 布林值 全域
lock_order_debug_missing_arc 布林值 全域
lock_order_debug_missing_key 布林值 全域
lock_order_debug_missing_unlock 布林值 全域
lock_order_dependencies 檔案名稱 全域
lock_order_extra_dependencies 檔案名稱 全域
lock_order_output_directory 目錄名稱 全域
lock_order_print_txt 布林值 全域
lock_order_trace_loop 布林值 全域
lock_order_trace_missing_arc 布林值 全域
lock_order_trace_missing_key 布林值 全域
lock_order_trace_missing_unlock 布林值 全域

  • lock_order

    命令列格式 --lock-order[={OFF|ON}]
    系統變數 lock_order
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    是否在執行時啟用 LOCK_ORDER 工具。如果 lock_order 被停用(預設值),則其他 LOCK_ORDER 系統變數將不起作用。如果啟用 lock_order,則其他系統變數會配置要啟用的 LOCK_ORDER 功能。

    如果啟用 lock_order,當伺服器遇到鎖定獲取順序未在鎖定順序圖中宣告時,會引發錯誤。

  • lock_order_debug_loop

    命令列格式 --lock-order-debug-loop[={OFF|ON}]
    系統變數 lock_order_debug_loop
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    LOCK_ORDER 工具遇到在鎖定順序圖中被標記為迴圈的相依性時,是否導致偵錯斷言失敗。

  • lock_order_debug_missing_arc

    命令列格式 --lock-order-debug-missing-arc[={OFF|ON}]
    系統變數 lock_order_debug_missing_arc
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    當 LOCK_ORDER 工具遇到未在鎖定順序圖中宣告的相依性時,是否導致偵錯斷言失敗。

  • lock_order_debug_missing_key

    命令列格式 --lock-order-debug-missing-key[={OFF|ON}]
    系統變數 lock_order_debug_missing_key
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    LOCK_ORDER 工具遇到未正確使用 Performance Schema 檢測的物件時,是否導致偵錯斷言失敗。

  • lock_order_debug_missing_unlock

    命令列格式 --lock-order-debug-missing-unlock[={OFF|ON}]
    系統變數 lock_order_debug_missing_unlock
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    LOCK_ORDER 工具遇到在持有狀態下被銷毀的鎖定時,是否導致偵錯斷言失敗。

  • lock_order_dependencies

    命令列格式 --lock-order-dependencies=file_name
    系統變數 lock_order_dependencies
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 檔案名稱
    預設值 空字串

    定義伺服器鎖定順序相依性圖的 lock_order_dependencies.txt 檔案的路徑。

    允許不指定任何相依性。在這種情況下,會使用空的相依性圖。

  • lock_order_extra_dependencies

    命令列格式 --lock-order-extra-dependencies=file_name
    系統變數 lock_order_extra_dependencies
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 檔案名稱
    預設值 空字串

    包含鎖定順序相依性圖的其他相依性的檔案路徑。這對於使用描述第三方程式碼行為的其他相依性來修改在 lock_order_dependencies.txt 檔案中定義的主要伺服器相依性圖很有用。(另一種方法是修改 lock_order_dependencies.txt 本身,但不建議這樣做。)

    如果未設定此變數,則不會使用輔助檔案。

  • lock_order_output_directory

    命令列格式 --lock-order-output-directory=dir_name
    系統變數 lock_order_output_directory
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 目錄名稱
    預設值 空字串

    LOCK_ORDER 工具寫入其日誌的目錄。如果未設定此變數,則預設為目前目錄。

  • lock_order_print_txt

    命令列格式 --lock-order-print-txt[={OFF|ON}]
    系統變數 lock_order_print_txt
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    是否讓 LOCK_ORDER 工具執行鎖定順序圖分析並列印文字報告。該報告包含檢測到的任何鎖定獲取迴圈。

  • lock_order_trace_loop

    命令列格式 --lock-order-trace-loop[={OFF|ON}]
    系統變數 lock_order_trace_loop
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    LOCK_ORDER 工具遇到在鎖定順序圖中被標記為迴圈的相依性時,是否在日誌檔案中印出追蹤。

  • lock_order_trace_missing_arc

    命令列格式 --lock-order-trace-missing-arc[={OFF|ON}]
    系統變數 lock_order_trace_missing_arc
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 ON

    LOCK_ORDER 工具遇到未在鎖定順序圖中宣告的相依性時,是否在日誌檔案中印出追蹤。

  • lock_order_trace_missing_key

    命令列格式 --lock-order-trace-missing-key[={OFF|ON}]
    系統變數 lock_order_trace_missing_key
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 OFF

    LOCK_ORDER 工具遇到未正確使用 Performance Schema 檢測的物件時,是否在日誌檔案中印出追蹤。

  • lock_order_trace_missing_unlock

    命令列格式 --lock-order-trace-missing-unlock[={OFF|ON}]
    系統變數 lock_order_trace_missing_unlock
    範圍 全域
    動態
    SET_VAR 提示語法適用
    類型 布林值
    預設值 ON

    LOCK_ORDER 工具遇到在持有狀態下被銷毀的鎖定時,是否在日誌檔案中印出追蹤。