文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美國信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  外部鎖定

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 表格,請勿在啟動伺服器時將系統變數 delay_key_write 設定為 ALL,或者對任何共用表格使用 DELAY_KEY_WRITE=1 表格選項。否則,可能會發生索引損壞。

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