我有多个相同的数据库(分布在多个服务器上),需要将它们收集到一个点进行数据挖掘等。
我们的想法是从每个数据库中获取Table1
,Table2
,...,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)。 它不是超快(顺序提取到目前为止),但它绝对可管理,我们之后进行的数据处理需要更长的时间。
未来的改进可能是;
总而言之,事实证明它非常简单,不依赖于其他产品,并且在实践中效果很好。
答案 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。然后将包装程序配置为队列的激活过程。
通过这种方式,我们可以实现一些并行性来捕获数据。
优点:
缺点:
如果有帮助请告诉我