雙寫緩衝區是一個儲存區域,InnoDB
會在此寫入從緩衝池刷新的頁面,然後再將頁面寫入 InnoDB
資料檔案中的正確位置。如果在頁面寫入過程中,作業系統、儲存子系統或意外的 mysqld 程序退出,InnoDB
可以在當機復原期間從雙寫緩衝區找到頁面的良好副本。
雖然資料會寫入兩次,但雙寫緩衝區不需要兩倍的 I/O 額外負荷或兩倍的 I/O 操作。資料會以大型循序區塊寫入雙寫緩衝區,並對作業系統進行單一 fsync()
呼叫(除非 innodb_flush_method
設定為 O_DIRECT_NO_FSYNC
)。
雙寫緩衝區儲存區域位於雙寫檔案中。
提供以下變數以進行雙寫緩衝區設定
innodb_doublewrite
變數控制是否啟用雙寫緩衝區。在大多數情況下,預設為啟用。若要停用雙寫緩衝區,請將innodb_doublewrite
設定為OFF
。如果比起資料完整性,您更在意效能,例如在執行基準測試時,可以考慮停用雙寫緩衝區。innodb_doublewrite
支援DETECT_AND_RECOVER
和DETECT_ONLY
設定。DETECT_AND_RECOVER
設定與ON
設定相同。使用此設定,雙寫緩衝區會完全啟用,資料庫頁面內容會寫入雙寫緩衝區,在復原期間會在此存取以修正不完整的頁面寫入。使用
DETECT_ONLY
設定,只會將中繼資料寫入雙寫緩衝區。資料庫頁面內容不會寫入雙寫緩衝區,且復原不會使用雙寫緩衝區來修正不完整的頁面寫入。此輕量設定僅適用於偵測不完整的頁面寫入。MySQL 支援動態變更
innodb_doublewrite
設定,以在ON
、DETECT_AND_RECOVER
和DETECT_ONLY
之間啟用雙寫緩衝區。MySQL 不支援在啟用雙寫緩衝區的設定與OFF
之間進行動態變更,反之亦然。如果雙寫緩衝區位於支援原子寫入的 Fusion-io 裝置上,則會自動停用雙寫緩衝區,並改為使用 Fusion-io 原子寫入來執行資料檔案寫入。但是,請注意
innodb_doublewrite
設定是全域的。停用雙寫緩衝區時,會針對所有資料檔案停用,包括那些未駐留在 Fusion-io 硬體上的資料檔案。此功能僅在 Fusion-io 硬體上支援,且僅適用於 Linux 上的 Fusion-io NVMFS。若要充分利用此功能,建議innodb_flush_method
設定為O_DIRECT
。innodb_doublewrite_dir
變數定義InnoDB
建立雙寫檔案的目錄。如果未指定目錄,則會在innodb_data_home_dir
目錄中建立雙寫檔案,如果未指定,則預設為資料目錄。為了避免與綱要名稱衝突,指定的目錄名稱會自動加上井字號 '#' 作為前綴。然而,如果目錄名稱中明確指定了 '.'、'#' 或 '/' 前綴,則不會在目錄名稱前加上井字號 '#'。
理想情況下,雙寫目錄應放置在可用的最快儲存媒體上。
innodb_doublewrite_files
變數定義了雙寫檔案的數量,預設值為 2。預設情況下,每個緩衝池實例會建立兩個雙寫檔案:一個用於刷新列表的雙寫檔案,以及一個用於 LRU 列表的雙寫檔案。刷新列表雙寫檔案用於從緩衝池刷新列表中刷新的頁面。刷新列表雙寫檔案的預設大小為
InnoDB
頁面大小 * 雙寫頁面位元組。LRU 列表雙寫檔案用於從緩衝池 LRU 列表中刷新的頁面。它也包含單頁刷新用的插槽。LRU 列表雙寫檔案的預設大小為
InnoDB
頁面大小 * (雙寫頁面 + (512 / 緩衝池實例數量)),其中 512 是為單頁刷新保留的插槽總數。最少會有兩個雙寫檔案。雙寫檔案的最大數量是緩衝池實例數量的兩倍。(緩衝池實例的數量由
innodb_buffer_pool_instances
變數控制。)雙寫檔案名稱具有以下格式:
#ib_
(或使用頁面大小
_檔案編號
.dblwrDETECT_ONLY
設定時為.bdblwr
)。例如,對於InnoDB
頁面大小為 16KB 且具有單個緩衝池的 MySQL 實例,會建立以下雙寫檔案:#ib_16384_0.dblwr #ib_16384_1.dblwr
innodb_doublewrite_files
變數旨在用於進階效能調整。預設設定應該適用於大多數使用者。innodb_doublewrite_pages
變數控制每個執行緒的最大雙寫頁面數。此變數旨在用於進階效能調整。預設值應該適用於大多數使用者。
InnoDB
會自動加密屬於已加密表空間的雙寫檔案頁面(請參閱第 17.13 節,「InnoDB 靜態資料加密」)。同樣地,屬於頁面壓縮表空間的雙寫檔案頁面也會被壓縮。因此,雙寫檔案可以包含不同的頁面類型,包括未加密和未壓縮的頁面、加密的頁面、壓縮的頁面,以及既加密又壓縮的頁面。