SQL SERVER的交易記錄

來源:互聯網
上載者:User

標籤:epg   ges   pip   ttf   運行時   cifs   usb   sbo   tac   

1 基本介紹

    每個資料庫都具有交易記錄,用於記錄所有事物以及每個事物對資料庫所作的操作。

    日誌的記錄形式需要根據資料庫的復原模式來確定,資料庫復原模式有三種:

  • 完整模式,完全記錄事物日誌,需要定期進行記錄備份。
  • 大容量記錄模式,適用於大量操作的資料庫,可以以更壓縮的方式處理日誌,需要定期進行記錄備份。
  • 簡單模式,也有記錄檔,只是該模式下可以通過checkpoint自動重用virtual log file,所以記錄檔會處於一直重複使用的過程,保持一定大小,但是,如果有一個事務啟動,很久沒有commit,那麼從這個事務開始到最後commit的時間段內的交易記錄儲存空間都無法checpoint自動重用,這時,你很可能看到一個很大的記錄檔;注意,簡單模式下是無法進行記錄備份

    資料庫裡邊,任何對資料庫的讀寫都是在記憶體頁中找到對應的資料也,再做修改,如果記憶體頁中不存在資料頁,則從磁碟載入如記憶體中。當一個修改操作發生時,修改的將是記憶體頁中對應的資料頁面,同時也會即時記錄到日後檔案ldf中。那麼,什麼時候資料會被同步到mdf檔案呢,只有以下三種情況:

  • 做checkpoint時,後續會專門整理checkpoint的相應文章;
  • Lazy write運行時,即記憶體出現壓力,需要把記憶體中的資料頁寫入到磁碟,騰出記憶體空間;
  • eager write時,即發生bulk insert和select into操作時。

    DB中的交易記錄記錄,可以給我們帶來很多好處,它可以支援以下操作:

  • 恢複個別的事務。
  • 在 SQL Server 啟動時恢複所有未完成的事務。
  • 將還原的資料庫、檔案、檔案組或頁前滾至故障點。
  • 支援事務複製。
  • 支援高可用性和災難恢複解決方案:AlwaysOn 可用性群組、資料庫鏡像和記錄傳送。
2 對資料庫啟動的影響    當資料庫重啟或者還原到最後的時候,資料庫都會進入 recovery狀態,正常情況下,這個狀態期間在幾十秒間,但是特殊情況下,它會花費非常長的時間,甚至幾個小時,如果這個步驟失敗,資料庫則進入到掛起 suspect狀態,無法正常提供使用。     那麼,當資料庫進入 recovery 的時候,它在操作些什麼呢?     SQL SERVER日誌會記錄所有修改記錄(資料的修改情況,不包含SQL語句),包括Begin Transaction和Commit / Rollback Transaction 操作。由於對交易記錄的修改,要比資料檔案的修改要快,所有會出現,資料修改更新到了記錄檔,但是還沒有落盤到資料檔案,那麼這個時候資料庫就處於recovery狀態,同時對交易記錄最近的一個checkpoint點以後的所有資料修改記錄做以下檢查:     所有檢查結束後,則會對資料庫做一個checkpoint的表示,並寫入交易記錄中,表明記錄檔跟資料檔案已經同步結束,完成了recovery過程,資料庫可正常提供使用。這裡需要注意一點,如果你資料庫最近一次checkpoint到現在的修改操作足夠多,那麼將會耗費相對較長時間來檢查,同時也能夠在 error log中看到百分比標識的recovery完成進展,避免漫無目的的等待。Error Log的檢查,可以通過圖形介面(見)查看當前日誌,也可以運行xp_readerrorlog 查詢。
 1 /* 2 xp_readerrorlog 3 1. 存檔編號 4 2. 日誌類型(1為SQL Server日誌,2為SQL Agent日誌) 5 3. 查詢包含的字串 6 4. 查詢包含的字串 7 5. LogDate開始時間 8 6. LogDate結束時間 9 7. 結果排序,按LogDate排序(可以為降序"Desc" Or 升序"Asc"),預設升序10 */11  12 Exec xp_readerrorlog 0,1,Null,Null,‘2017-02-16 10:53:32.300‘,‘2017-02-16 12:53:32.300‘

 

     假設出現這種情況,由於上線的重要程度遠遠重要過 資料丟失的情況,並且你跟所有部門溝通確認 可以承擔 data file跟log file之間的差異資料的丟失,那麼你可以按以下步驟操作, 嚴重建議不要這麼操作,因為會帶來不可預估的資料丟失情況, 如果你命懸一線,真打算放棄這部分資料,那麼,可以按照以下操作:
 1 #設定資料庫單使用者 2 alter database backupdb set single_user with rollback immediate 3  4 #設定資料庫緊急狀態 5 alter database backupdb set emergency with rollback immediate 6  7 #擷取交易記錄的實體名稱和邏輯名後,重建記錄檔 8 select name,physical_name from sys.master_fiels where database_id=db_id(‘backupdb‘) 9 alter database backupdb rebuild log on (name=‘交易記錄的邏輯名‘,filename=‘交易記錄的實體名稱詞‘)10 11 #設定資料庫online12 alter database backupdb set online with rollback immediate13 14 #設定資料庫為多使用者15 alter database backupdb set multi_user with rollback immediate
3 記錄檔添加方式    日誌記錄在 尾碼名為 ldf的檔案,允許有多個記錄檔,但是不會並發分開記錄日誌,而是使用填充滿一個記錄檔後,再轉向一個記錄檔,線性動作記錄檔案。    可以通過下方來添加 ldf檔案,需要注意幾個地方:
  • 初始大小,建議直接設定為 截斷日誌的期間內最大值,比如,某DB 復原模式是完整模式,每隔半個小時做一次交易記錄備份且截斷日誌,那麼設定 記錄檔大小的時候,取業務高峰期 每半小時的日誌增長 最大值是5G,則可設定初始大小為 5G-7G之間;
  • 增長大小,無論是 按比例增長還是按照MB增長,都不要設定過小,建議每次增長在100Mb左右,減少使用到自動成長,在最初設定的初始大小就滿足其增長需求 ,如果開始設定的 初始大小 偏小,不滿足,可以挑一個業務低峰期,修改變大初始大小。每一次檔案自動成長期間,都會對寫入的日誌造成堵塞,雖然時間很短,但是如果增長頻繁,則會影響資料庫操作;
  • 自動成長,建議設定為自動成長,但是前提定期監控日誌的增長情況,避免磁碟空間不足,同時,如果復原模式是 完整模式或者大容量模式,還需定期做記錄備份截斷日誌,避免 交易記錄已滿的9002錯誤;
  • 直接選取,建議與 mdf 檔案放在不同的磁碟上,分散IO,若是磁碟讀寫瓶頸不大,則可放在一個磁碟上;
添加方式有2種,如下:
 1 USE [master] 2 GO 3 ALTER DATABASE [backupdb] 4 ADD LOG FILE ( 5                NAME = N‘backupdb_log_1‘, 6                FILENAME = N‘D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\backupdb_log_1.ldf‘ , 7                         SIZE = 524288KB , 8                         MAXSIZE = 1048576KB , 9                         FILEGROWTH = 10240KB10                       )11 GO

4 物理結構      資料庫的交易記錄映射在一個或者多個的物理檔案上,從概念上講,記錄檔是一系列的日誌記錄;從物理上講,日誌記錄序列被有效儲存在實現交易記錄的物理檔案中。    SQL Server 資料庫引擎在內部將每一物理記錄檔分成多個虛擬記錄檔,即VLF(Virtual Log File),虛擬記錄檔沒有固定大小,且物理記錄檔所包含的虛擬記錄檔數不固定。資料庫引擎在建立或擴充記錄檔時 動態選擇虛擬記錄檔的大小。資料庫引擎嘗試維護少量的虛擬檔案。在擴充記錄檔後,虛擬檔案的大小是現有日誌大小和新檔案增量大小之和。    只有當記錄檔使用較小的 size 和 growth_increment 值定義時,虛擬記錄檔才會影響系統效能。如果這些記錄檔由於許多微小增量而增長到很大,則它們將具有很多虛擬記錄檔。這會降低資料庫啟動以及記錄備份和還原作業的速度。 建議您為記錄檔分配一個接近於最終所需大小的size值,並且還要分配一個相對較大的 growth_increment 值。    管理員不能配置或設定虛擬記錄檔的大小或數量,但是 在VLF影響系統效能的情況下,可以嘗試縮小,通過收縮記錄檔的方式 dbcc loginfo(dbname) 返回的行數,即為 VLF 檔案個數,當status為0時,即該檔案沒有被使用,還能寫入LOG,2表示已被使用,並且無法重用,這個時候,可以通過 backup Log 的形式,備份並截斷LOG檔案,則可以回收 從最後一個0到最近一個2行的空間。收縮記錄檔或者減少VLF檔案的方式如下,需要先備份記錄檔,才可以有效進行收縮,在沒有備份記錄檔的情況下,進行收縮,效果不大。詳見以下代碼: 
 1 #其行數及為VLF個數,status為0表示檔案未用,為2表示已被使用,無法重用 2 dbcc loginfo  3  4 #備份日誌 5 BACKUP LOG [backupdb] 6 TO  DISK = N‘D:\data\20170215_backupdb_log.trn‘ WITH NOFORMAT, NOINIT,  NAME = N‘backupdb-交易記錄  備份‘, SKIP, NOREWIND, NOUNLOAD,  STATS = 10 7 GO 8  9 #收縮記錄檔,根據記錄檔名來收縮500Mb,建議收縮大小是合理大小,參考上文的 初始大小 判斷10 USE [backupdb]11 GO12 SELECT name FROM sys.database_files WHERE type_desc=‘log‘13 DBCC SHRINKFILE (N‘jiankong_db_log‘ , 500)14 GO15 16 #其行數及為VLF個數,VLF檔案減少17 dbcc loginfo

    交易記錄是一種迴繞的檔案。假設,資料庫backupdb只有一個ldf檔案,且剛好分成了5個虛擬日誌,當我們開始使用資料庫的時候,邏輯日誌從物理日誌的最開始端向末端記錄,如。

    當出現checkpoint的時候,則會標註 最小恢複記錄序號 MinLSN,“MinLSN”是成功進行資料庫範圍內復原所需的最早日誌記錄的記錄序號。如。

     在MinLSN之前的所有虛擬記錄檔VLF都可以被截斷,資料庫會在以下兩個事件後自行截斷日誌:
  • 簡單復原模式下,在檢查點之後發生。

  • 在完整復原模式或大量記錄復原模式下,如果自上一次備份後產生檢查點,則在記錄備份後進行截斷(除非是僅複製記錄備份)。
    當截斷日誌的時候,這些VLF就可以被釋放回收,邏輯日誌的開頭也會移動到最後一個被階段VLF檔案末端。     假設這個時候,在MinLSN位置後,發生了一個事務,一直沒有commit,導致VLF3,VLF4,VLF5都被使用,那麼就會重用之前回收的VLF檔案。      正常情況下,如果經常截斷舊的日誌記錄,保持邏輯日誌的末端不到達邏輯日誌的開頭,滿足下一個檢查點之前船艦的所有新日誌記錄都有足夠的空間儲存,那麼記錄檔將永遠不會被填滿,保持一定的大小,可通過定期備份交易記錄來達到。    但是如果,邏輯日誌的結尾跟開頭碰面了,那麼當磁碟空間足夠的情況下,則按照 自動增大大小 指定的數量 增大記錄檔,並在 物理記錄檔中添加多個VLF檔案;如果磁碟空間不足,比指定的 增量大小 要少,那麼就會報錯,出現9002錯誤,導致資料庫無法進行所有寫操作。 5 延遲日誌截斷原因     日誌截斷會由於多種因素髮生延遲。可查詢sys.databases目錄檢視的 log_reuse_waitlog_reuse_wait_desc 列來發現是什麼(如果有)阻止了日誌的截斷。 下表對這些列的值進行了說明。  6 管理交易記錄    定期監控記錄檔的大小跟實際使用大小,以防日誌增長異常,佔滿磁碟空間,可通過以下兩種方式查看 記錄檔使用方式.
1 #查看日誌使用方式,檔案大小及實際使用大小2 dbcc sqlperf(logspace)3 4 #查看檔案相關資訊5 select name,physical_name,size*8.0/1024 size_Mb,* from sys.database_files

    定期記錄備份,兩個備份的間隔是運行遺失資料的時間跨度,不要過於頻繁備份,會對資料庫IO造成一定影響。

1 BACKUP LOG [backupdb]2 TO  DISK = N‘D:\data\20170215_backupdb_log.trn‘ WITH NOFORMAT, NOINIT,  NAME = N‘backupdb-交易記錄  備份‘, SKIP, NOREWIND, NOUNLOAD,  STATS = 103 GO
    事務儘可能短,避免長時間開啟事務,或者忘記commit/roll back;    解決交易記錄已滿問題(9002錯誤)
  • 若是限制了檔案最大值,在磁碟空間有剩餘的情況下,增加記錄檔的大小。
  • 釋放磁碟空間以便日誌可以自動成長。
  • 在其他磁碟上添加記錄檔。
  • 備份日誌後,收縮日誌。
  • 將記錄檔移到具有足夠空間的磁碟機。

 

 

參考文檔:https://msdn.microsoft.com/zh-cn/library/ms189275.aspxhttps://msdn.microsoft.com/zh-cn/library/ms190925(v=sql.110).aspxhttps://msdn.microsoft.com/zh-cn/library/ms190422(v=sql.110).aspxhttps://blogs.msdn.microsoft.com/apgcdsd/2011/12/29/943/https://msdn.microsoft.com/zh-cn/library/ms365418(v=sql.110).aspxhttps://msdn.microsoft.com/zh-cn/library/ms175495(v=sql.110).aspx 

SQL SERVER的交易記錄

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.