将数据从公共生产服务器归档到内部归档服务器

时间:2011-10-06 09:02:55

标签: sql-server sql-server-2008 archiving

我们有一个网络应用程序,其中包括来自嵌入式设备的日志数据的详细存档。我们希望保留此详细数据以供内部分析,但公共可访问生产服务器上不需要此数据超过三个月。 Web应用程序仅插入新数据,对详细数据没有更新或删除。

因此,我们希望构建一个存档系统,该系统定期(例如每天)从生产服务器(包括最近三个月)获取新数据的副本,然后从生产服务器中删除所有早于三个月的数据。

不幸的是,我们的某些嵌入式设备有时会离线一段时间(几天到几周)。在这种情况下,可能会发生新数据添加到系统中已经复制/存档的时间。

在公共生产服务器上,我们使用SQL Server 2008 Standard Edition,在内部归档系统上,我们希望使用SQL Server 2008 R2 Enterprise Edition从归档的分区和压缩中受益。

目前我正在考虑以下方法:

  1. 每天从生产到归档系统复制数据。删除生产中的旧数据时,不应将其复制到存档系统。我找到了一个忽略复制目标上的删除操作的选项。

  2. 如果不需要在归档系统上同时拥有当前数据,我会定期将所有早于特定时间的数据移动到归档系统。但我必须同步当前数据并移动所有旧数据。

    也许我必须使用混合解决方案:复制用于在归档和生产系统之间同步当前数据以及将旧数据移动到归档系统上的归档表(同时将归档数据的删除从当前表复制到生产系统)。

  3. 你怎么看?您是否有一些建议或了解有关此类问题的最佳做法?这个主题是否涵盖在其他地方(例如书籍)?

    非常感谢你。

    PS:我不确定是否应该在这里或在serverfault上询问这个问题。如果我在这里发布的决定是错误的,请移动它。感谢。

2 个答案:

答案 0 :(得分:1)

您可以做的一件事是同时在两个DB中插入您的Web应用程序。这种方式归档不依赖于prod db。一点都不

您也可以考虑对prod进行分区。数据库,以便从prod DB中删除数据更容易。 (但由于您的prod DB是标准版,因此不是一种选择。)在这种情况下,您可能必须从prod DB中删除行。要执行删除操作,请不要在一个事务中执行整个删除操作。您可能希望将其分解为批次。

最后,在进行删除时密切关注您的tlog增长情况。它可以快速增长。

答案 1 :(得分:1)

关于我们谈论的需要存档的表数量是多少?

如果它只有一个或几个表,您可以通过SQL Server代理定期运行一些SQL。

像这样(非常简化):

-- copy to archive database
insert into ArchiveServer.dbo.ArchiveTable (Column1, Column2, ...)
select Column1, Column2, ...
from ProductionTableOnThisServer
where DateColumn < dateadd(m, -3, getdate())

-- delete in production database
delete from ProductionTableOnThisServer
where DateColumn < dateadd(m, -3, getdate())

为了使此示例有效,需要在生产服务器上运行,必须在生产服务器中将归档服务器配置为linked server

当然,这个小例子远非完美(甚至生产就绪!) 这只是为了表达基本思想。

在现实世界中,您可能还想:

  • 在一个事务中将两个查询包装在一起,这样如果归档由于某种原因不起作用,真实数据就不会被删除
  • 仅插入真正新的行并更新已更改的行
  • 等......