SQL 使用 Powershell 设置变量的数据库还原
SQL database Restore using Powershell set Variable
情况:
我们有一个托管应用程序,我们需要直接访问 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 变量 $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命令将备份放入目录后使用此命令。
您可以使用名为 dbatools. The command you would want is Restore-DbaDatabase
, full code can be found here 的基于社区的模块。
如果每次恢复只保留那个备份文件,直接调用恢复函数指向目录即可。它将获取备份然后恢复它,因为它只是一个完整备份。
举个例子,如果您将备份文件下拉到 C:\MSSQL\Backups
,您的 SQL 服务器实例也可以访问该目录。您可以 运行 此代码:
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
,如果你想在不同的 process/method.
中 运行 它,这将为你生成 T-SQL 脚本
情况:
我们有一个托管应用程序,我们需要直接访问 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 变量 $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命令将备份放入目录后使用此命令。
您可以使用名为 dbatools. The command you would want is Restore-DbaDatabase
, full code can be found here 的基于社区的模块。
如果每次恢复只保留那个备份文件,直接调用恢复函数指向目录即可。它将获取备份然后恢复它,因为它只是一个完整备份。
举个例子,如果您将备份文件下拉到 C:\MSSQL\Backups
,您的 SQL 服务器实例也可以访问该目录。您可以 运行 此代码:
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
,如果你想在不同的 process/method.