如何以编程方式将最新的SQL Server备份还原到目标服务器?
我们有混合环境,Azure和on-prem,我们需要在Azure中备份SQL数据库,然后将其恢复到用于运行报告的on-prem 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,几分钟内即可完成。
Prem环境:
SQL Server Reporting Services上的Windows任务调度程序运行AZcopy(Azure PowerShell),SQL备份从Azure blob存储下载到其本地磁盘,此过程从凌晨1:45开始,数据库在一小时内下载。
早上5:00,我们的预报告服务器上的恢复作业通过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:downloadScupsFullBackupscups_2017-11-14.bak'
WITH FILE = 1,
MOVE N'scups_Data' TO N'U:datascups.mdf',
MOVE N'ftrow_fulltext_catalog' TO N'U:datascups1.ndf',
MOVE N'ftrow_CourseForumEntries' TO N'U:datascups2.ndf',
MOVE N'scups_Log' TO N'L:logsscups_log.ldf',
RECOVERY, REPLACE, STATS = 10
假设备份文件的名称是唯一的变量,您应该能够执行以下操作:
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:datascups.mdf',
MOVE N'ftrow_fulltext_catalog' TO N'U:datascups1.ndf',
MOVE N'ftrow_CourseForumEntries' TO N'U:datascups2.ndf',
MOVE N'scups_Log' TO N'L:logsscups_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;