為了減少伺服器重新啟動後的預熱時間,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;
若要在 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';
如果操作尚未開始,則會傳回 「尚未開始」。如果操作已完成,則會列印完成時間 (例如:Finished at 110505 12:18:02)。如果操作正在進行中,則會提供狀態資訊 (例如:Dumping buffer pool 5/7, page 237/2873)。
若要在載入緩衝池時顯示進度,請執行以下語句:
SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';
如果操作尚未開始,則會傳回 「尚未開始」。如果操作已完成,則會列印完成時間 (例如:Finished at 110505 12:23:24)。如果操作正在進行中,則會提供狀態資訊 (例如:Loaded 123/22301 pages)。
您可以使用 效能架構來監控緩衝池載入進度。
以下範例示範如何啟用 stage/innodb/buffer pool load
階段事件檢測器和相關的消費者資料表,以監控緩衝池載入進度。
有關此範例中使用的緩衝池傾印和載入程序的資訊,請參閱第 17.8.3.6 節:「儲存和還原緩衝池狀態」。有關效能架構階段事件檢測器和相關消費者的資訊,請參閱第 29.12.5 節:「效能架構階段事件資料表」。
啟用
stage/innodb/buffer pool load
檢測器mysql> UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'stage/innodb/buffer%';
啟用階段事件消費者資料表,其中包括
events_stages_current
、events_stages_history
和events_stages_history_long
。mysql> UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME LIKE '%stages%';
透過啟用
innodb_buffer_pool_dump_now
來傾印目前的緩衝池狀態。mysql> SET GLOBAL innodb_buffer_pool_dump_now=ON;
檢查緩衝池傾印狀態,以確保操作已完成。
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
透過啟用
innodb_buffer_pool_load_now
來載入緩衝池。mysql> SET GLOBAL innodb_buffer_pool_load_now=ON;
透過查詢效能架構
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 節:「效能架構啟動設定」。