萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mssql數據庫 >> SQL SERVER 事務日志

SQL SERVER 事務日志

   談到事務日志就不得不談下檢查點 Checkpoint ,簡稱 CKP. 事務日志和檢查點都是為了數據庫的快速恢復而存在的。我們需要知道檢查點是干什麼的,它和事務日志有什麼關系。

  CKP是干什麼的?

  總所周知,數據的更改並沒有直接寫入mdf/ndf 數據文件中,而是寫入了buffer pool中; 當CKP被觸發後,檢查點將“全部”髒數據頁從當前數據庫的buffer pool刷新到數據文件上。所謂的髒數據,是那些被更改的 data page ,在內存中卻沒有寫入磁盤。全部髒數據包括已提交的數據更改和未提交的數據更改。刷新到數據文件是指將數據更改的後鏡像copy寫入數據文件,對數據的更改會保留一個前鏡像和一個後鏡像,好比我們修改文章,先保存原文作為前鏡像,而後將修改後的文章作為後鏡像。同時CKP也會flush cached log 到日志文件中 點擊打開鏈接 .我更願意將CKP看作是一個鬧鐘,我們可以對它按照一個規則定時,然後提醒SQL的部件data writer / log writer去干活。

  總之,大多數情況下,什麼時候數據更改寫入數據文件,是由CKP決定的。

  CKP什麼時候被觸發

  備份數據庫 (全備,差異備份,日志備份)

  checkpoint命令

  關閉數據庫

  Alter database命令

  自動的檢查點觸發 (SQL依據recovery interval 服務器配置選項建議的時間上限觸發檢查點 或者日志已滿 70%觸發檢查點)

  間接檢查點 (SQL 2012 新特性 ,詳情參與點擊打開鏈接)

  CKP, Lazywriter, Eagerwriter的區別

  總所周知這三個SQL的process都會將髒數據寫入數據文件,但是它們的目的和觸發條件完全不同

  CKP的使用目的是為了在SQL intance停止後(例如斷電),快速的instance recovery。它是一個時間點的標記,標記了數據庫恢復的起始點。在這個起始點,所有的髒數據copy都寫入了磁盤(它不會釋放內存空間),從而在以後的恢復過程中節省時間。

  Lazy writer是為了更好的利用buffer pool。 它會定期檢查data cache,按照LRU算法,將長期未使用到的dirty page 寫入磁盤, 清除dirty page釋放內存空間。

  Eager writer 是為BCP等批量插入而存在的。該進程會寫入與無日志記錄的操作(例如大容量插入和選擇插入)相關聯的髒數據頁。該進程允許以並行方式創建和寫入新頁。也就是說,調用操作不必等待整個操作完成,即可將頁寫入磁盤 (摘於msdn點擊打開鏈接 )。這樣可以保證Buffer Pool有足夠的空間完成批量操作。

  CKP和事務日志有什麼關系呢?

  與其說是與事務日志的關系,不如說是與事務日志序列號(Log Sequence Number, 簡稱LSN)的關系,在我以後的blog會對LSN做闡述。

  檢查點觸發有一個起始時間點,這個時間點會被記錄在事務日志裡,獲得一個CKP起始時間點LSN。當完成髒數據寫後,CKP同樣在日志文件裡記錄一個結束時間點的LSN。檢查點還會記錄一個最小恢復LSN (minLSN), minLSN必須存在檢查點記錄裡才能成功進行回滾(roll back / undo), minLSN告訴了SQL Server 可以回滾的最遠時間點。至於minLSN是什麼,SQL如何定義minLSN,SQL server如何使用它,在我以後的blog做闡述)這裡只要記住CKP會紀錄這個minLSN,它很對undo很重要。

copyright © 萬盛學電腦網 all rights reserved