3

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

我想通过 SSIS 实现这一点,我阅读了很多关于数据存档的文章,但无法找出最好的方法。

我是 SSIS 的新手

我想实现这样的事情(答案在下面的链接中给出),额外的条件是只移动那些超过 3 年的记录,然后删除这些记录。

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

接受答案的标准应解决

  • 可扩展性
  • 复杂
  • 故障处理
  • 可靠性
4

3 回答 3

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 command”作为数据访问方式。粘贴带有输出子句的删除语句。
  5. 单击“列”,然后单击确定。
  6. 在“OLE DB Destination”中,选择 ArchiveDB 并选择“表或视图 - 快速加载”作为数据访问模式,然后选择您的 ArchiveTable。
  7. 单击“映射”,然后单击确定。
  8. 运行该程序包,您应该能够验证是否从 ProductionTable 中删除了一行并移至 ArchiveTable。

希望能帮助到你。

其他要记住的事情,因为您正在删除和移动数据,所以事务一致性非常重要。想象一下,在您删除/移动的过程中,服务器出现故障,然后您的数据被删除但没有进入存档。

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

于 2013-04-26T12:19:34.027 回答
1

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

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

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

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

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

  1. 将连接管理器从更改ArchiveProduction
  2. 将查询类型从“表或视图”更改为“查询”
  3. 粘贴您的查询并单击“列”选项卡以仔细检查已解析的查询

将 OLE DB 源连接到 OLE DB 目标。双击 OLE DB 目标并进行配置

  1. 验证连接管理器是Archive
  2. 确保访问模式为“表或视图 - 快速加载”(近似名称)
  3. 您可能需要根据您的表设计检查保留 ID - 如果您有标识列,那么如果您希望生产系统中的 ID 10 成为存档系统中的 ID 10,请检查它
  4. 选择实际表
  5. 在映射选项卡上,确保所有列都已映射。它通过匹配名称自动执行此操作,因此应该没有问题。

如果不需要跨实例,上面的逻辑可以浓缩成一个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 属性。

于 2013-04-26T12:20:44.187 回答
0

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

于 2013-04-27T02:19:27.100 回答