SQL数据库使用Powershell设置恢复变量

时间:2017-05-26 20:31:08

标签: sql-server powershell dbatools

情况:

我们有一个托管应用程序,我们需要直接访问SQL服务器但不能。解决方法是主机通过SFTP提供每周备份。

我有一个使用WinSCP下载备份的脚本:

运行CMD批处理脚本以运行WinSCP脚本(保存并在WinSCP目录中运行)

WinSCP.com /script=sftpscript.txt

WinSCP脚本运行:

 open sftp://<<Serveraddress and login>><<REMOTE SFTP DIRECTORY>>
 synchronize local -delete "<<LOCAL DIRECTORY" "<<REMOTE SFTP DIRECTORY>>"
 exit

下载的备份在文件名末尾有一个时间戳: 的 BACKUP_20170526_222744.BAK

我需要自动查询更新文件名并使用该文件名作为变量来恢复备份。我已经想出如何拉动文件名并在Powershell中设置为变量:

set-location -path '<<LOCAL BACKUP DIRECTORY>>'
$bak = ls | where-object {$_.Name -Like '*.BAK'} | select-object -expandproperty name

在TSQL中恢复数据库我目前使用以下脚本,但手动输入备份文件名:

USE [master]
ALTER DATABASE [DB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
RESTORE DATABASE [DB] FROM  DISK = N'<<LOCAL DIRECTORY>>\<<BACKUP FILE>>' WITH  FILE = 1,  MOVE N'DB' TO N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DB.mdf',  MOVE N'DB_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DB_log.ldf',  NOUNLOAD,  REPLACE,  STATS = 5
GO
ALTER DATABASE [DB] SET MULTI_USER
GO

USE [DB]
GO
CREATE USER [Reader] FOR LOGIN [Reader]
GO
USE [DB]
GO
ALTER ROLE [db_datareader] ADD MEMBER [Reader]
GO

Powershell和TSQL脚本目前都按预期执行。 Powershell将$ bak变量设置为备份的正确文件名 SQL脚本将恢复备份,但仅在手动输入备份的文件名时才会恢复。

我的问题是在我的TSQL脚本中使用Powershell Variable $ bak。

请注意,对于Powershell和TSQL,我处于入门级别。

以下是根据Shawn Melton的答案完成此操作的命令:

Restore-DBADatabase -SqlInstance localhost -path 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup' -WithReplace -UseDestinationDefaultDirectories

invoke-sqlcmd -inputfile "Permission.sql" -serverinstance localhost

权限脚本

USE [DB]
GO
CREATE USER [Reader] FOR LOGIN [Reader]
GO
USE [DB]
GO
ALTER ROLE [db_datareader] ADD MEMBER [Reader]
GO

在WinSCP命令将备份放入目录后使用此命令。

1 个答案:

答案 0 :(得分:1)

您可以使用名为dbatools的基于社区的模块。您需要的命令是Restore-DbaDatabase,可以找到完整代码here

如果每次只保留一个备份文件进行恢复,只需调用恢复功能并将其指向目录即可。它将获取备份然后将其恢复,因为它只是一个完整的备份。

作为示例,如果您将备份文件拉到C:\MSSQL\Backups,那么您的SQL Server实例也可以访问该目录。您可以运行此代码:

Import-Module dbatools
Restore-DbaDatabase -SqlServer SQLInstanceName -Path 'C:\MSSQL\Backups' -WithReplace `
-DestinationDataDirectory 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\' `
-DestinationLogDirectory 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\'

您可以查看命令的帮助以查看其他参数选项。我经常使用的是添加-OutputScriptOnly,如果你想在不同的进程/方法中运行它,这将为你生成T-SQL脚本。