gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:56:31 24 4
gpt4 key购买 nike

情况:

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

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

运行 CMD Batch Script 运行 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 脚本将恢复备份,但前提是手动输入备份的文件名。

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

请注意,我在 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 的基于社区的模块。 .您想要的命令是 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 脚本。

关于sql-server - SQL 数据库恢复使用 Powershell 设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44209737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com