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工具。
假設 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.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工具遇到未正確使用 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=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工具遇到未正確使用 Performance Schema 檢測的物件時,是否在日誌檔案中印出追蹤。 lock_order_trace_missing_unlock命令列格式 --lock-order-trace-missing-unlock[={OFF|ON}]系統變數 lock_order_trace_missing_unlock範圍 全域 動態 否 SET_VAR提示語法適用否 類型 布林值 預設值 ON當
LOCK_ORDER工具遇到在持有狀態下被銷毀的鎖定時,是否在日誌檔案中印出追蹤。