我们公司最近遇到了一个问题,那就是我们的SQL Server数据库处于高负载状态,一些数据库监控脚本会导致一些连接中断。
发生这种情况时,正在进行的一些交易未能完成回滚。
他们一再表示,在执行pid上的kill时,回滚率为0%。
在线search后,我们发现有人build议重新启动SQL Server。 这是不可取的,因为这是一个生产分贝。 我们还担心restartinng可能会导致我们的数据库损坏,迫使我们从备份中恢复。
我们最终重新启动了服务器,一切都开始正常,没有回滚的事务。
我的问题是:
是否有可能防止这种情况发生呢? 如果没有,有什么办法知道它是安全的重新启动?
首先回答你的最后一个问题,你能否再次提出这个问题呢?
发生什么事是当进程被杀死时,SQL Server告诉客户端进程已经被终止。 在某些情况下,SQL Server会挂起,试图告诉客户端进程已被终止。 通常这不是问题,但有几次会导致这个问题。
如果让进程运行什么都不会发生,除了SPID正在进行中。 回滚实际上已经完成。 清除SPID的唯一方法是重新启动SQL实例。 发生这种情况时,重新启动SQL实例有可能导致出现错误。
我所能说的只是做基本的东西。 首先知道当前在服务器上运行的脚本的重要性。 复杂的脚本,会花费太多的内存消耗,并可能做dataloss'必须'先运行脚本之前做备份过程。 比方说,一千个脚本脚本计划运行无人看pipe,开发脚本的技术人员必须被build议在他们的脚本中包含一个自动差异备份,以确保脚本崩溃,然后至less有一个可靠的备份是安全的。
如果脚本没有自动备份程序,那么技术人员必须负责在特定的时间手动执行备份。 唯一需要考虑的是要知道脚本何时开始在服务器上运行,以便dba也知道何时开始手动备份过程。 dba存在的一个原因。