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


    概要

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

    现象

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

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

    分析

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

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

    SQL Server官方文档对这个存储过程的功能描述是”列出有关分发服务器、分发数据库、工作目录和 Microsoft SQL Server 代理用户帐户的信息。该存储过程在发布服务器上对发布数据库或任何数据库执行。“。详细信息参考”https://learn.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/ms177504(v=sql.100)“。

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

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

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

    根据上面查询到的信息和存储过程的定义可以得出结论: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后。

    测试

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

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

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

    解决

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

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

    更多资料访问

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

  • 相关阅读:
    【Axure教程】雷达扫描动态效果(航空信息可视化案例)
    再来谈谈如何从binlog文件恢复误update的数据,模拟Oracle的闪回功能
    从物联网到万物互联:AI与6G融合,实现互联智能
    消除达人游戏小程序开发流程:专业性与创新的结合
    使用MATLAB对语音信号进行采集以及读写的方法
    Java面向对象(封装,继承,多态,接口)
    了解 Oracle 中的视图
    MySQL之复制(二)
    Hadoop笔记
    问题描述:maven本地仓库有包,导致could not find artifact * * * 问题!
  • 原文地址:https://blog.csdn.net/z_cloud_for_SQL/article/details/132714632