首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大型删除期间的Server事务日志

大型删除期间的Server事务日志
EN

Database Administration用户
提问于 2016-09-23 16:08:34
回答 3查看 2.4K关注 0票数 1

在我的工作中,我将把数百万条记录移到另一台服务器上,并将它们从源服务器中删除。我的DBA设置了一个备份场景,每5分钟进行一次更改备份。他曾向我发出有关删除纪录的警告:

...it将创建一个巨大的事务日志,可能会导致5分钟的事务日志备份失败.

有什么办法可以绕过这件事吗?

EN

回答 3

Database Administration用户

回答已采纳

发布于 2016-09-23 16:27:52

我们不知道为什么您的事务日志备份会失败,但我们可以讨论解决方案。他可能会担心事务日志膨胀,当事务日志变得如此大时,它就会填满存储日志文件的驱动器。

首先,也是最简单的解决方案:如果要将所有数据全部从表中移出,只需截断表。这是最低限度的记录。

第二:将DELETE语句拆分为批处理。找到一种划分数据的方法,比方说批量大小为5,000。

代码语言:javascript
复制
DELETE FROM OldDBTable
WHERE ID IN 
          (SELECT TOP 5000 ID 
           FROM OldDBTable 
           WHERE [Statement to define deleted data here])

如果你想的话,你可能会增加批次大小。然后将一个WAITFOR DELAY '0:05:00'设置为等待下一个批处理的5分钟。

票数 3
EN

Database Administration用户

发布于 2016-09-23 16:36:58

取回事务日志对正在进行的活动几乎没有任何影响,也与它们没有关系,因此日志备份不会失败。

我认为您的DBA更担心在删除数百万条记录的同时增加事务日志大小。

如果是这样的话,您可以与他讨论并尝试在小批中移动和删除记录,而不是在单个事务中移动和删除记录。

您可以查看以下链接:https://sqlperformance.com/2013/03/io-subsystem/chunk-deletes

但请先与你的DBA确认。

票数 2
EN

Database Administration用户

发布于 2016-09-24 15:09:47

最近,我以最小的开销完成了类似的任务。我和我的高级助理协调。DBA到

  1. 标识和存储要保留select * into foo_table from table where <keep_condition> = 'true'的记录
  2. 禁用任何或删除任何相关约束(当然,确保可以重新创建它们)
  3. 截断目标表
  4. foo_table重新插入(注意计算/标识列)
  5. 清理

免责声明:显然,最好是使用大量的回滚能力和在停机期间这样做。但如果你能有时间做这件事,一点也不头痛。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/150521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档