Quantcast
Viewing all articles
Browse latest Browse all 3160

SQL Server 数据库还原

数据库恢复大多是让人很头痛的部分。比如我,经常需要把生成环境的数据备份下来还原到测试环境中进行新功能的测试。

带我的前辈告诉我的方式是在SSMS中直接右键还原源选择恢复数据的来源数据库,目标选择要还原的数据库。


Image may be NSFW.
Clik here to view.
SQL Server 数据库还原

这种方式的成功率很低!经常会数据库使用中的错误提示:Exclusive access could not be obtained because the database is in use

后来找了两种方式来保证还原时数据库没被使用:

方法一:变成单用户模式

--变成单用户模式 USE master GO ALTER DATABASE test3 --换成你的数据库名 SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO --恢复多用户模式 USE master GO ALTER DATABASE test3 --换成你的数据库名 SET MULTI_USER Go

方法二:脱机

---开始脱机 ALTER DATABASE test --你的数据库名 SET OFFLINE WITH ROLLBACK IMMEDIATE; --恢复联机 ALTER DATABASE test --你的数据库名 SET ONLINE WITH ROLLBACK IMMEDIATE;

这样恢复成功的概率增加了很多,不过依然有一些莫名奇妙的状况导致死活恢复不了。

后来,经过多种查找和尝试,终于找到了比较稳定的方式:

--返回由备份集内包含的数据库和日志文件列表组成的结果集。 --获得逻辑文件名 USE master RESTORE FILELISTONLY FROM DISK = 'C:\Program Files\Microsoft SQL Server\mssql13.MSSQLSERVER\MSSQL\Backup\test.bak' GO --test和test_log是上面查到的逻辑名称 ----注意:当还原数据库时,可以改变数据库的名称以及它的物理文件名称,但是不可以改变它的逻辑名称,所以,当我们将一个数据库还原成为另外一个数据库时,首先要利用RESTORE FILELISTONLY命令得到它的原始逻辑名称 USE master RESTORE DATABASE test2 FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\Backup\test.bak' WITH MOVE 'test' TO 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\test2.mdf', MOVE 'test_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\test_log2.ldf', STATS = 10, --每完成10%显示一条记录 REPLACE ----加上 REPLACE 参数,则在现有数据库基础上强制还原 GO

总结,从备份到还原完整流程整理如下:

/* 从备份生成数据库bak文件到还原到另一个数据库的完整流程 */ USE master BACKUP DATABASE backDB TO DISK = 'D:\Backup\test.bak' -- RESTORE FILELISTONLY FROM DISK = 'D:\Backup\test.bak' -- RESTORE DATABASE restoreDB FROM DISK = 'D:\Backup\test.bak' WITH MOVE 'DBTest' TO 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\test2.mdf', MOVE 'DBTest_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\test_log2.ldf', STATS = 10,REPLACE GO

差异备份还原:

如果要还原差异备份,需要先还原在差异备份时间点之前的一个完整备份,在还原完整备份时要加上NORECOVERY参数。

还原差异备份时,如果只有一个差异备份文件需要还原,无需使用NORECOVERY参数,如果有多个差异备份文件需要还原,除了最后一个差异备份文件,其他都需要加上NORECOVERY参数。

RESTORE DATABASE restoreDB FROM DISK = '差异文件路径' WITH MOVE 'DBTest' TO 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\test2.mdf', MOVE 'DBTest_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\test_log2.ldf', STATS = 10, NORECOVERY GO

参考:

使用bak文件还原SQL Server SQL Server 数据库备份和还原认识和总结(一) SQL Server 数据库备份和还原认识和总结(二) RESTORE DATABASE命令还原SQLServer 2005 数据库 SQL Server的差异备份还原

Viewing all articles
Browse latest Browse all 3160

Trending Articles