本主題提供 SQL Server 資料庫檢查點的概觀。 檢查點會建立一個已知狀態良好的起點,讓 SQL Server Database Engine 可以在非預期的關機或當機後,開始套用記錄檔中包含的變更。
檢查點概觀
基於效能考慮,Database Engine 會對緩衝區快取中記憶體中的資料庫頁面執行修改,而且不會在每次變更之後將這些頁面寫入磁碟。 相反地,Database Engine 會定期在每個資料庫發出檢查點。 檢查點會將目前記憶體中修改的頁面(稱為「髒頁」和事務歷史記錄資訊從記憶體寫入磁碟,以及記錄事務歷史記錄的相關信息。
Database Engine 支援數種類型的檢查點:自動、間接、手動和內部。 下表摘要說明檢查點的類型。
| 名稱 | Transact-SQL 介面 | 說明 |
|---|---|---|
| 自動 | 執行 sp_configure 'recovery interval','seconds' |
自動在背景中發出,以符合伺服器組態選項所建議的時間上限。 自動檢查點運行直至完成。 自動檢查點會根據待處理的寫入數量,以及 Database Engine 偵測到寫入延遲超過 20 毫秒時是否增加,進行節流。 如需詳細資訊,請參閱 設定復原間隔伺服器組態選項。 |
| 間接 | ALTER DATABASE ...SET TARGET_RECOVERY_TIME =target_recovery_time { SECONDS |MINUTES } | 在系統背景中執行,以符合使用者為指定資料庫設置的目標恢復時間。 默認恢復目標時間設為 0,此設定會讓資料庫使用自動檢查點啟發策略。 如果您已使用 ALTER DATABASE 將TARGET_RECOVERY_TIME設定為 >0,則會使用此值,而不是為伺服器實例指定的復原間隔。 如需詳細資訊,請參閱變更資料庫的目標復原時間 (SQL Server)。 |
| 說明書 | CHECKPOINT [ checkpoint_duration ] | 當您執行 Transact-SQL CHECKPOINT 命令時發出。 手動檢查點發生在您連線的目前資料庫中。 根據預設,手動檢查點會執行至完成。 節流的運作方式與自動檢查點的運作方式相同。 選擇性地, checkpoint_duration 參數會指定要求的時間量,以秒為單位,讓檢查點完成。 如需詳細資訊,請參閱 CHECKPOINT (Transact-SQL)。 |
| 內部 | 沒有。 | 由備份和資料庫快照集建立等各種伺服器作業所發出,以確保磁碟映像符合記錄的目前狀態。 |
備註
SQL Server 進階安裝選項可讓資料庫管理員根據某些類型的檢查點之 I/O 子系統的輸送量來控制檢查點 I/O 行為。 安裝程式 -k 選項適用於自動檢查點,以及任何其他未受限制的手動和內部檢查點。
針對自動、手動和內部檢查點,只有在最新檢查點之後進行的修改需要在資料庫復原期間向前推進。 這樣可縮短復原資料庫所需的時間。
這很重要
長時間執行的未認可交易會增加所有類型的檢查點的復原時間。
TARGET_RECOVERY_TIME與「復原間隔」選項的互動
下表摘要說明全伺服器 sp_configure'recovery interval' 設定與資料庫特定 ALTER DATABASE ... 之間的互動。TARGET_RECOVERY_TIME設定。
| TARGET_RECOVERY_TIME | 恢復間隔 | 使用的檢查點類型 |
|---|---|---|
| 0 | 0 | 目標復原間隔為 1 分鐘的自動檢查點。 |
| 0 | >0 | 目標復原間隔是根據使用者在 sp_configure recovery interval 選項中設定的值來指定的自動檢查點。 |
| >0 | 不適用。 | 目標復原時間由TARGET_RECOVERY_TIME設定來決定的間接檢查點,以秒為單位顯示。 |
自動檢查點
每當記錄檔記錄的數目達到 Database Engine 估計在伺服器組態選項中的 recovery interval 所指定的時間期間內可處理的數量時,便會發生自動檢查點。 在不含使用者定義目標復原時間的每個資料庫中,Database Engine 會產生自動檢查點。 自動檢查點的頻率取決於 recovery interval 進階伺服器組態選項,指定指定伺服器實例在系統重新啟動期間應該用來復原資料庫的時間上限。 Database Engine 會估計在復原間隔內可以處理的記錄檔記錄數目上限。 當使用自動化檢查點的資料庫達到這個記錄檔記錄數目上限時,Database Engine 會在資料庫上執行檢查點。 自動檢查點之間的時間間隔可以是高度可變的。 具有大量交易工作負載的資料庫會比主要用於唯讀作業的資料庫擁有更頻繁的檢查點。
此外,在簡單恢復模型下,如果日誌已滿 70%,則自動檢查點也會排入佇列。
在簡單恢復模式下,除非某些因素延遲記錄截斷,否則自動檢查點會截斷事務歷史記錄的未使用區段。 相反地,在完整和大容量日誌恢復模式下,一旦建立記錄備份鏈結,自動檢查點就不會造成記錄截斷。 如需詳細資訊,請參閱交易記錄記錄 (SQL Server)。
系統當機後,復原指定資料庫所需的時間長度主要取決於復原當時髒頁面所需的隨機 I/O 數量。 這表示 recovery interval 設定不可靠。 無法判斷正確的復原持續時間。 此外,當自動檢查點進行時,數據的一般 I/O 活動會大幅增加且變得相當不可預測。
復原間隔對復原效能的影響
對於使用簡短交易的在線事務處理 (OLTP) 系統, recovery interval 是決定復原時間的主要因素。 不過,此選項 recovery interval 不會影響復原長時間執行交易所需的時間。 復原具有長時間執行之交易的資料庫可能需要比 選項中指定的 recovery interval 時間長得多。 例如,如果長時間執行的交易在伺服器實例停用前花了兩個小時執行更新,實際的復原時間比 recovery interval 復原長時間交易的值要長得多。 如需長時間執行之交易對復原時間影響的詳細資訊,請參閱 事務歷史記錄 (SQL Server) 。
一般而言,預設值會提供最佳的復原效能。 不過,在下列情況下,變更復原間隔可能會改善效能:
如果在長時間執行的交易未被回復的情況下,復原通常花費的時間顯著超過 1 分鐘。
如果您注意到頻繁的檢查點會影響資料庫的效能。
如果您決定增加 recovery interval 設定,我們建議您逐漸以小幅度增加,並評估每次增量對恢復效能的影響。 這種方法很重要,因為 recovery interval 隨著設定的增加,資料庫復原需要更長的時間才能完成。 例如,如果您將 recovery interval 設為 10,復原所需時間大約是設定為零時的 10 倍。
間接檢查點
SQL Server 2012 的間接檢查點,提供可設定的資料庫層級替代自動檢查點。 在系統當機時,間接檢查點可能會比自動檢查點更快、更可預測的復原時間。 間接檢查點提供下列優點:
針對間接檢查點 (部分機器翻譯) 設定之資料庫上的線上交易式工作負載可能會發生效能降低。 間接檢查點可確定中途分頁的數目,低於特定臨界值,如此即可在目標復原時間內完成資料庫的復原。 復原間隔組態選項會使用交易數目來判斷復原時間,而不是使用臟頁數的間接檢查點。 在收到大量 DML 作業的資料庫上啟用間接檢查點時,背景寫入器可開始積極排清磁碟的中途緩衝區,以確保執行復原所需的時間,落在資料庫所設的目標復原時間內。 這可能會在特定系統上造成額外的 I/O 活動,如果磁碟子系統運作超過或接近 I/O 閾值,可能會導致效能瓶頸。
間接檢查點可讓您藉由考慮 REDO 期間的隨機 I/O 成本,可靠地控制資料庫復原時間。 這可讓伺服器實例保持在指定資料庫的復原時間上限內(除非長時間執行的交易造成過多的 UNDO 時間)。
間接檢查點透過在背景中持續將髒頁面寫入磁碟,來減少檢查點相關的 I/O 尖峰。
不過,針對間接檢查點設定的資料庫上的在線交易式工作負載可能會降低效能。 這是因為間接檢查點所使用的背景寫入器有時會增加伺服器實例的總寫入負載。
內部檢查點
內部檢查點是由各種伺服器元件產生,以確保磁碟映像符合記錄檔的目前狀態。 內部檢查點是針對下列事件產生的:
已使用 ALTER DATABASE 新增或移除資料庫檔案。
已建立資料庫備份。
系統會針對 DBCC CHECK 明確或內部建立資料庫快照集。
執行需要資料庫關機的活動。 例如,AUTO_CLOSE 為 ON,當最後一個用戶連線到資料庫被關閉,或進行需要重新啟動資料庫的資料庫選項變更時。
SQL Server 實例會藉由停止 SQL Server (MSSQLSERVER) 服務來停止。 這兩個動作都會在 SQL Server 實例的每個資料庫中造成檢查點。
使 SQL Server 故障移轉叢集實例(FCI)離線。
相關工作
變更伺服器實例上的復原間隔
在資料庫上設定間接檢查點
在資料庫中建立手動檢查點
相關內容
- 交易記錄檔實體架構(在 SQL Server 2008 R2 線上書籍中)