1

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

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

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

在公共生产服务器上,我们使用 SQL Server 2008 标准版,在内部存档系统上,我们希望使用 SQL Server 2008 R2 企业版来从存档的分区和压缩中受益。

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

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

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

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

你怎么看?对于此类问题,您是否有一些建议或知道一些最佳实践?该主题是否在其他地方(例如书籍)涵盖?

非常感谢您提前。

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

4

2 回答 2

1

我们谈论的是多少表需要归档?

如果只是一张或几张表,你可以通过 SQL Server Agent 定期运行一些 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())

为了使该示例能够正常工作,它需要在生产服务器上运行,并且存档服务器必须配置为生产服务器中的链接服务器。

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

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

  • 将两个查询包装在一个事务中,这样如果由于某种原因归档不起作用,则不会删除真实数据
  • 仅插入真正新的行并更新已更改的行
  • 等等...
于 2011-10-07T19:00:03.943 回答
1

您可以做的一件事是让您的网络应用程序同时插入两个数据库。这种方式归档不依赖于产品数据库。一点也不。

您也可以考虑对产品进行分区。DB,以便更容易从 prod DB 中删除数据。(但由于您的 prod DB 是标准版,所以这不是一个选项。)在这种情况下,您可能必须从 prod DB 中删除行。要执行删除,不要在一个事务中执行整个删除。你可能想把它分成几批。

最后,在执行删除操作时密切关注您的 tlog 增长情况。它可以很快变大。

于 2011-10-07T18:16:13.093 回答