文件首頁
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 參考手冊  /  ...  /  外部鎖定

10.11.5 外部鎖定

外部鎖定是指使用檔案系統鎖定來管理多個程序對 MyISAM 資料庫資料表的競爭。當無法假設單一程序(如 MySQL 伺服器)是唯一需要存取資料表的程序時,會使用外部鎖定。以下是一些範例:

  • 如果您執行多個使用相同資料庫目錄的伺服器(不建議),則每個伺服器都必須啟用外部鎖定。

  • 如果您使用 myisamchkMyISAM 資料表執行資料表維護操作,您必須確保伺服器未執行,或伺服器已啟用外部鎖定,以便在必要時鎖定資料表檔案,以與 myisamchk 協調資料表的存取。使用 myisampack 來封裝 MyISAM 資料表也是如此。

    如果伺服器在啟用外部鎖定的情況下執行,您可以隨時使用 myisamchk 進行讀取操作,例如檢查資料表。在這種情況下,如果伺服器嘗試更新 myisamchk 正在使用的資料表,伺服器會等待 myisamchk 完成後才會繼續。

    如果您使用 myisamchk 進行寫入操作,例如修復或最佳化資料表,或者如果您使用 myisampack 來封裝資料表,您必須始終確保 mysqld 伺服器沒有使用該資料表。如果您不停止 mysqld,至少在執行 myisamchk 之前執行 mysqladmin flush-tables。如果伺服器和 myisamchk 同時存取資料表,您的資料表可能會損壞

在外部鎖定生效的情況下,每個需要存取資料表的程序在繼續存取資料表之前,都會取得資料表檔案的檔案系統鎖定。如果無法取得所有必要的鎖定,則會阻止該程序存取資料表,直到可以取得鎖定為止(在目前持有鎖定的程序釋放鎖定之後)。

外部鎖定會影響伺服器效能,因為伺服器有時必須等待其他程序才能存取資料表。

如果您執行單一伺服器來存取給定的資料目錄 (這是常見情況),且在伺服器執行時沒有其他程式 (例如 myisamchk) 需要修改資料表,則外部鎖定是不必要的。如果您僅使用其他程式讀取資料表,則不需要外部鎖定,雖然如果伺服器在 myisamchk 讀取資料表時變更了資料表,myisamchk 可能會報告警告。

在停用外部鎖定的情況下,若要使用 myisamchk,您必須在執行 myisamchk 時停止伺服器,或是在執行 myisamchk 之前鎖定並刷新資料表。為了避免這個需求,請使用 CHECK TABLEREPAIR TABLE 陳述式來檢查和修復 MyISAM 資料表。

對於 mysqld,外部鎖定由 skip_external_locking 系統變數的值控制。當此變數啟用時,外部鎖定會停用,反之亦然。預設情況下,外部鎖定是停用的。

可以使用 --external-locking--skip-external-locking 選項,在伺服器啟動時控制外部鎖定的使用。

如果您使用外部鎖定選項來啟用多個 MySQL 程序更新 MyISAM 資料表,請勿使用設定為 ALLdelay_key_write 系統變數啟動伺服器,或針對任何共用資料表使用 DELAY_KEY_WRITE=1 資料表選項。否則,可能會發生索引損毀。

滿足此條件最簡單的方法是始終將 --external-locking--delay-key-write=OFF 一起使用。(預設情況下不會這樣做,因為在許多設定中,混合使用上述選項會很有用。)