MySQL 伺服器是一個多執行緒應用程式,它使用許多內部鎖定和與鎖定相關的原始物件,例如互斥鎖、讀寫鎖 (包括 prlock 和 sxlock)、條件和檔案。在伺服器內,與鎖定相關的物件集合會隨著新功能的實作和為提高效能而進行的程式碼重構而變更。與任何使用鎖定原始物件的多執行緒應用程式一樣,當一次持有多個鎖定時,在執行期間總是存在遇到死鎖的風險。對於 MySQL 而言,死鎖的影響是災難性的,導致服務完全中斷。
為了能夠偵測鎖定獲取死鎖並強制執行執行階段執行不受死鎖影響,MySQL 支援 LOCK_ORDER 工具。這使得鎖定順序相依圖能夠定義為伺服器設計的一部分,並且伺服器執行階段檢查能夠確保鎖定獲取是無環的,並且執行路徑符合圖表。
本節提供關於使用 LOCK_ORDER 工具的資訊,但僅限於基本層級。如需完整詳細資訊,請參閱 MySQL 伺服器 Doxygen 文件中的「鎖定順序」章節,網址為 https://dev.mysql.com.tw/doc/index-other.html。
LOCK_ORDER 工具適用於除錯伺服器,不適用於生產用途。
若要使用 LOCK_ORDER 工具,請遵循下列程序
從原始碼建置 MySQL,使用
-DWITH_LOCK_ORDER=ONCMake 選項進行設定,以便建置包含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工具遇到在仍持有狀態下被銷毀的鎖定時,是否在記錄檔中列印追蹤資訊。