【问题标题】:SQL Server: Archiving old dataSQL Server:归档旧数据
【发布时间】:2020-01-20 21:31:52
【问题描述】:

我有一个越来越大的数据库,但客户只对最近 2 年的数据感兴趣。但他们希望保留旧数据“以防万一”。

现在我们想通过 WAN 将数据归档到不同的服务器。

我的计划是创建一个存储过程:

  1. 将查找表、包含主数据的表和外键表中的所有数据复制到存档服务器。
  2. 将事务表中的数据复制到存档数据库。
  3. 从主数据库中删除超过 2 年的事务数据。

虽然该方法理论上可以满足我们的需求,但存在两个主要问题:

  1. 性能:我正在通过 SQL 链接服务器复制数据。有些大表真的很慢,因为它需要比较哪些记录存在然后更新它们,不存在的记录需要创建。好像会在 3-4 小时内运行。

  2. 我们需要以正确的顺序复制表以防止外键违规,并且与自身有关系的表(例如带有 ParentCustomer 字段的客户表)需要在没有 ParentCustomer 的情况下转移然后需要更新 ParentCustomer 以防止 FK 违规。因此,自动生成我的插入和更新语句变得很困难(我想尽可能地自动生成我的语句)。

我只是觉得可能有更好的方法来归档我还不知道的数据。 SSIS 可能是一种选择,但不确定它是否会阻止我现有的挑战。我对 SSIS 了解不多,所以如果是这样的话,我可能需要找一些材料来研究它。

【问题讨论】:

  • 一个建议:跨多个主轴或 ssd 分区表。保留当前和历史的滑动窗口分区。当前数据将从一个磁盘读取,另一个从较慢的磁盘读取。
  • 我同意 - 不要假设您需要跳过箍来归档数据。首先研究分区(您可以透明地将数据移动到另一个磁盘)和集群列存储索引(压缩数据并提高性能)

标签: sql-server ssis archive linked-server


【解决方案1】:

我相信您需要一个将作为计划任务运行的批处理;也许每天晚上。有两个选项,您已经讨论过:

1) SQL 代理作业,执行存储过程。存储过程将使用链接服务器。

2) SQL 代理作业,它将执行一个 SSIS 包。

我相信您可以从这两种方法的组合中受益,从而避免使用 Linked Serverd。步骤如下:

1) SQL 代理作业执行 SSIS 包,它将要归档的数据从实时数据库传输到副本数据库。这应按特定顺序完成,以避免违反外键。

2) 一旦 SSIS 包执行了传输,它就会在实时数据库上执行一个存储过程,删除超过两年的信息。存储过程不需要任何链接服务器。

您必须使用事务来确保不存档重复数据。例如,如果 SSIS 包失败,则应回滚事务,不应执行存储过程。

【讨论】:

    【解决方案2】:

    您可以使用table partitions 为相关日期范围创建单独的分区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2010-09-07
      相关资源
      最近更新 更多