伺服器關機程序如下:
啟動關機程序。
這可以透過幾種方式啟動。例如,具有
SHUTDOWN
權限的使用者可以執行 mysqladmin shutdown 命令。mysqladmin 可以在 MySQL 支援的任何平台上使用。其他特定於作業系統的關機啟動方法也是可能的:當伺服器收到SIGTERM
訊號時,它會在 Unix 上關機。在 Windows 上以服務執行的伺服器會在服務管理員告知關機時關機。如果需要,伺服器會建立關機執行緒。
根據關機的啟動方式,伺服器可能會建立一個執行緒來處理關機程序。如果關機是由用戶端請求的,則會建立一個關機執行緒。如果關機是收到
SIGTERM
訊號的結果,則訊號執行緒可能會自行處理關機,或者可能會建立一個單獨的執行緒來執行此操作。如果伺服器嘗試建立關機執行緒但無法建立(例如,如果記憶體耗盡),它會發出診斷訊息,該訊息會出現在錯誤日誌中。Error: Can't create thread to kill server
伺服器停止接受新連線。
為了防止在關機期間啟動新的活動,伺服器會停止接受新的用戶端連線,方法是關閉它通常偵聽連線的網路介面處理程式:TCP/IP 連接埠、Unix Socket 檔案、Windows 具名管道,以及 Windows 上的共用記憶體。
伺服器終止目前的活動。
對於每個與用戶端連線相關聯的執行緒,伺服器會中斷與用戶端的連線,並將執行緒標記為已終止。當執行緒注意到它們被標記時,它們就會死亡。閒置連線的執行緒會快速死亡。目前正在處理陳述式的執行緒會定期檢查其狀態,並需要較長的時間才能死亡。有關執行緒終止的其他資訊,請參閱 章節 15.7.8.4,「KILL 陳述式」,特別是關於在
MyISAM
表格上終止REPAIR TABLE
或OPTIMIZE TABLE
操作的指示。對於具有開啟交易的執行緒,交易會回滾。如果執行緒正在更新非交易表格,則多列
UPDATE
或INSERT
等操作可能會使表格部分更新,因為操作可能會在完成前終止。如果伺服器是複寫來源伺服器,它會將與目前連線的複本相關聯的執行緒視為其他用戶端執行緒。也就是說,每個執行緒都會被標記為已終止,並在下次檢查其狀態時結束。
如果伺服器是複本伺服器,它會在將客戶端執行緒標記為已終止之前,先停止複製 I/O 和 SQL 執行緒(如果它們正在活動)。SQL 執行緒允許完成其當前語句(以避免造成複製問題),然後停止。如果 SQL 執行緒在此時處於交易中間,則伺服器會等待直到當前的複製事件群組(如果有的話)完成執行,或者直到使用者發出
KILL QUERY
或KILL CONNECTION
語句。另請參閱 第 15.4.2.5 節「STOP REPLICA 語句」。由於非交易性語句無法回滾,為了保證當機安全的複製,應該只使用交易性表格。注意為了保證複本上的當機安全,您必須啟用
--relay-log-recovery
選項來執行複本。伺服器會關閉或關閉儲存引擎。
在此階段,伺服器會清除表格快取並關閉所有開啟的表格。
每個儲存引擎都會執行它所管理的表格所需的任何操作。
InnoDB
會將其緩衝池刷新到磁碟(除非innodb_fast_shutdown
為 2),將目前的 LSN 寫入表空間,並終止其自身的內部執行緒。MyISAM
會刷新表格的任何擱置索引寫入。伺服器會退出。
為了向管理程序提供資訊,伺服器會傳回下列清單中描述的其中一個結束代碼。括號中的短語表示 systemd 針對使用 systemd 管理伺服器的平台,對該代碼所採取的動作。
0 = 成功終止(不重新啟動)
1 = 終止失敗(不重新啟動)
2 = 終止失敗(重新啟動)