1. 程式人生 > >SQL Server同步複製問題排查方法

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已在(刪除訂閱端該行資料)或表結構不值造成的