如何以编程方式将最新的SQL Server备份还原到目标服务器?
我们有混合环境,Azure和本地,我们需要在Azure中备份SQL数据库,然后将其还原到我们用来运行报告的本地SQL Server。
在Azure环境中,我们有一个生产SQL Server,我们将一个特定的数据库备份到Azure blob存储,这是每天午夜完成的。
备份文件格式为databasename_year-month-day.bak
。我们的数据库名为scups
,因此我们的备份名为scups_2017-11-14.bak
,scups_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
答案 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;