如何以编程方式还原最新备份?

时间:2017-11-15 19:00:51

标签: sql-server

如何以编程方式将最新的SQL Server备份还原到目标服务器?

我们有混合环境,Azure和本地,我们需要在Azure中备份SQL数据库,然后将其还原到我们用来运行报告的本地SQL Server。

在Azure环境中,我们有一个生产SQL Server,我们将一个特定的数据库备份到Azure blob存储,这是每天午夜完成的。

备份文件格式为databasename_year-month-day.bak。我们的数据库名为scups,因此我们的备份名为scups_2017-11-14.bakscups_2017-11-15.bak等。备份大小约为35 Gb,并在几分钟内完成。

On-Prem环境:

本地SQL Server Reporting Services上的Windows任务计划程序运行AZcopy(Azure PowerShell),SQL备份从Azure blob存储下载到其本地磁盘,此过程从凌晨1点45分开始,数据库在一小时内下载

在凌晨5点,我们的本地报告服务器上的恢复作业通过SQL Server代理调用,这将恢复数据库,准备供运行报告的人使用。

此过程有效但问题是,目前我们必须每晚修改SQL Server作业,以便恢复正确的数据库备份日期。

所以,我必须修改SQL Server作业以包含特定文件,例如我们必须用scups_2017-11-15.bak替换scups_2017-11-16.bak,以便恢复11/16的最新数据库备份。

如何修改脚本以便每天早上恢复最新备份? 并且,有没有更好的方法来自动化这个过程?

我很感激任何建议。

这是我们的SQL Server工作:

USE MASTER 
GO

ALTER DATABASE scups 
SET multi_user WITH ROLLBACK IMMEDIATE
GO

-- Now put it into single user mode and drop it. Use Rollback Immediate to disconnect any -- sessions and rollback their transactions. Safe since you are about to drop the DB.
ALTER DATABASE scups
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

DROP DATABASE scups
GO
--pause sleep 2 minutes

USE master

RESTORE DATABASE [scups] 
FILE = N'scups_Data',  
FILE = N'ftrow_fulltext_catalog',  
FILE = N'ftrow_CourseForumEntries' 
FROM DISK = N'C:\download\ScupsFullBackup\scups_2017-11-14.bak' 
WITH FILE = 1,  
MOVE N'scups_Data' TO N'U:\data\scups.mdf',  
MOVE N'ftrow_fulltext_catalog' TO N'U:\data\scups1.ndf',  
MOVE N'ftrow_CourseForumEntries' TO N'U:\data\scups2.ndf',  
MOVE N'scups_Log' TO N'L:\logs\scups_log.ldf', 
RECOVERY, REPLACE, STATS = 10

1 个答案:

答案 0 :(得分:0)

假设备份文件的名称是唯一的变量,您应该可以这样做:

use maintdb;
go

create procedure dbo.restoreScups(@backupFile varchar(4000))
as
begin
ALTER DATABASE scups 
SET multi_user WITH ROLLBACK IMMEDIATE
GO

-- Now put it into single user mode and drop it. Use Rollback Immediate to disconnect any -- sessions and rollback their transactions. Safe since you are about to drop the DB.
ALTER DATABASE scups
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

DROP DATABASE scups
GO
--pause sleep 2 minutes

USE master

RESTORE DATABASE [scups] 
FILE = N'scups_Data',  
FILE = N'ftrow_fulltext_catalog',  
FILE = N'ftrow_CourseForumEntries' 
FROM DISK = @backupfile 
WITH FILE = 1,  
MOVE N'scups_Data' TO N'U:\data\scups.mdf',  
MOVE N'ftrow_fulltext_catalog' TO N'U:\data\scups1.ndf',  
MOVE N'ftrow_CourseForumEntries' TO N'U:\data\scups2.ndf',  
MOVE N'scups_Log' TO N'L:\logs\scups_log.ldf', 
RECOVERY, REPLACE, STATS = 10;

end

然后你可以像PowerShell这样的程序调用这个程序: $ query = @' exec maintdb.dbo.restoreScups @backupFile ='C:\ download \ ScupsFullBackup \ scups_2017-11-14.bak'; @'

invoke-sqlcmd -ServerInstance yourServer -Query $query;