SQL Server同步複製問題排查方法
阿新 • • 發佈:2019-01-07
1、應用複製的命令時在訂閱伺服器上找不到該行
解決方法:用系統儲存過程sp_browsereplcmds(返回分發資料庫中儲存的可讀版本複製命令的結果集,並將其用作診斷工具。 此儲存過程在分發伺服器上對分發資料庫執行)
sp_browsereplcmds [ [ @xact_seqno_start = ] 'xact_seqno_start' ] [ , [ @xact_seqno_end = ] 'xact_seqno_end' ] [ , [ @originator_id = ] 'originator_id' ] [ , [ @publisher_database_id =排查方法:在分發伺服器—分發DB(distribution)] 'publisher_database_id' ] [ , [ @article_id = ] 'article_id' ] [ , [ @command_id= ] command_id ] [ , [ @agent_id = ] agent_id ] [ , [ @compatibility_level = ] compatibility_level ]
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已在(刪除訂閱端該行資料)或表結構不值造成的