我有一张非常大的桌子,每个季度都有大约100万条记录。
我使用this script手动将数据从现有表移动到另一个数据库,以最小化备份大小,并在执行查询时卸载生产数据库。
有没有更好的方法,例如,某些预定脚本会将数据从生产数据库移动到其他数据库,然后每天或每周有效地从源数据库中删除记录?
请注意,由于此表中有大量INSERT,我的日志文件正在快速增长,当我将数据移动到存档数据库时,也会记录DELETE。
由于
答案 0 :(得分:6)
让我回顾一下这些要求:
为了减少备份大小,您需要将数据移动到不同的数据库中。
就日志记录而言,您需要查看rules of minimal logging并确保关注它们。确保要插入的数据库的恢复模型位于简单或大容量日志恢复模型中。
要插入存档数据,您需要禁用非群集(并在插入完成后重建它们),如果存在聚簇索引则使用跟踪标志610,并在目标表上放置表锁。链接中还有许多规则需要检查,但这些是基础知识。
删除没有最小日志记录,但您可以通过使用top子句删除块来最小化日志文件增长。基本思路是(在删除期间切换到简单恢复模型以限制文件增长):
SELECT NULL;
WHILE @@ROWCOUNT > 0
DELETE TOP (50000) FROM TABLE WHERE Condition = TRUE;
调整顶部数字以调整每次删除的记录日期。您还需要确保谓词条件正确,以便您只删除您想要的内容。这将删除50000,然后如果返回rowcount,它将重复,直到返回的rowcount为0。
如果你真的想要对所有内容进行最小的日志记录,你可以按周对源表进行分区,创建源表的克隆(在相同的分区函数和相同的索引结构上),将分区从源表切换到克隆table,从克隆表插入到归档表,然后截断克隆表。这样做的好处是截断而不是删除。缺点是设置,维护和查询要复杂得多(每个分区有一个堆或b树,所以如果所有查询都不利用分区消除,则聚簇索引/表扫描必须扫描多个b -trees / heaps而不只是一个。)
答案 1 :(得分:3)
您是否考虑过使用SSIS执行此操作。我使用SSIS在订单中进行存档和备份。您还可以在tsql任务中使用相同的脚本,并使用代理程序对其进行计划。或者您可以使用代理并将脚本放入其中。
答案 2 :(得分: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)。
答案 3 :(得分:2)
绝对分区。它将消除对新数据库的需求。好例子here
如果您不想更改架构,我建议使用SSIS来移动数据而不是脚本