程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> Microsoft SQL Server事務日志的應用

Microsoft SQL Server事務日志的應用

編輯:關於SqlServer

我們知道,SQL Server事務日志主要是用來記錄所有事務對數據庫所做的修改,如果系統出現故障,它將成為最新數據的唯一來源。日志的操作常有以下幾個應用:

一、事務日志文件LDF的丟失

當我們不小刪除或者LDF文件丟失的時候,數據庫只剩下MDF文件,此時直接通過附 加MDF是無法恢復數據庫的,那我們怎麼樣才能恢復數據庫呢?我們可以把SQL Server的日志文件分為兩種形式:一類是無活動事務的日志,另一類是有活動事務的日志,我們分別根據兩種情況來進行數據庫恢復。

1、無活動事務的日志恢復

當文件並沒有發生活動性的日志,我們就可以很容易的利用MDF文件就可以直接恢復數據庫了,具體操作方法如下:

(1)數據庫要是沒有日志,就會處於置疑的狀態,我們先可以通過企業管理器中在對應數據庫中點擊右鍵,然後在“所有任務”下選擇“分離數據庫”把數據庫進行分離;

(2)利用MDF文件附加數據庫生成新的日志文件,可用企業管理器中數據庫點擊右鍵選擇“所有任務”下的“附加數據庫”把數據庫附加上。

這樣就可以直接恢復好數據庫了,而如果數據庫的日志文件中含有活動事務,利用此方法就不能恢復數據庫,所以得使用下面的方法。

2、有活動事務的日志恢復

當日志發生了事務的記錄,丟失的時候,我們采用如下的方法來實現:

(1)新建一個同名的數據庫,如原數據庫名為MYDB,然後停止SQL Server服務器,再把數據庫主數據MDF文件移走,然後重新啟動SQL Server服務器,新建一個同名的數據庫MYDB,然後再停止SQL Server服務器,把移走的MDF文件再覆蓋回來,然後再重新啟動SQL Server服務器,在默認的情況下,系統表是不允許被修改的,我們需要運行以下語句才可以,在查詢分析器中,選擇Master數據庫,然後執行:

Sp_configure 'allow updates',1

Reconfigure With Override

接著運行以下語句,把Sysdatabases表中MYDB數據庫的status屬性設為‘37268’,把MYDB數據庫設置為緊急模式。

update sysdatabases set status=32768 where name=’MYDB’

然後再把數據庫MYDB設置為單用戶模式,然後重啟SQL Server服務器,並把數據庫MYDB設為單用戶模式

Sp_dboption 'MYDB','single user', 'true'

再運行以下語句,檢查數據庫MYDB

DBCC CHECKDB(‘MYDB’)

(2)還原數據庫的狀態

運行以下語句,就可以把數據庫的狀態還原:

Update Sysdatabases Set status=28 Where name=’MYDB’

Sp_Configure ’allow updates’,0

Reconfigure With Override

此時的數據庫仍不能工作,還要進行以下的操作,才能恢復。


(3)利用DTS的導入導出向導,把數據庫MYDB導入到一個新建數據庫 MYDBNEW中,然後新建一個數據庫MYDBNEW,右擊MYDBNEW,選擇“所有任務”下的“導出數據”功能,打開導入向導,把表結構、數據視圖和 存儲過程導入到MYDBNEW中,然後再用此功能把MYDBNEW庫替換成原來的MYDB庫即可。

可以知道,恢復一個有活動事務的日志是麻煩多了,所以在數據庫維護的時候,切不要小看事務日志。

二、事務在不斷增大的時候如何縮小日志

當數據如在頻繁修改或者刪除的同時,事務的日志就會不斷的增加,甚至超過了碰盤的大小,這時候就不能因此而直接刪除了事務日志的LDF文件,否則可能會帶來很大的麻煩。為了避免這種情況,我們需要有如下的操作:

(1)盡量避免tempdb 日志與用戶數據庫日志放在同一磁盤上,tempdb 數據庫和事務日志具有足夠的空間來處理索引操作。不能在索引操作完成之前截斷 tempdb 事務日志。

(2)通過執行下列命令來縮小事務日志

DBCC SHRINKDATABASE

DBCC SHRINKFILE

操作會立即嘗試將物理日志文件收縮為所要求的大小。

如果虛擬日志文件中的邏輯日志未超出 target_size 標記,則釋放 target_size 標記之後的虛擬日志文件,並成功完成 DBCC 語句,不顯示任何信息。

如果虛擬日志中的邏輯日志超出了 target_size 標記,SQL Server Database Engine 將釋放盡可能多的空間並顯示一個信息性消息。該消息告訴您必須執行什麼操作來從文件尾部的虛擬日志中刪除邏輯日志。執行完該操作後,可以重新發出 DBCC 語句以釋放剩余的空間。

DBCC SHRINKFILE 語句還顯示一個信息性消息,指出它不能釋放所要求的全部空間,並告訴您可以執行 BACKUP LOG 語句來釋放剩余的空間。

三、事務日志的還原

事務日志在還原的時候可以選擇三種恢復模式:簡單模式、完整模式和大容量日志模式。

簡單恢復模式

此模式簡略地記錄大多數事務,所記錄的信息只是為了確保在系統崩潰或還原數據備份之後數據庫的一致性。

由於舊的事務已提交,已不再需要其日志,因而日志將被截斷。截斷日志將刪除備份和還 原事務日志。但是,這種簡化是有代價的,在災難事件中有丟失數據的可能。沒有日志備份,數據庫只可恢復到最近的數據備份時間。如果您使用的是 SQL Server Enterprise Edition,需要考慮此問題。此外,該模式不支持還原單個數據頁。

完整恢復模式

此模式完整地記錄了所有的事務,並保留所有的事務日志記錄,直到將它們備份。在 SQL Server Enterprise Edition 中,完整恢復模式能使數據庫恢復到故障時間點。

大容量日志恢復模式

此模式簡略地記錄大多數大容量操作(例如,索引創建),完整地記錄其他事務。

大容量日志恢復提高大容量操作的性能,常用作完整恢復模式的補充。大容量日志恢復模 式支持所有的恢復形式,但是有一些限制,備份包含大容量日志記錄操作的日志時,需要訪問數據庫內的所有數據文件。如果數據文件不可訪問,則無法備份最後的 事務日志,而且該日志中所有已提交的操作都將丟失。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved