【发布时间】:2014-09-21 23:39:05
【问题描述】:
我想在使用此语句启动代理后检查代理的状态
EXEC sp_startpublication_snapshot @publication
因为我想做一个需要已经开始工作的下一步。
【问题讨论】:
标签: sql sql-server sql-server-2008-r2 database-replication merge-replication
我想在使用此语句启动代理后检查代理的状态
EXEC sp_startpublication_snapshot @publication
因为我想做一个需要已经开始工作的下一步。
【问题讨论】:
标签: sql sql-server sql-server-2008-r2 database-replication merge-replication
我不相信有一个内置的复制存储过程来检查快照代理状态,我可能是错的。但是,您可以查询 MSsnapshot_history。像这样的东西应该可以解决问题:
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 了解快照代理作业的状态。
【讨论】:
经过一番研究,我找到了解决方法
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
参考:T-SQL script to wait till status of snap agent is completed
【讨论】:
我意识到这是一个较旧的线程。但是,由于这仍然很可能是当前 SQL 版本(截至本次更新的 2017/2019 版本)中需要完成的事情,所以这是我在 powershell 中使用的一个函数。其目的是等待快照可用,然后在我们的 DEV/QA 环境中重建复制。
# =======================================================================================================================================
# 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
以下是一个示例调用(在创建订阅者之前使用):
Wait-ForSnapshotCreation -InitialSleepInSec 15 -IncrementalSleepInSec 1 -ReplicationPublication '<YOUR_PUBLICATION>' -ReplicationDistributor '<YOUR_DISTRIBUTION_SERVER_INSTANCE>'
【讨论】:
检查其运行状态。以下是它的价值观: 1 = 开始。
2 = 成功。
3 = 进行中。
4 = 空闲。
5 = 重试。
6 = 失败。
【讨论】: