代码之家  ›  专栏  ›  技术社区  ›  user17222

如何通过t-sql检查sql复制状态?

  •  14
  • user17222  · 技术社区  · 16 年前

    我希望能够检查SQL Server 2008 T-SQL中发布和订阅的状态。我希望能够确定它是否好,何时是最后一次成功,同步等等。这可能吗?

    3 回复  |  直到 16 年前
        1
  •  33
  •   Denaem    14 年前

    我知道这有点晚了…

    SELECT 
    (CASE  
        WHEN mdh.runstatus =  '1' THEN 'Start - '+cast(mdh.runstatus as varchar)
        WHEN mdh.runstatus =  '2' THEN 'Succeed - '+cast(mdh.runstatus as varchar)
        WHEN mdh.runstatus =  '3' THEN 'InProgress - '+cast(mdh.runstatus as varchar)
        WHEN mdh.runstatus =  '4' THEN 'Idle - '+cast(mdh.runstatus as varchar)
        WHEN mdh.runstatus =  '5' THEN 'Retry - '+cast(mdh.runstatus as varchar)
        WHEN mdh.runstatus =  '6' THEN 'Fail - '+cast(mdh.runstatus as varchar)
        ELSE CAST(mdh.runstatus AS VARCHAR)
    END) [Run Status], 
    mda.subscriber_db [Subscriber DB], 
    mda.publication [PUB Name],
    right(left(mda.name,LEN(mda.name)-(len(mda.id)+1)), LEN(left(mda.name,LEN(mda.name)-(len(mda.id)+1)))-(10+len(mda.publisher_db)+(case when mda.publisher_db='ALL' then 1 else LEN(mda.publication)+2 end))) [SUBSCRIBER],
    CONVERT(VARCHAR(25),mdh.[time]) [LastSynchronized],
    und.UndelivCmdsInDistDB [UndistCom], 
    mdh.comments [Comments], 
    'select * from distribution.dbo.msrepl_errors (nolock) where id = ' + CAST(mdh.error_id AS VARCHAR(8)) [Query More Info],
    mdh.xact_seqno [SEQ_NO],
    (CASE  
        WHEN mda.subscription_type =  '0' THEN 'Push' 
        WHEN mda.subscription_type =  '1' THEN 'Pull' 
        WHEN mda.subscription_type =  '2' THEN 'Anonymous' 
        ELSE CAST(mda.subscription_type AS VARCHAR)
    END) [SUB Type],
    
    mda.publisher_db+' - '+CAST(mda.publisher_database_id as varchar) [Publisher DB],
    mda.name [Pub - DB - Publication - SUB - AgentID]
    FROM distribution.dbo.MSdistribution_agents mda 
    LEFT JOIN distribution.dbo.MSdistribution_history mdh ON mdh.agent_id = mda.id 
    JOIN 
        (SELECT s.agent_id, MaxAgentValue.[time], SUM(CASE WHEN xact_seqno > MaxAgentValue.maxseq THEN 1 ELSE 0 END) AS UndelivCmdsInDistDB 
        FROM distribution.dbo.MSrepl_commands t (NOLOCK)  
        JOIN distribution.dbo.MSsubscriptions AS s (NOLOCK) ON (t.article_id = s.article_id AND t.publisher_database_id=s.publisher_database_id ) 
        JOIN 
            (SELECT hist.agent_id, MAX(hist.[time]) AS [time], h.maxseq  
            FROM distribution.dbo.MSdistribution_history hist (NOLOCK) 
            JOIN (SELECT agent_id,ISNULL(MAX(xact_seqno),0x0) AS maxseq 
            FROM distribution.dbo.MSdistribution_history (NOLOCK)  
            GROUP BY agent_id) AS h  
            ON (hist.agent_id=h.agent_id AND h.maxseq=hist.xact_seqno) 
            GROUP BY hist.agent_id, h.maxseq 
            ) AS MaxAgentValue 
        ON MaxAgentValue.agent_id = s.agent_id 
        GROUP BY s.agent_id, MaxAgentValue.[time] 
        ) und 
    ON mda.id = und.agent_id AND und.[time] = mdh.[time] 
    where mda.subscriber_db<>'virtual' -- created when your publication has the immediate_sync property set to true. This property dictates whether snapshot is available all the time for new subscriptions to be initialized. This affects the cleanup behavior of transactional replication. If this property is set to true, the transactions will be retained for max retention period instead of it getting cleaned up as soon as all the subscriptions got the change.
    --and mdh.runstatus='6' --Fail
    --and mdh.runstatus<>'2' --Succeed
    order by mdh.[time]
    
        2
  •  4
  •   Jamie Pollard    10 年前

    旧的post,但为其他人添加-以下存储过程将为您提供所需的内容:

    它允许您查看分发服务器的所有复制发布的状态和其他信息(在分发数据库上运行它)

        3
  •  1
  •   Maksymilian Mulawa    13 年前

    要检查发布或订阅状态,可以使用简单实用程序 SQL Server Replication Explorer