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


15.7.8.3 FLUSH 陳述式

FLUSH [NO_WRITE_TO_BINLOG | LOCAL] {
    flush_option [, flush_option] ...
  | tables_option
}

flush_option: {
    BINARY LOGS
  | ENGINE LOGS
  | ERROR LOGS
  | GENERAL LOGS
  | LOGS
  | PRIVILEGES
  | OPTIMIZER_COSTS
  | RELAY LOGS [FOR CHANNEL channel]
  | SLOW LOGS
  | STATUS
  | USER_RESOURCES
}

tables_option: {
    table_synonym
  | table_synonym tbl_name [, tbl_name] ...
  | table_synonym WITH READ LOCK
  | table_synonym tbl_name [, tbl_name] ... WITH READ LOCK
  | table_synonym tbl_name [, tbl_name] ... FOR EXPORT
}

table_synonym: {
    TABLE
  | TABLES
}

FLUSH 陳述式有多種變體形式,可用於清除或重新載入各種內部快取、刷新資料表或取得鎖定。每個 FLUSH 操作都需要其描述中指示的權限。

注意

無法在預存函數或觸發程序中發出 FLUSH 陳述式。但是,您可以在預存程序中使用 FLUSH,只要這些程序不是從預存函數或觸發程序呼叫即可。請參閱 第 27.9 節,「預存程式的限制」

預設情況下,伺服器會將 FLUSH 陳述式寫入二進制日誌,以便將其複寫到複本。若要禁止記錄,請指定可選的 NO_WRITE_TO_BINLOG 關鍵字或其別名 LOCAL

注意

FLUSH LOGSFLUSH BINARY LOGSFLUSH TABLES WITH READ LOCK(帶或不帶資料表清單)和 FLUSH TABLES tbl_name ... FOR EXPORT 在任何情況下都不會寫入二進制日誌,因為如果複寫到複本,它們會導致問題。

FLUSH 陳述式會導致隱含的 commit。請參閱 第 15.3.3 節,「導致隱含 Commit 的陳述式」

mysqladmin 公用程式提供了一些刷新操作的命令列介面,使用諸如 flush-logsflush-privilegesflush-statusflush-tables 之類的命令。請參閱 第 6.5.2 節,「mysqladmin — MySQL 伺服器管理程式」

向伺服器傳送 SIGHUPSIGUSR1 信號會導致發生多個刷新操作,這些操作類似於 FLUSH 陳述式的各種形式。信號可以由 root 系統帳戶或擁有伺服器程序的系統帳戶傳送。這使得可以在無需連線到伺服器的情況下執行刷新操作,這需要具有足夠執行這些操作權限的 MySQL 帳戶。請參閱 第 6.10 節,「MySQL 中的 Unix 信號處理」

RESET 陳述式類似於 FLUSH。請參閱 第 15.7.8.6 節,「RESET 陳述式」,以取得有關將 RESET 用於複寫的資訊。

以下清單描述了允許的 FLUSH 陳述式 flush_option 值。有關允許的 tables_option 值的描述,請參閱 FLUSH TABLES 語法

FLUSH TABLES 語法

FLUSH TABLES 會刷新表格,並且根據使用的變體,取得鎖定。在 FLUSH 陳述式中使用的任何 TABLES 變體都必須是唯一使用的選項。FLUSH TABLEFLUSH TABLES 的同義詞。

注意

此處指示通過關閉表格來刷新表格的描述,對於 InnoDB 則有不同的適用方式,它會將表格內容刷新到磁碟,但保持它們開啟。只要其他活動沒有修改表格,這仍然允許在表格開啟時複製表格檔案。

  • FLUSH TABLES

    關閉所有開啟的表格,強制關閉所有正在使用的表格,並刷新預處理陳述式快取。

    此操作需要 FLUSH_TABLESRELOAD 權限。

    有關預處理陳述式快取的資訊,請參閱 第 10.10.3 節「預處理陳述式和儲存程式的快取」

    當有作用中的 LOCK TABLES ... READ 時,不允許使用 FLUSH TABLES。若要刷新和鎖定表格,請改用 FLUSH TABLES tbl_name ... WITH READ LOCK

  • FLUSH TABLES tbl_name [, tbl_name] ...

    使用一個或多個以逗號分隔的表格名稱清單,此操作類似於沒有名稱的 FLUSH TABLES,只是伺服器僅刷新指定的表格。如果指定的表格不存在,則不會發生錯誤。

    此操作需要 FLUSH_TABLESRELOAD 權限。

  • FLUSH TABLES WITH READ LOCK

    關閉所有開啟的表格,並以全域讀取鎖鎖定所有資料庫的所有表格。

    此操作需要 FLUSH_TABLESRELOAD 權限。

    如果您有可以按時間擷取快照的檔案系統(例如 Veritas 或 ZFS),此操作是一種非常方便的取得備份的方式。使用 UNLOCK TABLES 來釋放鎖定。

    FLUSH TABLES WITH READ LOCK 取得的是全域讀取鎖,而不是表格鎖,因此其行為與 LOCK TABLESUNLOCK TABLES 在表格鎖定和隱式提交方面不同。

    FLUSH TABLES WITH READ LOCK 不會阻止伺服器將列插入到記錄表格中(請參閱 第 7.4.1 節「選取一般查詢記錄和慢速查詢記錄輸出目的地」)。

  • FLUSH TABLES tbl_name [, tbl_name] ... WITH READ LOCK

    刷新並取得指定表格的讀取鎖。

    此操作需要 FLUSH_TABLESRELOAD 權限。由於它會取得表格鎖定,因此它還需要每個表格的 LOCK TABLES 權限。

    此操作首先為表格取得獨佔中繼資料鎖定,因此它會等待打開這些表格的交易完成。然後,此操作會從表格快取中刷新表格,重新開啟表格,取得表格鎖定(如 LOCK TABLES ... READ),並將中繼資料鎖定從獨佔降級為共用。在操作取得鎖定並降級中繼資料鎖定後,其他會話可以讀取但不能修改表格。

    此操作僅適用於現有的基本 (非 TEMPORARY) 表格。如果名稱指的是基本表格,則會使用該表格。如果它指的是 TEMPORARY 表格,則會忽略它。如果名稱適用於檢視,則會發生 ER_WRONG_OBJECT 錯誤。否則,會發生 ER_NO_SUCH_TABLE 錯誤。

    使用 UNLOCK TABLES 來釋放鎖定,使用 LOCK TABLES 來釋放鎖定並取得其他鎖定,或使用 START TRANSACTION 來釋放鎖定並開始新的交易。

    FLUSH TABLES 變體可讓表格在單一操作中被刷新和鎖定。它為 FLUSH TABLES 在有作用中的 LOCK TABLES ... READ 時不允許使用的限制提供了一個解決方法。

    此操作不會執行隱式的 UNLOCK TABLES,因此,如果在有任何作用中的 LOCK TABLES 時執行此操作,或者在沒有先釋放取得的鎖定的情況下第二次使用此操作,則會導致錯誤。

    如果刷新的表格是使用 HANDLER 開啟的,則處理常式會被隱式刷新並失去其位置。

  • FLUSH TABLES tbl_name [, tbl_name] ... FOR EXPORT

    FLUSH TABLES 變體適用於 InnoDB 表格。它確保對指定表格的變更已刷新到磁碟,以便在伺服器執行時可以進行二進位表格複製。

    此操作需要 FLUSH_TABLESRELOAD 權限。由於它會在準備匯出表格時取得表格上的鎖定,因此它還需要每個表格的 LOCK TABLESSELECT 權限。

    此操作的工作方式如下

    1. 它會取得指定表格的共用中繼資料鎖定。只要其他會話有已修改這些表格或為它們保留表格鎖定的作用中交易,此操作就會被阻止。當取得鎖定後,此操作會阻止嘗試更新表格的交易,同時允許繼續進行唯讀操作。

    2. 它會檢查表格的所有儲存引擎是否支援 FOR EXPORT。如果任何儲存引擎不支持,則會發生 ER_ILLEGAL_HA 錯誤,且操作會失敗。

    3. 此操作會通知每個表格的儲存引擎使表格準備好進行匯出。儲存引擎必須確保將任何未決變更寫入磁碟。

    4. 此操作會將會話置於鎖定表格模式,以便在 FOR EXPORT 操作完成時,先前取得的中繼資料鎖定不會被釋放。

    此操作僅適用於現有的基本 (非 TEMPORARY) 表格。如果名稱指的是基本表格,則會使用該表格。如果它指的是 TEMPORARY 表格,則會忽略它。如果名稱適用於檢視,則會發生 ER_WRONG_OBJECT 錯誤。否則,會發生 ER_NO_SUCH_TABLE 錯誤。

    InnoDB 支援具有自己的 .ibd 檔案檔案(即使用啟用 innodb_file_per_table 設定建立的表格)的表格的 FOR EXPORTInnoDB 在收到 FOR EXPORT 操作的通知時,會確保任何變更都已刷新到磁碟。這允許在 FOR EXPORT 操作生效時製作表格內容的二進位副本,因為 .ibd 檔案是交易一致的,並且可以在伺服器執行時複製。FOR EXPORT 不適用於 InnoDB 系統表格空間檔案,或具有 FULLTEXT 索引的 InnoDB 表格。

    FLUSH TABLES ...FOR EXPORT 支援分割的 InnoDB 表格。

    當收到 FOR EXPORT 通知時,InnoDB 會將某些通常儲存在記憶體或表格空間檔案外的獨立磁碟緩衝區中的資料寫入磁碟。對於每個表格,InnoDB 也會在與表格相同的資料庫目錄中產生一個名為 table_name.cfg 的檔案。.cfg 檔案包含稍後將表格空間檔案重新匯入相同或不同伺服器所需的元資料。

    FOR EXPORT 操作完成時,InnoDB 已將所有髒頁刷新到表格資料檔案。任何變更緩衝區項目會在刷新之前合併。此時,表格會被鎖定且處於靜止狀態:表格在磁碟上處於交易一致的狀態,您可以複製 .ibd 表格空間檔案以及對應的 .cfg 檔案,以取得這些表格的一致快照。

    有關將複製的表格資料重新匯入 MySQL 執行個體的程序,請參閱第 17.6.1.3 節「匯入 InnoDB 表格」

    在您處理完表格後,請使用 UNLOCK TABLES 來釋放鎖定、使用 LOCK TABLES 來釋放鎖定並取得其他鎖定,或使用 START TRANSACTION 來釋放鎖定並開始新的交易。

    當任何這些陳述式在會話中生效時,嘗試使用 FLUSH TABLES ... FOR EXPORT 會產生錯誤。

    FLUSH TABLES ... WITH READ LOCK
    FLUSH TABLES ... FOR EXPORT
    LOCK TABLES ... READ
    LOCK TABLES ... WRITE

    FLUSH TABLES ... FOR EXPORT 在會話中生效時,嘗試使用任何這些陳述式都會產生錯誤。

    FLUSH TABLES WITH READ LOCK
    FLUSH TABLES ... WITH READ LOCK
    FLUSH TABLES ... FOR EXPORT