5

我有一个非常大的表,每个季度都有大约 100 条记录。

我使用此脚本手动将数据从现有表移动到另一个数据库,以最小化备份大小,并在执行查询时卸载生产数据库。

有没有更好的方法,例如,一些计划脚本将数据从生产数据库移动到其他数据库,然后每天或每周有效地从源数据库中删除记录?

请注意,由于该表中的大量 INSERT,我的日志文件正在迅速增长,而且当我将数据移动到存档数据库时,将记录 DELETE。

谢谢

4

4 回答 4

7

让我回顾一下要求:

  1. 减少备份大小
  2. 通过归档减少数据库中的记录数
  3. 归档数据而无需过多记录

为了减少备份大小,您需要将数据移动到不同的数据库中。

就日志记录而言,您需要查看最小日志记录的规则并确保您遵循它们。确保您要插入的数据库的恢复模式是简单或大容量日志恢复模式。

对于插入归档数据,您希望禁用非聚集数据(并在插入完成后重建它们),如果存在聚集索引,则使用跟踪标志 610,并在目标表上放置表锁。链接中还有许多您需要检查的规则,但这些是基础。

删除没有最小的日志记录,但是您可以通过使用 top 子句以块删除来最小化日志文件的增长。基本思想是(在删除期间切换到简单恢复模式以限制文件增长):

SELECT NULL;

WHILE @@ROWCOUNT > 0

     DELETE TOP (50000) FROM TABLE WHERE Condition = TRUE;

调整顶部数字以调整每次删除完成的记录量。您还需要确保谓词条件正确,以便您只删除您打算删除的内容。这将删除 50000,然后如果返回 rowcount,它将重复,直到返回的 rowcount 为 0。

如果您真的想要对所有内容进行最少的日志记录,您可以按周对源表进行分区,创建源表的克隆(在相同的分区函数和相同的索引结构上),将分区从源表切换到克隆表,插入从克隆表到存档表,然后截断克隆表。这样做的好处是截断而不是删除。缺点是设置、维护和查询要复杂得多(每个分区都有一个堆或 b-tree,所以如果所有查询都不使用分区消除,聚集索引/表扫描将不得不扫描多个 b -trees/heaps 而不仅仅是一个)。

于 2012-10-24T01:30:11.073 回答
3

您是否考虑过使用 SSIS 来执行此操作。我使用 SSIS 按顺序进行归档和备份。您还可以在 tsql 任务中使用相同的脚本并使用代理对其进行调度。或者您可以只使用代理并将脚本粘贴到其中。

于 2012-10-23T15:16:54.027 回答
2

您可以使用表分区而不是移动数据

http://technet.microsoft.com/en-us/library/dd578580(v=sql.100).aspx

http://msdn.microsoft.com/en-us/library/ms345146(v=sql.90).aspx

对于定期移动数据,您可以使用 SQL Server 作业调度功能来运行 SSIS 包。

也许也可以使用数据转换服务 (DTS)。

于 2012-10-23T15:49:15.487 回答
2

分区,肯定的。它将消除对新数据库的需求。这里的好例子

如果你不想改变你的架构,我建议使用 SSIS 来移动数据而不是脚本

于 2012-10-23T15:55:26.840 回答