zoukankan      html  css  js  c++  java
  • SQL Server同步复制问题排查方法

    1、应用复制的命令时在订阅服务器上找不到该行


     

    解决方法:用系统存储过程sp_browsereplcmds返回分发数据库中存储的可读版本复制命令的结果集,并将其用作诊断工具。 此存储过程在分发服务器上对分发数据库执行

    sp_browsereplcmds [ [ @xact_seqno_start = ] 'xact_seqno_start' ]
        [ , [ @xact_seqno_end = ] 'xact_seqno_end' ] 
        [ , [ @originator_id = ] 'originator_id' ]
        [ , [ @publisher_database_id = ] 'publisher_database_id' ]
        [ , [ @article_id = ] 'article_id' ]
        [ , [ @command_id= ] command_id ]
        [ , [ @agent_id = ] agent_id ]
        [ , [ @compatibility_level = ] compatibility_level ]

    排查方法:在分发服务器—分发DB(distribution)

     

    Use [distribution] 
    go
    --查询1:通常事务序列号,查到command_id=1的执行语句
    EXEC sp_browsereplcmds @xact_seqno_start='0x00044ED500008F3E00AB00000000',@xact_seqno_end='0x00044ED500008F3E00AB00000000'
    
    --查询2:查看同步对象表(在以上结果集中找到article_id/publication_id栏位值)
    select *From MSarticles where article_id=344 
    
    --查询3:同步命令太多时,查看可指定@command_id[如图1](必须可传@publisher_database_id[查询2])
    EXEC sp_browsereplcmds 
    	@xact_seqno_start='0x00044ED500008F3E00AB00000000'
    	,@xact_seqno_end='0x00044ED500008F3E00AB00000000'
    	,@publisher_database_id=4
    	,@command_id=1			--
    



    --第1个语句会出现以下两种情况(a/b)

    --a、更新时找不到该行

    {CALL [dbo].[sp_MSupd_dbo表名] (.....)}

    --b、删除时找不到该行

    {CALL [dbo].[sp_MSdel_dbo表名] (......}

    了解同步存储过程:

    订阅端同步接口格式如下:

    --新增调用存储过程格式:((订阅客户端新增时同步存储不会抛出错误码))
    
    create procedure [dbo].[sp_MSins_dboTableName]
        @c1 tinyint,
        @c2 nvarchar(50),
        @c3 time,
        @c4 time
    as
    begin  
    	insert into [dbo].[TableName](
    		[ID],
    		[Name],
    		[StartTime],
    		[EndTime]
    	) values (
        @c1,
        @c2,
        @c3,
        @c4	) 
    end  
    
    GO
    
    --更新调用存储过程格式:(订阅客户端修改数据时没有找到记录更新时;错误码:20598)
    
    create procedure [dbo].[sp_MSupd_dboTableName]
    		@c1 tinyint = NULL,
    		@c2 nvarchar(50) = NULL,
    		@c3 time = NULL,
    		@c4 time = NULL,
    		@pkc1 tinyint = NULL,
    		@bitmap binary(1)
    as
    begin  
    update [dbo].[TableName] set
    		[Name] = case substring(@bitmap,1,1) & 2 when 2 then @c2 else [Name] end,
    		[StartTime] = case substring(@bitmap,1,1) & 4 when 4 then @c3 else [StartTime] end,
    		[EndTime] = case substring(@bitmap,1,1) & 8 when 8 then @c4 else [EndTime] end
    where [ID] = @pkc1
    if @@rowcount = 0
        if @@microsoftversion>0x07320000
            exec sp_MSreplraiserror 20598
    end 
    
    GO
    
    
    --删除调用存储过程格式:(订阅客户端删除数据时没有找到记录更新时;错误码:20598)
    create procedure [dbo].[sp_MSdel_dboTableName]
    		@pkc1 tinyint
    as
    begin  
    	delete [dbo].[TableName]
    where [ID] = @pkc1
    if @@rowcount = 0
        if @@microsoftversion>0x07320000
            exec sp_MSreplraiserror 20598
    end  
    
    GO
    
    
    



    解决方法1:(a更新、b、删除):在订阅端把缺少的数据行新增(根据以上出错ID加一条记录)或用导入导出方法(SQL语句同步指定以上ID).(原因:订阅端缺少数据行造成删除或更新找不到数据行而出错),

    不推荐以下方法(解决方法2、解决方法3)

    解决方法2:改同步存储过程接口把抛出错码判断去掉,会造成数据不同步,如果取消最好只取消删除时调用的存储过程(如:sp_MSdel_dboTableName)

    解决方法3:使用发布代理的SkipErrors参数来忽略跳过错误20598(会造成数据不同步,不能有效查找原因,需要对比环境数据(如表:记录数))如下图:

    --c、新增时出错

    {CALL [dbo].[sp_MSins_dbo] 

    解决方法4:(c、新增时出错):新增时出错,解决方法根据提示可能是标识值或主健ID已在(删除订阅端该行数据)或表结构不值造成的

  • 相关阅读:
    2016"百度之星"
    codeforces 55 div2 C.Title 模拟
    codeforces 98 div2 C.History 水题
    codeforces 97 div2 C.Replacement 水题
    codeforces 200 div2 C. Rational Resistance 思路题
    bzoj 2226 LCMSum 欧拉函数
    hdu 1163 九余数定理
    51nod 1225 余数的和 数学
    bzoj 2818 gcd 线性欧拉函数
    Codeforces Round #332 (Div. 2)D. Spongebob and Squares 数学
  • 原文地址:https://www.cnblogs.com/Roy_88/p/5463050.html
Copyright © 2011-2022 走看看