none
同一台服务器上,一个数据库的死锁会导致另一个数据库的性能很低,这个该如何解决 RRS feed

  • 问题

  • 同一个sql2017的服务器,有2个数据库,ERP和WMS数据库,两个数据库不存在直接的数据访问,分别用于不同的系统。

    发现ERP数据库经常出现死锁,因为这不是我们自己开发的系统,无法彻底解决死锁问题。

    但是ERP数据库死锁的时候,WMS系统(用了WMS数据库)这边也跟着卡死,实际上死锁时,看到的CPU使用都还在30%以下。这种问题该如何解决?我有三种设想:

    1. 是不是可以通过参数配置调整来优化,这样能解决最好了。
    2. SQLServer资源调控器能否解决这个问题,但我看了资源调控器,好像它调控的目标是类似CPU使用的保障,但实际上我的CPU性能还很富余
    3. 同一台服务器上把sqlserver安装为2个实例,把WMS数据库转移到另一个实例上。

    哪位专家能给个建议?

    2021年9月5日 5:29

答案

  • Hi @DancingWolves,

    当两个进程竞争对资源的独占访问,但由于另一个进程阻止它而无法获得对它的独占访问时,就会发生死锁。这导致两个过程都无法进行的僵局。摆脱死锁的唯一方法是终止其中一个进程。SQL Server 会自动检测何时发生死锁,并通过终止称为受害者的进程之一来采取行动。

    根据你的描述,你的问题应该是阻塞问题,在 SQL Server 中,当一个会话持有对特定资源的锁而第二个 SPID 尝试获取同一资源上的冲突锁类型时,就会发生阻塞。查询的持续时间和事务上下文决定了它的锁被持有多长时间,从而决定了它们对其他查询的影响。

    解决阻塞问题的故障排除步骤:

    1.识别主要阻塞会话

    2.查找导致阻塞的查询和事务(长时间持有锁的内容)

    3.分析/理解为什么会出现长时间阻塞

    4.通过重新设计查询和事务解决阻塞问题

    请阅读微软官方文档了解并解决SQL Server阻止问题,来获取解决阻塞问题的详细步骤。

    >>SQLServer资源调控器能否解决这个问题

    不能。资源调控器是用来监控资源的。你的问题是阻塞问题,和这个没啥关系。

    >>同一台服务器上把sqlserver安装为2个实例,把WMS数据库转移到另一个实例上。

    可以这么安排。这样就可以将两个数据库隔离。

    ******************************************************************************************
    如果回复有帮助,请点击“接受答案”并点赞,因为这可以帮助其他社区成员寻找类似的帖子。



    2021年9月6日 1:24
  • 卡死感觉是被block了,可以在故障时用 sp_who2 查看一下,看看 BlkBy列是否有数字值,有则代表此进程被它 BLOCK 了

    死锁检测到后会终止一方进程,这个时候通常是不会造成卡死的

    建议方案3,先做隔离

    资源调控器是限制资源使用大小的,对此问题没有什么帮助

    2021年9月6日 0:58
  • Hi @DancingWolves,

    >>看来只能安装为另外一个实例了?

    你也可以根据我分享给你的微软官网,去排查这个阻塞的问题。

    >>这样会比较复杂,同时还要考虑内存在两个实例之间如何分配了

    我们可以通过设置“最大服务器内存”选项来限制 SQL Server 对内存的访问。为每个实例建立最大设置,注意总允许量不要超过机器上的总物理内存。建议为每个实例分配与其预期工作负载或数据库大小成比例的内存。SSMS>右击实例>属性>内存>最大服务器内存

    ******************************************************************************************
    如果回复有帮助,请点击“接受答案”并点赞,因为这可以帮助其他社区成员寻找类似的帖子。

    2021年9月7日 7:37

全部回复

  • You sure it's deadlock not blocking? In case of deadlock, sql will kill one of involved process. So from sql point of view, no real impact. But app may pause because of killed process, it depends on app design. If there's blocking, you may need check blocking chain and affected app process maybe part of that chain.
    2021年9月5日 16:07
  • 卡死感觉是被block了,可以在故障时用 sp_who2 查看一下,看看 BlkBy列是否有数字值,有则代表此进程被它 BLOCK 了

    死锁检测到后会终止一方进程,这个时候通常是不会造成卡死的

    建议方案3,先做隔离

    资源调控器是限制资源使用大小的,对此问题没有什么帮助

    2021年9月6日 0:58
  • Hi @DancingWolves,

    当两个进程竞争对资源的独占访问,但由于另一个进程阻止它而无法获得对它的独占访问时,就会发生死锁。这导致两个过程都无法进行的僵局。摆脱死锁的唯一方法是终止其中一个进程。SQL Server 会自动检测何时发生死锁,并通过终止称为受害者的进程之一来采取行动。

    根据你的描述,你的问题应该是阻塞问题,在 SQL Server 中,当一个会话持有对特定资源的锁而第二个 SPID 尝试获取同一资源上的冲突锁类型时,就会发生阻塞。查询的持续时间和事务上下文决定了它的锁被持有多长时间,从而决定了它们对其他查询的影响。

    解决阻塞问题的故障排除步骤:

    1.识别主要阻塞会话

    2.查找导致阻塞的查询和事务(长时间持有锁的内容)

    3.分析/理解为什么会出现长时间阻塞

    4.通过重新设计查询和事务解决阻塞问题

    请阅读微软官方文档了解并解决SQL Server阻止问题,来获取解决阻塞问题的详细步骤。

    >>SQLServer资源调控器能否解决这个问题

    不能。资源调控器是用来监控资源的。你的问题是阻塞问题,和这个没啥关系。

    >>同一台服务器上把sqlserver安装为2个实例,把WMS数据库转移到另一个实例上。

    可以这么安排。这样就可以将两个数据库隔离。

    ******************************************************************************************
    如果回复有帮助,请点击“接受答案”并点赞,因为这可以帮助其他社区成员寻找类似的帖子。



    2021年9月6日 1:24
  • 感谢回复,我的问题描述确实不太准确,是阻塞而不是死锁。

    按照各位的方案,因为源系统不是我们开发的,无法彻底优化;看来只能安装为另外一个实例了?

    这样会比较复杂,同时还要考虑内存在两个实例之间如何分配了,原来都是把90%的内存都分给sqlserver的。

    2021年9月6日 6:00
  • 感谢回复,我的问题描述确实不太准确,是阻塞而不是死锁。

    按照各位的方案,因为源系统不是我们开发的,无法彻底优化;看来只能安装为另外一个实例了?

    这样会比较复杂,同时还要考虑内存在两个实例之间如何分配了,原来都是把90%的内存都分给sqlserver的。

    You should report the issue to app vendor, they may know the issue and have fix already.
    2021年9月6日 14:37
  • 内存主要控制一下 max server memory大小就行,这个是可以动态调整的

    另外,既然你可以拆成两个实例,是不是意味着两个系统不会互相引用对方的表,或者是两套系统没有共用的表,如果是这样,那理论上两套系统不会互相阻塞(当然,有互相引用或共用,也可以通过复制做两步,即时性有影响而已)

    所以,如果要进一步排查,你应该考虑把阻塞和被阻塞的SQL给找出来做分析

    2021年9月7日 1:00
  • Hi @DancingWolves,

    >>看来只能安装为另外一个实例了?

    你也可以根据我分享给你的微软官网,去排查这个阻塞的问题。

    >>这样会比较复杂,同时还要考虑内存在两个实例之间如何分配了

    我们可以通过设置“最大服务器内存”选项来限制 SQL Server 对内存的访问。为每个实例建立最大设置,注意总允许量不要超过机器上的总物理内存。建议为每个实例分配与其预期工作负载或数据库大小成比例的内存。SSMS>右击实例>属性>内存>最大服务器内存

    ******************************************************************************************
    如果回复有帮助,请点击“接受答案”并点赞,因为这可以帮助其他社区成员寻找类似的帖子。

    2021年9月7日 7:37
  • 是的,2个业务上独立的,数据库之间没有直接访问。但就是erp库的阻塞会导致Wms库卡死,但实际上这时cpu等资源还是非常充裕
    2021年9月8日 6:54
  • 最好还是查一下ERP为啥阻塞了。找到原因根本解决。否则即使分开不同服务器,对其他的业务是没影响,但是ERP还是继续阻塞,影响业务的。


    family as water

    2021年9月8日 7:22
  • 其实阻塞的Sql语句都有抓到,还需要erp供应商这边处理。
    2021年9月8日 10:34
  • 其实阻塞的Sql语句都有抓到,还需要erp供应商这边处理。
    You can use sql trace to find blocking statement.
    2021年9月8日 14:35