Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何检查复制快照代理的状态?_Sql_Sql Server_Sql Server 2008 R2_Database Replication_Merge Replication - Fatal编程技术网

Sql 如何检查复制快照代理的状态?

Sql 如何检查复制快照代理的状态?,sql,sql-server,sql-server-2008-r2,database-replication,merge-replication,Sql,Sql Server,Sql Server 2008 R2,Database Replication,Merge Replication,使用此语句启动代理后,我想检查代理的状态 EXEC sp_startpublication_snapshot @publication 因为我想执行下一步,需要作业已经启动。我不相信有内置的复制存储过程来检查快照代理的状态,我可能错了。但是,您可以查询MSsnapshot_历史记录。像这样的事情应该可以做到: SELECT agent_id, runstatus, start_time, time, duration, comment

使用此语句启动代理后,我想检查代理的状态

EXEC sp_startpublication_snapshot @publication

因为我想执行下一步,需要作业已经启动。

我不相信有内置的复制存储过程来检查快照代理的状态,我可能错了。但是,您可以查询MSsnapshot_历史记录。像这样的事情应该可以做到:

SELECT 
    agent_id, 
    runstatus, 
    start_time, 
    time, 
    duration, 
    comments, 
    delivered_transactions,
    delivered_commands, 
    delivery_rate, 
    error_id, 
    timestamp 
FROM dbo.MSsnapshot_history
WHERE comments = 'Starting agent.'
同样,您可以检查快照代理何时完成:

SELECT 
    agent_id, 
    runstatus, 
    start_time, 
    time, 
    duration, 
    comments, 
    delivered_transactions,
    delivered_commands, 
    delivery_rate, 
    error_id, 
    timestamp 
FROM dbo.MSsnapshot_history
WHERE comments = '[100%] A snapshot of 68 article(s) was generated.'

或者,您可以使用sp_help_job检查快照代理作业的状态。

检查其运行状态。以下是它的价值: 1=开始

2=成功

3=正在进行中

4=空闲

5=重试


6=失败。

经过一些研究,我找到了一个解决办法

SELECT snapshot_ready FROM sysmergepublications 
如果未准备好,此查询将返回0;如果已启动,则返回1


感谢大家的贡献:)

在执行其他脚本之前,您还可以使用while循环检查代理是否正在运行:

use [distribution];
declare @status int = 2

 select @status = status
 FROM dbo.MSReplication_monitordata
 WHERE publication = 'PublicationName' and agent_type = 1

 while @status = 3
 begin
 WAITFOR DELAY '00:00:03'
 select @status = status
 FROM dbo.MSReplication_monitordata
 WHERE publication = 'Publication.Name' and agent_type = 1
 end

参考资料:

我意识到这是一个较旧的线程。但是,由于在当前版本的SQL中(2017/2019,截至本次更新),这可能仍然是需要完成的工作,因此我在powershell中使用了一个函数。其目的是在我们的开发/质量保证环境中重建复制之前,等待快照可用

# =======================================================================================================================================
# WAIT UNTIL SNAPSHOT CREATED
# =======================================================================================================================================
Function Wait-ForSnapshotCreation {
    [Cmdletbinding()]

    Param (
        [int] $InitialSleepInSec = 60
       ,[int] $IncrementalSleepInSec = 2
       ,[string] $ReplicationPublication
       ,[string] $ReplicationDistributor
    )

    Process {
        $SleepMessage = "Sleeping for {0} seconds at the start..." -f $InitialSleepInSec
        $TotalSleepInSec = $SleepInSec
        $MonitorSQL = "exec sp_replmonitorhelppublication @publication = N'$ReplicationPublication'"
        Write-Message -Message ($SleepMessage)
        Start-Sleep -s $InitialSleepInSec

        Do {
             $MonitorStatus = (Invoke-SQLCmd -Query ($MonitorSQL) -ServerInstance $ReplicationDistributor -Database 'Distribution' -AbortOnError)
             If ($MonitorStatus.status -eq 3) {
                 $SleepMessage = "Replication status is still 'running' (3).   Will sleep for {0} more seconds. Slept {1} seconds so far..." -f $IncrementalSleepInSec, $TotalSleepInSec
                 Write-Message -Message ($SleepMessage)

                 Start-Sleep -s $IncrementalSleepInSec
                 $TotalSleepInSec += $IncrementalSleepInSec

             } # If...

        } Until ($MonitorStatus.status -ne 3)

    } # Process

} # Function

以下是一个示例调用(在创建订阅服务器之前使用):

等待快照创建-InitialSleepInse 15-IncrementalSleepInSec 1-ReplicationPublication“”-ReplicationDistributor“”
Wait-ForSnapshotCreation -InitialSleepInSec 15 -IncrementalSleepInSec 1 -ReplicationPublication '<YOUR_PUBLICATION>' -ReplicationDistributor '<YOUR_DISTRIBUTION_SERVER_INSTANCE>'