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
二. 还原需要修改数据文件路径的多文件数据库(做过分区的)
错误:
上面错误的原因为:原来备份的数据文件在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:不对数据库进行任何操作,不回滚未提交的事务
完整备份结果:
还原差异备份:(只有一个差异备份的情况,当还原多个差异备份时,通常前面的都用WITH NORECOVERY,还原最后一个差异备份才能用WITH RECOVERY)
注:移动数据文件是完整备份时移动,差异备份和日志备份不保存文件路径,差异备份和日志备份还原时不能移动路径。
RESTORE DATABASE [DigitalLibDB] FROM DISK='E:\20150609_75\新建文件夹\DigitalLibDB_20150610_Diff.bak' WITH RECOVERY
差异备份还原结果:
方法2:(可视化界面操作)
还原完整备份:
选择还原数据库
选择完整备份路径
选择覆盖现有数据库,选择RESTORE WITH NORECOVERY选项
还原完整备份成功
此时,差异备份还未完成,数据库还处于正在还原状态
还原差异备份,选择任务-还原-文件和文件组
所以,此时还原这个差异备份还是应该使用脚本来完成,不用移动文件。
RESTORE DATABASE [DigitalLibDB] FROM DISK='E:\20150609_75\新建文件夹\DigitalLibDB_20150610_Diff.bak' WITH RECOVERY --还原差异备份
三.不需要修改数据库文件路径的差异备份还原
注意:
对于不需要修改数据库文件路径的差异备份还原,使用sqlserver可视化界面还原是没问题的。
此处,还原差异备份成功,原因是备份时文件是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
希望对你们有所帮助,如果你觉得不错,请在右边推荐一下喔,欢迎拍砖~