【发布时间】:2014-08-16 09:01:15
【问题描述】:
对于我这个新手 DBA 来说,情况真的很危险。
有时当我看到活动监视器屏幕中出现死锁时,如果查询没有结束并保持挂起状态并且还有一个头块,我必须杀死那个 spid。并非总是如此,但有时,虽然很少,在杀死 spid 后,大量数据从数据库中丢失。 我猜它从锁定开始到我杀死它都会丢失数据。 据我了解,Sql server 不会立即保存数据,它会等待一段时间(某种周期可能每 15 分钟一次)并在认为一切正常时保存数据。
例如,我每 6 小时进行一次完整备份,每 10 分钟进行一次事务备份。昨晚由于某种原因它无法在 00:00 进行备份,并且该 spid 处于挂起状态等待。当我在早上 08:30 杀死那个 spid 时,我从 00:00 到 08:30 丢失了所有表中的所有数据..
我有完整的恢复模式并使用 MsSqlServer2012。
在生产数据库中丢失数据是非常大的风险。 我的问题是;我怎么能确定,SQL 在杀死 spid 之前真的保存了数据吗?
【问题讨论】:
-
也许您应该解决实际问题,而不是症状...。此外,系统会自动检测死锁并选择受害者进行终止。为什么您甚至需要手动执行此操作?
-
因为在我杀死锁定的 spid 之前,有些表无法读取。
-
您必须回滚未提交的事务。没有 15 分钟的保存周期。一旦事务提交,更改必须持续存在。如果您在此之前终止事务,则必须回滚更改。
-
无论是否有其他 spid 处于挂起状态,您都应该能够进行完整备份(除非这些其他进程也同时尝试进行完整备份)。此外,提交事务时 SQL Server 确保所有更改都已写入磁盘,然后再返回客户端。唯一的例外是如果您在服务器上启用“延迟持久性”,这是 SQL 2014 的新功能,因此不适用于您的 SQL 2012 实例。当你杀死一个 spid 时,你怎么知道你正在丢失数据?
-
尝试对您的数据库运行 DBCC CHECKDB 以确保它没有损坏。 msdn.microsoft.com/en-us/library/ms176064.aspx 这可能会占用大量资源,因此如果针对生产实例运行,请尝试在非高峰时间运行
标签: sql-server data-integrity spid