文件首頁
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 參考手冊  /  ...  /  儲存與還原緩衝池狀態

17.8.3.6 儲存與還原緩衝池狀態

為了減少伺服器重新啟動後的暖機期間,InnoDB 會在伺服器關閉時儲存每個緩衝池最近使用頁面的百分比,並在伺服器啟動時還原這些頁面。儲存的最近使用頁面的百分比由 innodb_buffer_pool_dump_pct 配置選項定義。

在重新啟動忙碌的伺服器之後,通常會有一個暖機期間,其輸送量會穩定增加,因為緩衝池中的磁碟頁面會被帶回記憶體中(因為會查詢、更新等等相同的資料)。在啟動時還原緩衝池的能力會縮短暖機期間,方法是重新載入重新啟動之前緩衝池中的磁碟頁面,而不是等待 DML 作業存取對應的列。此外,I/O 要求可以成批執行,使整體 I/O 更快。頁面載入在背景中發生,不會延遲資料庫啟動。

除了在關機時儲存緩衝池狀態並在啟動時還原之外,您也可以在伺服器執行時隨時儲存和還原緩衝池狀態。例如,您可以在穩定的工作負載下達到穩定輸送量後儲存緩衝池的狀態。您也可以在執行報表或維護工作之後還原先前的緩衝池狀態,這些工作會將僅用於這些操作的資料頁面帶入緩衝池,或在執行其他非典型工作負載之後還原。

即使緩衝池的大小可能達到數 GB,InnoDB 儲存到磁碟的緩衝池資料相較之下非常小。只會將定位適當頁面所需的表格空間 ID 和頁面 ID 儲存到磁碟。此資訊是從 INNODB_BUFFER_PAGE_LRU INFORMATION_SCHEMA 表格衍生而來。依預設,表格空間 ID 和頁面 ID 資料會儲存在名為 ib_buffer_pool 的檔案中,該檔案會儲存到 InnoDB 資料目錄。可以使用 innodb_buffer_pool_filename 配置參數來修改檔案名稱和位置。

由於資料會快取並從緩衝池中老化,就像一般資料庫操作一樣,因此如果最近更新了磁碟頁面,或者 DML 作業涉及尚未載入的資料,則沒有問題。載入機制會跳過不再存在的請求頁面。

底層機制涉及分派背景執行緒來執行傾印和載入作業。

來自壓縮表格的磁碟頁面會以其壓縮形式載入緩衝池。在 DML 作業期間存取頁面內容時,會像往常一樣解壓縮頁面。由於解壓縮頁面是 CPU 密集型程序,因此並行處理在連線執行緒中執行該操作,而不是在執行緩衝池還原操作的單一執行緒中執行該操作效率更高。

與儲存和還原緩衝池狀態相關的操作在以下主題中描述

設定緩衝池頁面的傾印百分比

在從緩衝池傾印頁面之前,您可以設定要傾印的最近使用緩衝池頁面的百分比,方法是設定 innodb_buffer_pool_dump_pct 選項。如果您計劃在伺服器運行時傾印緩衝池頁面,則可以動態配置此選項。

SET GLOBAL innodb_buffer_pool_dump_pct=40;

如果您計劃在伺服器關閉時傾印緩衝池頁面,請在您的設定檔中設定 innodb_buffer_pool_dump_pct

[mysqld]
innodb_buffer_pool_dump_pct=40

innodb_buffer_pool_dump_pct 的預設值為 25(傾印最近使用頁面的 25%)。

在關機時儲存緩衝池狀態並在啟動時還原它

要在伺服器關閉時儲存緩衝池的狀態,請在關閉伺服器之前發出以下陳述式

SET GLOBAL innodb_buffer_pool_dump_at_shutdown=ON;

innodb_buffer_pool_dump_at_shutdown 預設為啟用。

要在伺服器啟動時還原緩衝池狀態,請在啟動伺服器時指定 --innodb-buffer-pool-load-at-startup 選項

mysqld --innodb-buffer-pool-load-at-startup=ON;

innodb_buffer_pool_load_at_startup 預設為啟用。

線上儲存和還原緩衝池狀態

要在 MySQL 伺服器運行時儲存緩衝池的狀態,請發出以下陳述式

SET GLOBAL innodb_buffer_pool_dump_now=ON;

要在 MySQL 運行時還原緩衝池狀態,請發出以下陳述式

SET GLOBAL innodb_buffer_pool_load_now=ON;
顯示緩衝池傾印進度

要在將緩衝池狀態儲存到磁碟時顯示進度,請發出以下陳述式

SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';

如果操作尚未開始,則會傳回 not started。如果操作已完成,則會列印完成時間(例如,Finished at 110505 12:18:02)。如果操作正在進行中,則會提供狀態資訊(例如,Dumping buffer pool 5/7, page 237/2873)。

顯示緩衝池載入進度

要在載入緩衝池時顯示進度,請發出以下陳述式

SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';

如果操作尚未開始,則會傳回 not started。如果操作已完成,則會列印完成時間(例如,Finished at 110505 12:23:24)。如果操作正在進行中,則會提供狀態資訊(例如,Loaded 123/22301 pages)。

中止緩衝池載入操作

要中止緩衝池載入操作,請發出以下陳述式

SET GLOBAL innodb_buffer_pool_load_abort=ON;
使用效能綱要監控緩衝池載入進度

您可以使用 效能綱要 監控緩衝池載入進度。

以下範例示範如何啟用 stage/innodb/buffer pool load 階段事件工具和相關的消費者表格,以監控緩衝池載入進度。

有關此範例中使用的緩衝池傾印和載入程序的信息,請參閱 第 17.8.3.6 節,「儲存和還原緩衝池狀態」。有關效能綱要階段事件工具和相關消費者的資訊,請參閱 第 29.12.5 節,「效能綱要階段事件表格」

  1. 啟用 stage/innodb/buffer pool load 工具

    mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' 
           WHERE NAME LIKE 'stage/innodb/buffer%';
  2. 啟用階段事件消費者表格,其中包括 events_stages_currentevents_stages_historyevents_stages_history_long

    mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' 
           WHERE NAME LIKE '%stages%';
  3. 透過啟用 innodb_buffer_pool_dump_now 來傾印目前的緩衝池狀態。

    mysql> SET GLOBAL innodb_buffer_pool_dump_now=ON;
  4. 檢查緩衝池傾印狀態以確保操作已完成。

    mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status'\G
    *************************** 1. row ***************************
    Variable_name: Innodb_buffer_pool_dump_status
            Value: Buffer pool(s) dump completed at 150202 16:38:58
  5. 透過啟用 innodb_buffer_pool_load_now 來載入緩衝池

    mysql> SET GLOBAL innodb_buffer_pool_load_now=ON;
  6. 透過查詢效能綱要 events_stages_current 表格,檢查緩衝池載入操作的目前狀態。WORK_COMPLETED 欄顯示已載入的緩衝池頁面數量。WORK_ESTIMATED 欄提供剩餘工作量的估計值(以頁面為單位)。

    mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED
           FROM performance_schema.events_stages_current;
    +-------------------------------+----------------+----------------+
    | EVENT_NAME                    | WORK_COMPLETED | WORK_ESTIMATED |
    +-------------------------------+----------------+----------------+
    | stage/innodb/buffer pool load |           5353 |           7167 |
    +-------------------------------+----------------+----------------+

    如果緩衝池載入操作已完成,則 events_stages_current 表格會傳回空集合。在這種情況下,您可以檢查 events_stages_history 表格,以檢視已完成事件的資料。例如

    mysql> SELECT EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED 
           FROM performance_schema.events_stages_history;
    +-------------------------------+----------------+----------------+
    | EVENT_NAME                    | WORK_COMPLETED | WORK_ESTIMATED |
    +-------------------------------+----------------+----------------+
    | stage/innodb/buffer pool load |           7167 |           7167 |
    +-------------------------------+----------------+----------------+
注意

您也可以在使用 innodb_buffer_pool_load_at_startup 在啟動時載入緩衝池時,使用效能綱要監控緩衝池載入進度。在這種情況下,必須在啟動時啟用 stage/innodb/buffer pool load 工具和相關的消費者。有關詳細資訊,請參閱 第 29.3 節,「效能綱要啟動設定」