SQL Server同步复制问题排查方法

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介: 原文:SQL Server同步复制问题排查方法 1、应用复制的命令时在订阅服务器上找不到该行解决方法:用系统存储过程sp_browsereplcmds(返回分发数据库中存储的可读版本复制命令的结果集,并将其用作诊断工具。
原文: 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已在(删除订阅端该行数据)或表结构不值造成的


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
2月前
|
SQL 监控 安全
Flask 框架防止 SQL 注入攻击的方法
通过综合运用以上多种措施,Flask 框架可以有效地降低 SQL 注入攻击的风险,保障应用的安全稳定运行。同时,持续的安全评估和改进也是确保应用长期安全的重要环节。
154 71
|
8天前
|
SQL 存储 关系型数据库
MySQL/SqlServer跨服务器增删改查(CRUD)的一种方法
通过上述方法,MySQL和SQL Server均能够实现跨服务器的增删改查操作。MySQL通过联邦存储引擎提供了直接的跨服务器表访问,而SQL Server通过链接服务器和分布式查询实现了灵活的跨服务器数据操作。这些技术为分布式数据库管理提供了强大的支持,能够满足复杂的数据操作需求。
51 12
|
2月前
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
63 4
|
2月前
|
SQL BI 数据库
SQL操作的一些基本方法
【10月更文挑战第27天】SQL操作的一些基本方法
44 3
|
2月前
|
SQL 监控 固态存储
SQL优化有哪些方法?
【10月更文挑战第27天】SQL优化有哪些方法?
52 3
|
2月前
|
SQL 关系型数据库 MySQL
惊呆:where 1=1 可能严重影响性能,差了10多倍,快去排查你的 sql
老架构师尼恩在读者交流群中分享了关于MySQL中“where 1=1”条件的性能影响及其解决方案。该条件在动态SQL中常用,但可能在无真实条件时导致全表扫描,严重影响性能。尼恩建议通过其他条件或SQL子句命中索引,或使用MyBatis的`<where>`标签来避免性能问题。他还提供了详细的执行计划分析和优化建议,帮助大家在面试中展示深厚的技术功底,赢得面试官的青睐。更多内容可参考《尼恩Java面试宝典PDF》。
|
3月前
|
SQL 数据库 索引
SQL语句实现投影连接:方法与技巧详解
在SQL数据库查询中,投影和连接是两个核心概念
|
3月前
|
SQL 移动开发 Oracle
SQL语句实现查询连续六天数据的方法与技巧
在数据库查询中,有时需要筛选出符合特定时间连续性条件的数据记录
|
3月前
|
SQL 安全 关系型数据库
SQL语句中表名通配符的使用技巧与方法
在SQL查询中,通配符通常用于匹配字符串数据,如列值中的部分字符
|
3月前
|
SQL 数据可视化 BI
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色