SQL SERVER完整、差異和事務日志備份及還原(腳本和GUI實現) [原創]


一.完整備份、差異備份和事務日志備份的腳本

--完整備份數據庫

BACKUP DATABASE Test_Bak TO DISK = 'E:\20150609_75\bak\Test_bak_full.bak' WITH INIT

--差異備份數據庫

BACKUP DATABASE Test_Bak TO DISK = 'E:\20150609_75\bak\Test_bak_diff.bak' WITH INIT, DIFFERENTIAL   --加上DIFFERENTIAL代表差異備份

--事務日志備份

BACKUP LOG Test_Bak TO DISK = 'E:\20150609_75\bak\Test_bak_log.bak' WITH INIT   --BACKUP LOG表示備份事務日志,BACKUP DATABASE表示完整或差異備份

--備份事務日志,文件名中包含當前時間,適合定時備份

DECLARE @strbackup NVARCHAR(100)
 --改為日期加時間的
 SET @strbackup = 'E:\20150609_75\bak\Test_bak_log_'
     + REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR, GETDATE(), 120), '-', ''), ' ',
                      ''), ':', '') + '.bak'
 BACKUP LOG Test_Bak TO DISK = @strbackup WITH INIT;
 GO

 

二. 還原需要修改數據文件路徑的多文件數據庫(做過分區的)

錯誤:

wps9779.tmp

上面錯誤的原因為:原來備份的數據文件在G盤下,還原完整備份時新服務器下不存在G盤這個路徑就會報錯。

解決辦法:可以使用WITH MOVE讓數據文件保存到新的有效路徑下,首先在磁盤下建立這個有效路徑。

正確的還原多文件備份的方法如下:

方法1(腳本):

還原完整備份:

RESTORE DATABASE [DigitalLibDB] 
FROM  DISK = N'E:\20150609_75\DigitalLibDB_20150609_FULL.bak'   --完整備份的路徑
WITH  MOVE 'DigitalLibDB_Data' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB.mdf',  
    MOVE 'UI0' TO 'C:\Program Files\Microsoft SQL   --重新指定文件的路徑,取決文件數量Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_1.ndf',
    MOVE 'UI1' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_2.ndf',
    MOVE 'UI10' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_3.ndf',
    MOVE 'UI11' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_4.ndf',
    MOVE 'UI12' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_5.ndf',
    MOVE 'UI13' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_6.ndf',
    MOVE 'UI14' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_7.ndf',
    MOVE 'UI15' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_8.ndf',
    MOVE 'UI16' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_9.ndf',
    MOVE 'UI2' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_10.ndf',
    MOVE 'UI3' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_11.ndf',
    MOVE 'UI4' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_12.ndf',
    MOVE 'UI5' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_13.ndf',
    MOVE 'UI6' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_14.ndf',
    MOVE 'UI7' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_15.ndf',
    MOVE 'UI8' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_16.ndf',
    MOVE 'UI9' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_17.ndf',
    MOVE 'ftrow_RegInfo_UnitName' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_18.ndf',
    MOVE 'DigitalLibDB_Log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DigitalLibDB_Log.ldf',
STATS = 10, REPLACE, 
NORECOVERY
GO

WITH MOVE TO:重新指定文件的路徑,WITH MOVE TO數量取決於數據庫文件數量

STATS = 10:沒完成10%顯示一條記錄

REPLACE:覆蓋現有數據庫

NORECOVERY:不對數據庫進行任何操作,不回滾未提交的事務

完整備份結果:

wps978A.tmp

還原差異備份:(只有一個差異備份的情況,當還原多個差異備份時,通常前面的都用WITH NORECOVERY,還原最后一個差異備份才能用WITH RECOVERY)

注:移動數據文件是完整備份時移動,差異備份和日志備份不保存文件路徑,差異備份和日志備份還原時不能移動路徑。

RESTORE DATABASE [DigitalLibDB] FROM DISK='E:\20150609_75\新建文件夾\DigitalLibDB_20150610_Diff.bak' WITH RECOVERY

差異備份還原結果:

wps979A.tmp

方法2:(可視化界面操作)

還原完整備份:

選擇還原數據庫

wps979B.tmp

選擇完整備份路徑

wps97AC.tmp

選擇覆蓋現有數據庫,選擇RESTORE WITH NORECOVERY選項

wps97BD.tmp

還原完整備份成功

wps97BE.tmp

此時,差異備份還未完成,數據庫還處於正在還原狀態

wps97BF.tmp

還原差異備份,選擇任務-還原-文件和文件組

wps97C0.tmp

wps97D0.tmp

wps97D1.tmp

wps97E2.tmp

所以,此時還原這個差異備份還是應該使用腳本來完成,不用移動文件。

RESTORE DATABASE [DigitalLibDB] FROM DISK='E:\20150609_75\新建文件夾\DigitalLibDB_20150610_Diff.bak' WITH RECOVERY --還原差異備份

 

三.不需要修改數據庫文件路徑的差異備份還原

注意:

對於不需要修改數據庫文件路徑的差異備份還原,使用sqlserver可視化界面還原是沒問題的。

wps97E3.tmp

wps97F3.tmp

wps97F4.tmp

此處,還原差異備份成功,原因是備份時文件是C盤下這個目錄,還原時還是還原到C盤這個目錄,不需要修改路徑。

對於不需要修改數據庫文件路徑的數據庫完整備份、差異備份和事務日志備份的還原過程如下(使用腳本):

--還原順序:完整備份--差異備份--日志備份

--還原單文件數據庫的完整備份,數據庫文件路徑一致,不用移動路徑的情況

RESTORE DATABASE [Test_Bak] 
FROM  DISK = N'E:\20150609_75\local\Test_Bak_full.bak' 
WITH 
STATS = 10, REPLACE, 
NORECOVERY
GO

--還原差異備份

RESTORE DATABASE [Test_Bak] 
FROM  DISK = N'E:\20150609_75\local\Test_Bak_diff.bak' 
WITH   
STATS = 10,
NORECOVERY
GO

--還原日志備份

RESTORE DATABASE [Test_Bak] 
FROM  DISK = N'E:\20150609_75\local\Test_Bak_Log.bak' 
WITH   
STATS = 10,
RECOVERY

 

希望對你們有所幫助,如果你覺得不錯,請在右邊推薦一下喔,歡迎拍磚~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM