SQL Server復(fù)災(zāi) 你懂了嗎?
1.很多時候我們不小心錯誤delete了一下,或者update一下怎么辦,或者直接把數(shù)據(jù)庫刪除了,怎么辦呢,是不是就一定沒有辦法呢?下面讓我來教大家我現(xiàn)學現(xiàn)賣的兩招。
2.當我們不小心刪除表怎么辦?
做之前我們要設(shè)置數(shù)據(jù)庫恢復(fù)模式:
設(shè)置成完整,不要是簡單模式。
首先我們創(chuàng)建一個表:插入幾條數(shù)據(jù)
- CREATE DATABASE test1
- CREATE TABLE A1
- (
- ID INT PRIMARY KEY
- )
- INSERT INTO dbo.A1 ( ID )
- VALUES ( 0 )
- INSERT INTO dbo.A1( ID )
- VALUES ( 2)
- INSERT INTO dbo.A1( ID )
- VALUES ( 3)
- INSERT INTO dbo.A1 ( ID )
- VALUES ( 4 )
- INSERT INTO dbo.A1( ID )
- VALUES ( 5 )
- SELECT * FROM dbo.A1
我們現(xiàn)在有五條數(shù)據(jù)了,我們對數(shù)據(jù)做一個備份
做任何差異備份,和日志之前,一定要做一個完整備份。
我們再插入一條數(shù)據(jù)
- INSERT INTO dbo.A1
- ( ID )
- VALUES ( 6)
- SELECT * FROM dbo.A1
我們看看現(xiàn)在有六條數(shù)據(jù)了。
關(guān)鍵來了:不小心
數(shù)據(jù)刪除了,一條也沒有了怎么辦?
不要慌趕快備份啊。備份數(shù)據(jù)之后,我們開始來恢復(fù),記住一定要備份在恢復(fù)之前哦。這里要做的是日志備份,做完日志備份再恢復(fù)數(shù)據(jù)。
這里要注意時間,我們要選擇恢復(fù)時間,也就是在你刪除的前一刻,然后我們看看6條數(shù)據(jù)又回來了。
3. 我們刪除表數(shù)據(jù)可以恢復(fù),萬一你把數(shù)據(jù)庫服務(wù)down掉,然后刪除了數(shù)據(jù)庫文件沒了呢?
先建表插入數(shù)據(jù)如下:
現(xiàn)在有五條數(shù)據(jù),然后完整備份,再插入一條數(shù)據(jù)。
現(xiàn)在有6條數(shù)據(jù),做個日志備份
#p#
再插入一條數(shù)據(jù)
然后把數(shù)據(jù)庫服務(wù)停掉,然后我們把數(shù)據(jù)庫文件移除掉。
然后把數(shù)據(jù)庫文件放到一個新建的文件夾里面去,但是日志文件還在的,如果日志文件也沒有了,那就求蒼天保佑吧,這也是我們把數(shù)據(jù)文件和日志文件分開的好處之一。
然后我們再啟動服務(wù)
這個時候test1數(shù)據(jù)庫在,但是你打開的時候一定會報錯的。
那么恢復(fù)之前我們需要做一個日志尾備份,因為數(shù)據(jù)庫不能用,所以我們要用。
- backup log test1 to disk='c:\test1.bak' with no_truncate;
我們查看一下我們的備份。
恢復(fù)之前要做一下查看。
檢查備份完整性
- restore verifyonly from disk='c:\test1.bak' ;
查看備份文件數(shù)目
- restore filelistonly from disk='c:\test1.bak' ;
查看備份記錄次數(shù)
- restore headeronly from disk='c:\test1.bak' ;
我們會發(fā)現(xiàn)這里的備份次數(shù)比備份文件夾多了一個記錄,這是為什么呢?
是因為我們做了一個日志尾備份。
好了我們來恢復(fù)數(shù)據(jù)吧。
然后我們恢復(fù)一個數(shù)據(jù)庫test2出來了,然后查詢數(shù)據(jù)
這里我們只有六條數(shù)據(jù)了,而不是七條數(shù)據(jù),有數(shù)據(jù)丟失了怎么辦呢?
原因在:我們可以看到上面我們后臺查出的是三條備份次數(shù),但是結(jié)果只有兩個備份文件記錄,那是不是我們***的日志尾沒有了呢?
不是的這時候我們要手動備份了
- RESTORE DATABASE [test2] FROM DISK = N'C:\test1.bak' WITH FILE = 1, NORECOVERY, replace
- GO
- RESTORE LOG [test2] FROM DISK = N'C:\test1.bak' WITH FILE = 2, NORECOVERY
- GO
- RESTORE LOG [test2] FROM DISK = N'C:\test1.bak' WITH FILE = 3, NORECOVERY
- GO
注意:
- restore headeronly from disk='c:\test1.bak' ;
上面file=1里的1是和我們查出來的 1 2 3 對應(yīng)的。
誒,怎么test2還在還原呢?
哦,原來***一個是NOrecovery我們改成Recovery
- RESTORE DATABASE [test2] FROM DISK = N'C:\test1.bak' WITH FILE = 1, NORECOVERY, replace
- GO
- RESTORE LOG [test2] FROM DISK = N'C:\test1.bak' WITH FILE = 2, NORECOVERY
- GO
- RESTORE LOG [test2] FROM DISK = N'C:\test1.bak' WITH FILE = 3, RECOVERY
- GO
哦,數(shù)據(jù)回來了,看看有七條了。
看到這里你是否有收獲呢?
***我們看一份數(shù)據(jù)
這個數(shù)據(jù)是不是很有規(guī)律啊?
我們可以看到日志備份databasebackuplsn字段數(shù)據(jù)都是***份完整備份的checkpoitlsn的數(shù)據(jù)。
如果這個數(shù)值對不上,我們自求多福吧,恢復(fù)不了了。。。。
有錯誤的地方歡迎大家拍磚,希望交流和共享。
原文鏈接:http://www.cnblogs.com/MR_ke/archive/2011/06/12/2078927.html
【編輯推薦】