假設檢查點未發生,電源故障對恢復有何影響?
當一個 INSERT 查詢被觸發時,SQL Server 將其記錄在其日誌中並向使用者發送查詢已完成的確認資訊。同時它也更新數據頁。這兩者(日誌和數據頁)都駐留在記憶體中。
無論恢復模式(簡單、批量或完整)如何,只要出現檢查點,SQL Server 就會將日誌和臟頁從記憶體刷新到磁碟中。
問題:假設在向使用者發送確認後,在檢查點之前發生電源故障,那麼,由於記憶體中的日誌還沒有寫入磁碟,即使使用者得到了確認,這個 INSERT 操作是否會失去?這是否違反了 ACID 的持久屬性?
SQL Server 中的預設行為是完全持久的事務送出。這意味著在事務被確認為已送出之前,事務被硬化到磁碟上。根據文件:
SQL Server 事務送出可以是完全持久的、SQL Server 預設的,也可以是延遲持久的(也稱為延遲送出)。
完全持久的事務送出是同步的,並且僅在事務的日誌記錄寫入磁碟後才將送出報告為成功並將控制權返回給客戶端。
–
延遲事務持久性是使用非同步日誌寫入磁碟來實現的。事務日誌記錄保存在緩衝區中,並在緩衝區填滿或發生緩衝區刷新事件時寫入磁碟。
可以在數據庫級別、在事務語句和本機編譯的儲存過程上顯式設置持久性。有關詳細資訊,請參閱連結資源。
正如@ik_zelf 所指出的,對耐用性有一個警告。對於啟用了寫入記憶體的儲存,當儲存控制器將寫入操作儲存在其記憶體中時,將獲得寫入成功的確認。如果出現電源故障,寫入可能會失去。這就是為什麼有用於磁碟控制器的 UPS 系統和電池備份記憶體模組的原因。
當然,如果日誌文件儲存在 RAM 驅動器上,那將是一大堆蠕蟲。
問:這個 INSERT 操作會在電源故障中失去嗎?
對於主要問題 - 據我了解 - 請參閱 Itzik Ben-Gan 的優秀文章:Understanding log buffer flushes,其中包括其他詳細說明:
SQL Server 強制執行事務持久性的方式部分是通過確保在將控制權返回給呼叫者之前將所有事務的更改寫入磁碟上 的數據庫事務日誌。在確認事務送出後發生電源故障的情況下,您知道所有這些更改至少已寫入磁碟事務日誌。…
其他問題/說明:
問:那麼日誌先寫入緩衝區,在檢查點刷新到磁碟是什麼意思?如果日誌已經在磁碟上,那麼將日誌刷新到磁碟的目的是什麼?
A:日誌緩衝區在記憶體中。日誌緩衝區刷新到磁碟的條件之一是:
SQL Server 收到一個送出請求
$$ fully durable $$更改數據的事務。