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 等待恢复完成,然后再进行下一个任务的主要内容,如果未能解决你的问题,请参考以下文章

苹果微信需要在开发者模式下打开吗

软件调试——CPU异常列表

Powershell运行Invoke-Sqlcmd命令的先决条件

Invoke-SqlCmd 缩短结果

PowerShell 中对 Invoke-Sqlcmd 的 Unicode 支持

Powershell invoke-sqlcmd 打印错误的输出