首页 > 数据库 >链接服务器导致SQL Server停止响应​

链接服务器导致SQL Server停止响应​

时间:2023-09-07 14:06:34浏览次数:40  
标签:分发 HIS 数据源 Server 实例 SQL 服务器 链接

 概要

如果多个实例中同时存在数据源为对方实例的链接服务器,并且开启了“分发服务器”的属性,您可能会遇到这种情况。

现象

14:31时,在SSMS中检查HIS实例是否有复制订阅时,点击了”发布服务器属性“后,SSMS一直无法响应。

链接服务器导致SQL Server停止响应​_服务器


时,前端应用反馈有连不上数据库的情况,用SSMS测试也无法新建连接,但是原来已经建好的连接还能正常使用。14:38时,可以正常连接,前端应用也恢复正常。

链接服务器导致SQL Server停止响应​_存储过程_02



分析

通过SQL专家云,看到HIS和CIS两个实例的活动会话等待数从14:31开始同时激增,HIS实例持续到14:39,CIS实例持续到14:44。

链接服务器导致SQL Server停止响应​_链接服务器_03


大量的活动会话在执行系统存储过程sys.sp_helpdistributor,等待类型都是OLEDB。

链接服务器导致SQL Server停止响应​_服务器_04


链接服务器导致SQL Server停止响应​_链接服务器_05


SQL Server官方文档对这个存储过程的功能描述是”列出有关分发服务器、分发数据库、工作目录和 Microsoft SQL Server 代理用户帐户的信息。该存储过程在发布服务器上对发布数据库或任何数据库执行。“。详细信息参考

”https://learn.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/ms177504(v=sql.100)“。


查看存储过程的定义,先获取数据源是分发服务器实例的链接服务器,如果该链接服务器的数据源不是当前实例,那么通过该链接服务器远程执行这个存储过程,获取分发服务器的信息。


链接服务器导致SQL Server停止响应​_链接服务器_06


链接服务器导致SQL Server停止响应​_链接服务器_07


在HIS实例上查询符合分发服务器条件的链接服务器是CISSVR,数据源是CIS实例。

链接服务器导致SQL Server停止响应​_链接服务器_08

在CIS实例上查询符合分发服务器条件的链接服务器是HISSVR,数据源是HIS实例。

链接服务器导致SQL Server停止响应​_链接服务器_09


根据上面查询到的信息和存储过程的定义可以得出结论:SSMS在HIS实例中点击”发布服务器属性“,首先在HIS实例中执行sys.sp_helpdistributor,查询到链接服务器CISSVR为分发服务器,通过exec CISSVR.master.sys.sp_helpdistributor的方式在CIS实例中执行该存储过程,又查询到链接服务器HISSVR为分发服务器,继而通过exec HISSRV.master.sys.sp_helpdistributor的方式在HIS实例中执行该存储过程。如此形成了死循环式的嵌套调用,随着调用次数越来越多,连接数和内部线程消耗越来越多,导致新连接无法建立,直到生成Deadlocked Schedulers dump后。


链接服务器导致SQL Server停止响应​_链接服务器_10


测试

问题虽然定位清楚了,但是客户确认没有使用复制订阅的功能。因此判断和链接服务器属性有关。


在测试环境进行验证, 在没有开启复制订阅功能的实例,是不能看到“发布服务器属性”的菜单的。


链接服务器导致SQL Server停止响应​_存储过程_11

修改任意链接服务器的“分发服务器”属性为True后,就能看到“发布服务器属性”的菜单。如果两个实例上各自有数据源为对方实例的链接服务器,就能模拟出相互循环调用的现象。

链接服务器导致SQL Server停止响应​_链接服务器_12


解决

对于没有使用复制订阅功能的实例,修改链接服务器的“分发服务器”属性为False,并且追溯为什么要开启这个属性。

对于使用了复制订阅功能的实例,不要配置两个实例互为对方的分发服务器,当然这种情况在实际环境中也不常见。


更多资料访问

北京格瑞趋势科技有限公司是聚焦于数据服务的高新技术企业,成立于2008年,创始团队及核心技术人员来自微软和雅虎。微软数据平台金牌合作伙伴。通过产品+服务双轮驱动的业务模式,15年间累计服务4000+客户,覆盖互联网、市政、交通、电信、医疗、教育、电力、制造业等各个领域。

标签:分发,HIS,数据源,Server,实例,SQL,服务器,链接
From: https://blog.51cto.com/u_15934193/7396429

相关文章

  • sql与js中单引号问题
    1、展现树在构建xml字符串时/***解决当输入值中含有单引号或双引号导致树的展现报js脚本错误*@paramvalue*@return*/privatestaticStringgetFormatString(Stringvalue){returnvalue.replaceAll("/'","'").replaceAll("/"",""&qu......
  • sqlserver自动生成32位字符串
    由于数据库中有一个表的主键类型为varchar(32),而在hibernate中的类型为uuid.hex。所以想通过sqlserver中直接通过写insertinto的sql语句来自动生成主键,可采用: selectREPLACE(CAST(CAST(NEWID()ASBINARY(10))+CAST(GETDATE()ASBINARY(6))ASUNIQUEIDENTIFIER),'-','')......
  • sqlserver移植为Oracle笔记(更新,新增字段名;批量新增记录;日期查询;截取字串函数)
    下面是这两天在项目要sqlserver和oracle兼容的改造中测试出来的笔记:--sqlserver--更改主键字段名'ID'为'ID_'sp_rename  'tb_doc_cat_statistic.ID','ID_','column'--新增字段cat_codealtertabletb_doc_cat_statisticaddcat_codevarchar(100) --oracle--......
  • 【Redis】Could not create server TCP listening socket __6379_ bind_ 在一个非套接
    问题描述:安装Redis,redis-server无法启动,报错。[34420]20Aug21:43:21.110#oO0OoO0OoO0OoRedisisstartingoO0OoO0OoO0Oo[34420]20Aug21:43:21.110#Redisversion=5.0.14.1,bits=64,commit=ec77f72d,modified=0,pid=34420,juststarted[34420]20Aug21:43:21.1......
  • SQLSERVER2005表字段的修改
     在做项目中总遇到对数据库表的字段进行修改,所以先在此存放以便以后查询SQLSERVER20051、修改字段类型altertable表名ALTERCOLUMN  [字段名]  字段类型;可昨天执行下面的语句:altertableTb_module ALTERCOLUMN  [create_date]  varchar(100);报错信息:消息4......
  • 26.高并发服务器
    26.高并发服务器阻塞函数在阻塞期间若收到信号,会被信号终端,errno设置为EINTR,这个错误不应该看成一个错误。while(1){ cfd=accept(); while(1) { n=read(cfd,buf,sizeof(buf)); if(n<=0) { break; } }}解决办法1:将cfd设置为非阻塞:fcntl假......
  • 从MySQL全库备份中恢复某个库和某张表的方法
    一定要使用测试库操作一、全库备份恢复单个库的数据流程:1.第一种方法:--从全备中导出所需库的建库语句和INSERT语句。sed-n'/^--CurrentDatabase:`库名`/,/^--CurrentDatabase:`/p'全备.sql>test.sql--导入库,会自动建库mysql库名<test.sql2.另一种方法:mysql......
  • oracle与sqlserver执行count(*)返回的结果兼容
    由于以前都是在sqlserver2005处理,现在客户要求oracle数据库服务器,最初的代码为:allRecordSize=(Integer)rs1.getObject(1);//IntegerallRecordSize=0;当执行的时候报:BigDecimal无法转化为Integer类型为了兼容两者修改后的代码为:Objecto=rs1.getObject(1);System.out.......
  • Linux系统安装jdk;tomcat;mysql。
    1安装jdk1:下载jdklinux环境jdk-8u161-linux-x64.tar.gz2:把下载好的软件放在linux系统中3:解压:tar-zxvfjdkXXXXX.tar.gz4:重命名:mvjdk1.8.0_161/jdk85:配置环境变量/etc/profile---->配置环境变量6:刷新/etc/profile文件source/etc/profile7:在任何目录输......
  • oracle与sqlserver插入数据动态字段值
    记录一下以备下次快速找到。。。      往tb_wf_privgrant表中插入一条记录,workflow_id字段值从tb_wf_workflow表中获取workflow_name='知识审核'的所有记录中workflow_id最大值。--oracledeclare  aNUMBER(10);  begin  select max(workflow_id)intoafromt......