SQL Server:存档旧数据

时间:2017-09-07 20:43:57

标签: sql-server ssis archive linked-server

我有一个相当大的数据库,但客户只对过去两年感兴趣'数据。但他们希望保留较旧的数据"只是在案例中#34;。

现在我们希望通过WAN将数据存档到其他服务器。

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

  1. 将查找表,包含主数据和外键表的表中的所有数据复制到存档服务器。
  2. 将数据从事务表复制到存档数据库。
  3. 从主数据库中删除超过2年的事务数据。
  4. 虽然这种方法能够从根本上满足我们的需求,但主要的两个问题是:

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

2)SQL Agent Job,它将执行SSIS包。

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

1)SQL代理作业执行SSIS包,该包将要从实时数据库存档的数据传输到复制数据库。这应该按特定顺序进行,以避免外键违规。

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

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