如何以编程方式恢复最新备份



如何以编程方式将最新的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.bakscups_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;

最新更新