SQLServer事務(wù)日志的幾個(gè)常用操作

字號(hào):

我們知道,SQL Server事務(wù)日志主要是用來(lái)記錄所有事務(wù)對(duì)數(shù)據(jù)庫(kù)所做的修改,如果系統(tǒng)出現(xiàn)故障,它將成為最新數(shù)據(jù)的來(lái)源。日志的操作常有以下幾個(gè)應(yīng)用:
    一、事務(wù)日志文件LDF的丟失
    當(dāng)我們不小刪除或者LDF文件丟失的時(shí)候,數(shù)據(jù)庫(kù)只剩下MDF文件,此時(shí)直接通過(guò)附加MDF是無(wú)法恢復(fù)數(shù)據(jù)庫(kù)的,那我們?cè)趺礃硬拍芑謴?fù)數(shù)據(jù)庫(kù)呢?我們可以把SQL Server的日志文件分為兩種形式:一類是無(wú)活動(dòng)事務(wù)的日志,另一類是有活動(dòng)事務(wù)的日志,我們分別根據(jù)兩種情況來(lái)進(jìn)行數(shù)據(jù)庫(kù)恢復(fù)。
    1、無(wú)活動(dòng)事務(wù)的日志恢復(fù)
    當(dāng)文件并沒有發(fā)生活動(dòng)性的日志,我們就可以很容易的利用MDF文件就可以直接恢復(fù)數(shù)據(jù)庫(kù)了,具體操作方法如下:
    1)數(shù)據(jù)庫(kù)要是沒有日志,就會(huì)處于置疑的狀態(tài),我們先可以通過(guò)企業(yè)管理器中在對(duì)應(yīng)數(shù)據(jù)庫(kù)中點(diǎn)擊右鍵,然后在“所有任務(wù)”下選擇“分離數(shù)據(jù)庫(kù)”把數(shù)據(jù)庫(kù)進(jìn)行分離;
    2)利用MDF文件附加數(shù)據(jù)庫(kù)生成新的日志文件,可用企業(yè)管理器中數(shù)據(jù)庫(kù)點(diǎn)擊右鍵選擇“所有任務(wù)”下的“附加數(shù)據(jù)庫(kù)”把數(shù)據(jù)庫(kù)附加上。
    這樣就可以直接恢復(fù)好數(shù)據(jù)庫(kù)了,而如果數(shù)據(jù)庫(kù)的日志文件中含有活動(dòng)事務(wù),利用此方法就不能恢復(fù)數(shù)據(jù)庫(kù),所以得使用下面的方法。
    2、有活動(dòng)事務(wù)的日志恢復(fù)
    當(dāng)日志發(fā)生了事務(wù)的記錄,丟失的時(shí)候,我們采用如下的方法來(lái)實(shí)現(xiàn):
    1)新建一個(gè)同名的數(shù)據(jù)庫(kù),如原數(shù)據(jù)庫(kù)名為MYDB,然后停止SQL Server服務(wù)器,再把數(shù)據(jù)庫(kù)主數(shù)據(jù)MDF文件移走,然后重新啟動(dòng)SQL Server服務(wù)器,新建一個(gè)同名的數(shù)據(jù)庫(kù)MYDB,然后再停止SQL Server服務(wù)器,把移走的MDF文件再覆蓋回來(lái),然后再重新啟動(dòng)SQL Server服務(wù)器,在默認(rèn)的情況下,系統(tǒng)表是不允許被修改的,我們需要運(yùn)行以下語(yǔ)句才可以,在查詢分析器中,選擇Master數(shù)據(jù)庫(kù),然后執(zhí)行:
    Sp_configure 'allow updates',1
    Reconfigure With Override
    接著運(yùn)行以下語(yǔ)句,把Sysdatabases表中MYDB數(shù)據(jù)庫(kù)的status屬性設(shè)為‘37268’,把MYDB數(shù)據(jù)庫(kù)設(shè)置為緊急模式。
    update sysdatabases set status=32768 where name=’MYDB’
    然后再把數(shù)據(jù)庫(kù)MYDB設(shè)置為單用戶模式,然后重啟SQL Server服務(wù)器,并把數(shù)據(jù)庫(kù)MYDB設(shè)為單用戶模式
    Sp_dboption 'MYDB','single user', 'true'
    再運(yùn)行以下語(yǔ)句,檢查數(shù)據(jù)庫(kù)MYDB
    DBCC CHECKDB(‘MYDB’)
    2)還原數(shù)據(jù)庫(kù)的狀態(tài)
    運(yùn)行以下語(yǔ)句,就可以把數(shù)據(jù)庫(kù)的狀態(tài)還原:
    Update Sysdatabases Set status=28 Where name=’MYDB’
    Sp_Configure ’allow updates’,0
    Reconfigure With Override
    此時(shí)的數(shù)據(jù)庫(kù)仍不能工作,還要進(jìn)行以下的操作,才能恢復(fù)。
    3)利用DTS的導(dǎo)入導(dǎo)出向?qū)?,把?shù)據(jù)庫(kù)MYDB導(dǎo)入到一個(gè)新建數(shù)據(jù)庫(kù)MYDBNEW中,然后新建一個(gè)數(shù)據(jù)庫(kù)MYDBNEW,右擊MYDBNEW,選擇“所有任務(wù)”下的“導(dǎo)出數(shù)據(jù)”功能,打開導(dǎo)入向?qū)?,把表結(jié)構(gòu)、數(shù)據(jù)視圖和存儲(chǔ)過(guò)程導(dǎo)入到MYDBNEW中,然后再用此功能把MYDBNEW庫(kù)替換成原來(lái)的MYDB庫(kù)即可。
    可以知道,恢復(fù)一個(gè)有活動(dòng)事務(wù)的日志是麻煩多了,所以在數(shù)據(jù)庫(kù)維護(hù)的時(shí)候,切不要小看事務(wù)日志。