Invoke-sqlcmd 等待恢复完成,然后再进行下一个任务
Posted
技术标签:
【中文标题】Invoke-sqlcmd 等待恢复完成,然后再进行下一个任务【英文标题】:Invoke-sqlcmd wait for Restoration to complete before going to next task 【发布时间】:2021-11-23 00:52:15 【问题描述】:我正在运行这个 powershell 脚本,以便在 sql server 上恢复数据库。
$Query = @" EXEC msdb.dbo.sp_start_job N'Job'; GO "@
Invoke-Sqlcmd -ServerInstance .... -Query $Query -Verbose
我得到这个输出 => VERBOSE: 'job' 成功启动。
当我检查 SQL 服务器时,我发现数据库处于恢复状态但没有完成。 我的问题是在传递到下一个任务之前,我需要确保数据库已成功恢复。
我对如何使用其他方法进行了深入研究,例如使用 dbo.restorehistory 来获取结果,但效率不高。
有没有办法让 Invoke-sqlCmd 命令在继续执行脚本之前等待作业完成?
【问题讨论】:
也许将脚本的其余部分放在另一个作业步骤中,只有在完成后才会执行。您可以制作一个 Powershell 作业步骤 感谢您的建议,它并没有解决问题,我需要在恢复完全完成后才能通过 Invoke-sqlcmd 命令。 您是否考虑过使用 Invoke-SqlCmd 直接执行恢复数据库代码,从而同步执行,而不是触发异步 SQL 代理作业? 可能检查 DM 视图中来自sys.dm_exec_requests
的恢复命令,例如mssqltips.com/sqlservertip/2343/…。或者您可以尝试查询工作状态?:***.com/a/18062236/7411885
感谢您的建议,我建议直接进行恢复,但我们的团队希望将步骤保留在 sql server 中,并且只从管道中调用 SQL 代理作业。我找到了确保恢复成功的方法,我会发布它。
【参考方案1】:
我找到了一个解决方案,以确保使用存储过程 sp_help_jobhistory 成功完成恢复,这里是文档链接:https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-help-jobhistory-transact-sql?view=sql-server-ver15。
这是脚本:
[string]$output;
$Query =@"
USE msdb;
GO
declare @temp table
(
job_id varchar(255),
job_name varchar(255),
run_status varchar(255),
run_date varchar(255),
run_time varchar(255),
run_duration varchar(255),
operator_emailed varchar(255),
operator_netsent varchar(255),
operator_paged varchar(255),
retries_attempted varchar(255),
server varchar(255)
);
INSERT @temp Exec dbo.sp_help_jobhistory @job_name = N'JobName';
select top 1 run_status from @temp order by run_date Desc, run_time ;
GO
"@
$output = Invoke-Sqlcmd -ServerInstance xxxxxx -Database xxxxx -Username xxx -Password xxxx -Query $Query
$result = $output.itemArray
if ($result -eq '1')
Write-Host "Restauration succeded"
else Write-Host "Restauration failed"
我使用了一个临时表来读取存储过程的内容,然后通过排序选择查询的结果来执行最后一个作业。
此外,我在测试恢复完成之前的步骤中添加了此脚本,因为在恢复阶段我无法访问数据库。
[string]$sucess = 'false'
$i = 0;
$ErrorActionPreference= 'silentlycontinue'
$query =@"
SELECT * FROM tiers Where id = 1;
GO
"@
do
Invoke-Sqlcmd -ServerInstance xxxxxx -Database xxxxx -Username xxx -Password xxxx -Query $query
if($?)
$sucess = 'true';
break;
Write-Host "Echec"
start-sleep -Seconds 60
$i++
While ($i -le 2 )
if ($sucess -eq 'true')
Write-Host "Success"
Else
Write-Host "Wait for too long, you need to manually check the restauration steps"
您可以简单地添加 do...虽然在第一个脚本中,但在我的情况下,我需要与检查其状态的脚本分开测试恢复的完成情况。
【讨论】:
以上是关于Invoke-sqlcmd 等待恢复完成,然后再进行下一个任务的主要内容,如果未能解决你的问题,请参考以下文章
Powershell运行Invoke-Sqlcmd命令的先决条件