使用SSIS将一个数据库(生产数据库)中超过3年的记录移动到另一个数据库(存档数据库)

时间:2013-04-26 10:56:21

标签: sql-server-2005 ssis archive purge

要求将数据从生产数据库移动到存档数据库3年以上,并且一旦移动从生产数据库中删除这些记录,因此在任何时间点生产数据库将只有最近三年的记录。

我希望通过SSIS实现这一目标,我阅读了很多关于数据存档的文章,但无法找出最好的Approch。

我是SSIS的新手

我希望达到类似这样的效果(在下面的链接中给出答案),附加条件是只移动那些超过3年的记录,然后删除这些记录。

https://dba.stackexchange.com/questions/25867/moving-data-from-one-db-to-another-using-ssis

接受答案答案的标准应该解决

  • 可扩展性
  • 复杂性
  • 失败处理
  • 可靠性

3 个答案:

答案 0 :(得分:1)

您可以使用OUTPUT子句一次删除并返回要移动的数据。

create table ProductionTable
(
    ValueDate   datetime        not null
    , Data      varchar(max)    not null
)

insert ProductionTable values ('20100101', '3 years ago')
insert ProductionTable values ('20130425', 'this year')
insert ProductionTable values ('20130426', 'this year')

delete ProductionTable
output deleted.ValueDate, deleted.Data
where ValueDate <= dateadd(year, -3, getdate())

也可以在SQLFiddle

上访问该代码

现在,我将向您展示在SSIS中需要遵循的具体步骤,以重现该示例:

  1. 创建一个新项目并为ProductionDB和ArchiveDB定义数据源。
  2. 在“控制流”选项卡中,创建“数据流任务”。
  3. 在“数据流”选项卡中,创建“OLE DB源”和“OLE DB目标”。
  4. 在“OLE DB Source”中,选择ProductionDB并选择“SQL命令”作为数据访问模式。使用output子句粘贴到delete语句中。
  5. 点击“栏目”,然后点击确定。
  6. 在“OLE DB Destination”中,选择ArchiveDB并选择“Table or view - fast load”作为数据访问模式,然后选择ArchiveTable。
  7. 点击“Mappings”,然后点击Ok。
  8. 运行包,您应该能够验证是否从ProductionTable中删除了一行并移至ArchiveTable。
  9. 希望它有所帮助。

    要记住的其他事项,因为您正在删除和移动数据,事务一致性非常重要。想象一下,在删除/移动的一半时,服务器停止运行,然后最终将数据删除但不会将其存储到存档中。

    如果您不确定如何通过强制执行事务一致性来保护数据,请向其他SQL / SSIS专家寻求有关如何在SSIS中使用事务的帮助。

答案 1 :(得分:1)

创建2个OLE DB连接管理器。将它们命名为Production和Archive,并将它们指向正确的服务器和数据库。这些CM是SSIS用来从数据库中推送和提取数据的。

添加数据流任务。 DFT是允许逐行操作数据的可执行文件。双击数据流任务。进入后,将OLE DB源和OLE DB目标添加到画布。 OLE DB源是OLE DB目标提供插入功能时数据来源的位置。

您想要实现的逻辑是Delete first方法,就像我在另一个答案中概述的那样。

DELETE
    DF
OUTPUT
    DELETED.*
FROM
    dbo.DeleteFirst AS DF
WHERE
    DF.RecordDate > dateadd(y, 3, current_timestamp);

此查询将删除超过3年的所有行将它们推送到数据流中。在OLE DB源中,进行以下配置更改

  1. 将连接管理器从Archive更改为Production
  2. 将查询类型从“表格或视图”更改为“查询”
  3. 粘贴您的查询,然后点击“列”标签以仔细检查已解析的查询
  4. 将OLE DB源连接到OLE DB目标。双击OLE DB目标并配置它

    1. 验证Connection Manager是Archive
    2. 确保访问模式为“表格或视图 - 快速加载”(名称近似)
    3. 您可能需要根据表格设计检查保留ID - 如果您有标识列,那么如果您希望生产系统中的ID 10在存档系统中为ID 10,请进行检查
    4. 选择实际的表格
    5. 在“映射”选项卡上,确保映射了所有列。它通过匹配名称自动执行此操作,因此不会出现问题。
    6. 如果您不需要跨越实例,可以将上述逻辑压缩为单个Execute SQL Task

      DELETE
          DF
      OUTPUT 
          DELETED.*
          INTO
          ArchiveDatabase.dbo.DeleteFirst
      FROM
          dbo.DeleteFirst AS DF
      WHERE
          DF.RecordDate > dateadd(y, 3, current_timestamp);
      

      另请注意,使用此方法时,如果您有标识列,则需要提供显式列列表并打开和关闭IDENTITY_INSERT属性。

答案 2 :(得分:0)

您是否考虑过表格分区?您可以将旧记录移动到完全不同的磁盘,并将它们保留在同一个表中。在某些情况下,它也有助于提高性能......所有这些都没有SSIS包。

相关问题