【问题标题】:SQL Server 2008 Job error 1204 LockSQL Server 2008 作业错误 1204 锁定
【发布时间】:2013-09-24 18:19:19
【问题描述】:

我在维护一些古老的数据库时遇到了一些问题。它已经存在了很长时间(不,我没有设计它,不,不可能对其进行任何更改)

它是这样的:有 2 个表格,“文档”和“版本”。 Documents 是一个非常简单的表,只有一个主键,一个 varchar 存储文档名称和创建该文档的用户。Versions 具有它所属文档的外键,一个存储实际文档的图像字段(主要是单词文档和 pdf)、扩展名和另一个保存版本号的字段。

每当应用程序(ANCIENT VB6 应用程序)使用文档时,就会生成一个新版本。

每天晚上,在数据库上运行一个作业,以便删除每个文档的 5 个最新版本之外的所有版本。这一直在工作,永远。

DELETE FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument)-4

问题是,尽管版本表每天都在运行此作业以丢弃最旧的条目,但数据库的大小已达到惊人的大小(目前 300+ GB)。

为了减小上述大小,有人最终意识到没有必要对 pdf 元素进行版本控制。所以,我被要求应用一个简单的修改:

该作业将删除旧版本的 word 文档,保留最新的 5 个版本。对于任何其他类型的文件,除了最新版本之外的所有版本都将被删除。因此,我将作业关联的存储过程更改为:

DELETE FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument)-4 
AND extension  LIKE 'do%';

DELETE FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument) 
AND extension  NOT LIKE 'do%';

但是,应用更改后,第二天的作业历史记录通知以下错误

"SQL Server 数据库引擎的实例此时无法获取 LOCK 资源。当活动用户较少时重新运行您的语句。请数据库管理员检查此实例的锁和内存配置,或检查长时间运行的事务。[SQLSTATE HY000](错误 1204)。步骤失败。"

我现在有点迷茫,有什么想法吗?

【问题讨论】:

标签: sql sql-server-2008 jobs agent


【解决方案1】:

您可以尝试删除 100 行或任何快速有效的数字。

declare @rows int
set @rows = 1
while @rows > 0
BEGIN
DELETE TOP (100)  FROM t_ad_Versions WHERE VersionNumber < dbo.MaxVersion(codDocument)-4 AND extension  LIKE 'do%';
set @rows = @@ROWCOUNT
END

【讨论】:

  • 好吧,不知道是否有更正统的解决方案来处理 sql server 锁,但这确实成功了。实际上,由于政策变化,这项工作的任务是删除所有以前版本的非 Word 文档,这意味着要删除超过 200.000 行,显然处理太多了。工作从凌晨 2 点开始,从那时起已经 7 个小时,并且仍在运行,目前数据库已降至 230GB
  • 您可以将 TOP (100) 增加到 1000。它应该会加快删除过程,但会增加锁定错误的可能性。
  • 您可以在MaxVersion上创建一个NONCLUSTERED INDEX,为delete语句扩展列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多