将多个表复制到一个表(来自多个数据库)

时间:2011-01-12 13:29:36

标签: sql-server database ssis replication

我有多个相同的数据库(分布在多个服务器上),需要将它们收集到一个点进行数据挖掘等。

我们的想法是从每个数据库中获取Table1Table2,...,TableN并合并它们并将结果放入一个大型数据库中。

为了能够编写查询,并且知道每行来自哪个数据库,我们将向目标表添加单个列DatabaseID,描述该行的来源。 编辑源表不是一种选择,它属于某些专有软件。

我们有大约40台服务器,大约170个数据库,需要复制~40个表。

现在,我们应该如何实现它,因为它应该是:

  • 易于设置
  • 易于维护
  • 如果数据库架构更改,则最好易于调整
  • 如果出现故障,可靠,记录/报警
  • 添加更多表来复制
  • 并不太难

我们已经研究过SSIS,但似乎我们必须将每个表添加为源/转换/目标。我猜它也会与数据库架构紧密相连。正确?

另一种选择是使用SQL Server Replication,但我没有看到如何将DatabaseID列添加到每个表中。似乎只能复制数据,而不是修改数据。 也许我们可以将所有数据复制到单独的数据库中,然后在目标服务器上运行本地作业来合并表? 如果我们需要添加更多表来复制,似乎还有很多工作,因为我们必须为每个数据库重新分发新的出版物(手工工作?)。

最后一个选项(?)是根据我们的需求编写自定义应用程序。更大的时间投入,但它至少做到了我们想要的。

更糟糕的是......我们正在使用Microsoft SQL Server 2000。 我们将在6个月内升级到SQL Server 2008 R2,但我们希望该项目能够更快地使用。

让我知道你们的想法!

更新20110721

我们最终得到了一个F#程序,它打开了我们想要聚合数据库的SQL Server连接。从那里我们查询40个链接的SQL Server以从一些表中获取所有行(但不是所有列),并向每个表添加一个额外的行以说明该行来自哪个DatabaseID。 要从中获取的服务器的配置,哪些表和哪些列是文本文件配置和硬编码值的组合(heh:D)。 它不是超快(顺序提取到目前为止),但它绝对可管理,我们之后进行的数据处理需要更长的时间。

未来的改进可能是;

  • 如果结果是问题(如果服务器不在线等),则改进错误处理。
  • 实现并行提取,以减少完成提取的总时间。
  • 弄清楚它是否足以仅获取部分行,例如仅添加/更新的行。

总而言之,事实证明它非常简单,不依赖于其他产品,并且在实践中效果很好。

2 个答案:

答案 0 :(得分:4)

没有什么花哨但你不能做像

这样的事情
DROP TABLE dbo.Merged

INSERT INTO dbo.Merged
SELECT  [DatabaseID] = "Database1", * FROM ServerA.dbo.Table
UNION ALL SELECT  [DatabaseID] = "Database2", * FROM ServerB.dbo.Table
...
UNION ALL SELECT  [DatabaseID] = "DatabaseX", * FROM ServerX.dbo.Table

<强>优点

  • 易于设置
  • 易于维护
  • 易于调整
  • 轻松添加更多表格

<强>缺点

  • 性能
  • 可靠的记录

答案 1 :(得分:0)

我们有一个类似的要求,我们采取了不同的方法。首先创建一个中央数据库来收集数据。然后我们创建了一个库存表来存储目标服务器/数据库列表。然后是一个基于vb.net的小程序,它采用SQL查询的路径,目标SQL实例名称和将存储数据的目标表(这将消除添加新目标时链接服务器的设置)。这还会在结果集中添加两个附加列。目标服务器名称和捕获数据时的时间戳。

然后我们设置服务代理队列/服务并推送目标服务器列表以进行interogate。

上面的CLR过程包含在另一个过程中,该过程使消息出列,在提供的目标服务器上执行SQL。然后将包装程序配置为队列的激活过程。

通过这种方式,我们可以实现一些并行性来捕获数据。

优点:

  • 易于设置易于管理(添加/删除目标)
  • 同一框架适用于多个查询
  • 记录表以检查查询失败。
  • 独立于每个目标工作,因此如果其中一个目标失败 回应,其他人仍然继续。
  • 可以通过禁用队列来优雅地暂停工作流程(for 维护中央服务器)然后恢复收集 重新启用它。

缺点:

  • 需要对服务经纪人有充分的了解。
  • 应妥善处理有害信息。

如果有帮助请告诉我