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

这个想法是从每个数据库中取出 Table1 , Table2 , ..., TableN 并将它们合并并将结果放入一个大数据库中。

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

我们有大约 40 个服务器、大约 170 个数据库并且需要复制大约 40 个表。

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

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

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

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

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

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

    让我知道你们的想法!

    更新 20110721

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

    future 的改进可能是;
  • 改进错误处理,如果它被证明是一个问题(如果服务器不在线等)。
  • 实现并行抓取,以减少完成抓取的总时间。
  • 确定是否仅获取某些行(例如仅添加/更新的行)就足够了。

  • 总而言之,结果证明它非常简单,对其他产品没有依赖性,并且在实践中运行良好。

    最佳答案

    没什么特别的,但你不能做类似的事情

    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
    

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

  • 缺点
  • 性能
  • 可靠的日志记录
  • 关于sql-server - 将多个表复制到一个表中(来自多个数据库),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4669305/

    10-13 04:43
    查看更多