MySQL 伺服器是一個多執行緒應用程式,它使用許多內部鎖定和與鎖定相關的原始物件,例如互斥鎖、讀寫鎖 (包括 prlock 和 sxlock)、條件和檔案。在伺服器內,與鎖定相關的物件集合會隨著新功能的實作和為提高效能而進行的程式碼重構而變更。與任何使用鎖定原始物件的多執行緒應用程式一樣,當一次持有多個鎖定時,在執行期間總是存在遇到死鎖的風險。對於 MySQL 而言,死鎖的影響是災難性的,導致服務完全中斷。
為了能夠偵測鎖定獲取死鎖並強制執行執行階段執行不受死鎖影響,MySQL 支援 LOCK_ORDER
工具。這使得鎖定順序相依圖能夠定義為伺服器設計的一部分,並且伺服器執行階段檢查能夠確保鎖定獲取是無環的,並且執行路徑符合圖表。
本節提供關於使用 LOCK_ORDER
工具的資訊,但僅限於基本層級。如需完整詳細資訊,請參閱 MySQL 伺服器 Doxygen 文件中的「鎖定順序」章節,網址為 https://mysqldev.dev.org.tw/doc/index-other.html。
LOCK_ORDER
工具適用於除錯伺服器,不適用於生產用途。
若要使用 LOCK_ORDER
工具,請遵循下列程序
從原始碼建置 MySQL,使用
-DWITH_LOCK_ORDER=ON
CMake 選項進行設定,以便建置包含LOCK_ORDER
工具。注意啟用
WITH_LOCK_ORDER
選項後,MySQL 建置需要 flex 程式。若要在啟用
LOCK_ORDER
工具的情況下執行伺服器,請在伺服器啟動時啟用lock_order
系統變數。還有其他幾個用於LOCK_ORDER
設定的系統變數也可用。對於 MySQL 測試套件操作,mysql-test-run.pl 有一個
--lock-order
選項,可控制是否在測試案例執行期間啟用LOCK_ORDER
工具。
以下描述的系統變數會設定 LOCK_ORDER
工具的操作,前提是 MySQL 已建置為包含 LOCK_ORDER
工具。主要變數是 lock_order
,它指示是否在執行階段啟用 LOCK_ORDER
工具
如果
lock_order
已停用(預設值),則其他LOCK_ORDER
系統變數不會有任何作用。如果
lock_order
已啟用,則其他系統變數會設定要啟用哪些LOCK_ORDER
功能。
一般而言,預期會透過執行帶有 --lock-order
選項的 mysql-test-run.pl 來設定 LOCK_ORDER
工具,並且讓 mysql-test-run.pl 將 LOCK_ORDER
系統變數設定為適當的值。
所有 LOCK_ORDER
系統變數都必須在伺服器啟動時設定。在執行階段,它們的值是可見的,但無法變更。
有些系統變數會成對存在,例如 lock_order_debug_loop
和 lock_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[={OFF|ON}]
系統變數 lock_order
範圍 全域 動態 否 SET_VAR
提示語法適用否 類型 布林值 預設值 OFF
是否在執行時啟用
LOCK_ORDER
工具。如果停用lock_order
(預設值),則其他LOCK_ORDER
系統變數不會有任何作用。如果啟用lock_order
,則其他系統變數會設定要啟用哪些LOCK_ORDER
功能。如果啟用
lock_order
,當伺服器遇到未在鎖定順序圖中宣告的鎖定獲取順序時,會引發錯誤。 -
命令列格式 --lock-order-debug-loop[={OFF|ON}]
系統變數 lock_order_debug_loop
範圍 全域 動態 否 SET_VAR
提示語法適用否 類型 布林值 預設值 OFF
當
LOCK_ORDER
工具遇到被標記為鎖定順序圖中迴圈的相依性時,是否導致除錯斷言失敗。 -
命令列格式 --lock-order-debug-missing-arc[={OFF|ON}]
系統變數 lock_order_debug_missing_arc
範圍 全域 動態 否 SET_VAR
提示語法適用否 類型 布林值 預設值 OFF
當 LOCK_ORDER 工具遇到未在鎖定順序圖中宣告的相依性時,是否導致除錯斷言失敗。
-
命令列格式 --lock-order-debug-missing-key[={OFF|ON}]
系統變數 lock_order_debug_missing_key
範圍 全域 動態 否 SET_VAR
提示語法適用否 類型 布林值 預設值 OFF
當
LOCK_ORDER
工具遇到未透過效能架構正確檢測的物件時,是否導致除錯斷言失敗。 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=file_name
系統變數 lock_order_dependencies
範圍 全域 動態 否 SET_VAR
提示語法適用否 類型 檔案名稱 預設值 空字串
定義伺服器鎖定順序相依性圖的
lock_order_dependencies.txt
檔案路徑。允許不指定任何相依性。在此情況下會使用空的相依性圖。
-
命令列格式 --lock-order-extra-dependencies=file_name
系統變數 lock_order_extra_dependencies
範圍 全域 動態 否 SET_VAR
提示語法適用否 類型 檔案名稱 預設值 空字串
包含鎖定順序相依性圖其他相依性的檔案路徑。這對於修改在
lock_order_dependencies.txt
檔案中定義的主要伺服器相依性圖非常有用,並可使用額外相依性描述第三方程式碼的行為。(另一種方法是修改lock_order_dependencies.txt
本身,但不建議這麼做。)如果未設定此變數,則不會使用次要檔案。
-
命令列格式 --lock-order-output-directory=dir_name
系統變數 lock_order_output_directory
範圍 全域 動態 否 SET_VAR
提示語法適用否 類型 目錄名稱 預設值 空字串
LOCK_ORDER
工具寫入記錄檔的目錄。如果未設定此變數,則預設值為目前目錄。 -
命令列格式 --lock-order-print-txt[={OFF|ON}]
系統變數 lock_order_print_txt
範圍 全域 動態 否 SET_VAR
提示語法適用否 類型 布林值 預設值 OFF
是否讓
LOCK_ORDER
工具執行鎖定順序圖分析並列印文字報告。該報告包含偵測到的任何鎖定獲取迴圈。 -
命令列格式 --lock-order-trace-loop[={OFF|ON}]
系統變數 lock_order_trace_loop
範圍 全域 動態 否 SET_VAR
提示語法適用否 類型 布林值 預設值 OFF
當
LOCK_ORDER
工具遇到被標記為鎖定順序圖中迴圈的相依性時,是否在記錄檔中列印追蹤資訊。 -
命令列格式 --lock-order-trace-missing-arc[={OFF|ON}]
系統變數 lock_order_trace_missing_arc
範圍 全域 動態 否 SET_VAR
提示語法適用否 類型 布林值 預設值 ON
當
LOCK_ORDER
工具遇到未在鎖定順序圖中宣告的相依性時,是否在記錄檔中列印追蹤資訊。 -
命令列格式 --lock-order-trace-missing-key[={OFF|ON}]
系統變數 lock_order_trace_missing_key
範圍 全域 動態 否 SET_VAR
提示語法適用否 類型 布林值 預設值 OFF
當
LOCK_ORDER
工具遇到未透過效能架構正確檢測的物件時,是否在記錄檔中列印追蹤資訊。 lock_order_trace_missing_unlock
命令列格式 --lock-order-trace-missing-unlock[={OFF|ON}]
系統變數 lock_order_trace_missing_unlock
範圍 全域 動態 否 SET_VAR
提示語法適用否 類型 布林值 預設值 ON
當
LOCK_ORDER
工具遇到在仍持有狀態下被銷毀的鎖定時,是否在記錄檔中列印追蹤資訊。