【问题标题】:Clone table from database to database从数据库克隆表到数据库
【发布时间】:2015-09-11 07:40:02
【问题描述】:

我需要一种解决方案来从一个数据库实例 (DB1) 获取整个表并在另一个数据库实例 (DB2) 上创建相同的表。之前我用的很紧,但是听说Spring Batch更适合这种情况,想试试。

那么,通过以下步骤使用 Spring Batch 作业是否可能/有意义:

  1. 在 DB2 上创建一个与 DB1 中的源表具有相同架构的空表。
  2. 从 DB1 表中选择 -> 更新 DB2 表。以防万一在步骤中出现错误 - 在 DB2 上回滚和删除表。

使用 Spring Integration 我看到了JdbcInboundChannelAdapter -> QueueChannel -> OutboundGateway 的可能解决方案,但也许 Spring Batch 可能是更好的选择?任何建议都非常感谢。

【问题讨论】:

  • 为什么不简单地使用数据库呢?在 DB1 中导出并在 DB2 中导入?为什么要对应用程序这样做?
  • 因为它必须是现有应用程序和服务的一部分,所以很明显。
  • 速度慢且容易出错。数据库通常具有开箱即用的支持。我会首先尝试让一个 DBA 加入,它可以告诉你如何使用 SQL 轻松完成它,然后围绕它编写一个服务。不要将整个数据库拉入内存并再次存储它通常是一个坏主意,特别是如果它是一个普通副本......(恕我直言)。
  • 我们有一堆基于 Java 的微服务,所以我决定创建另一个并同时学习似乎适合这种情况的 Spring Batch。

标签: spring spring-integration spring-batch


【解决方案1】:

这取决于您的要求。

我们最初使用 spring-batch 加载 DWH。但这不是简单的一对一副本。生产数据库中的数据存储在垂直表设计(又名实体-属性-值-模型)中。此外,每个条目也被双时间历史化。总而言之,这些是大约 5'000'000'000 行,必须根据正确的时间维度进行分组并转换为水平数据库设计。当然,这是从 DB2 到 Oracle。

因此我们必须对结构进行重大转换,必要时我们必须转换数据类型,并且我们有 50 亿行要处理。

如果您在同一个数据库系统中只有一个简单的 1:1 副本,那么最简单的方法是使用数据库工具。

如果您必须在不同的数据库系统之间进行传输,可以选择 spring batch。

如果您必须转换数据,无论是结构还是类型,都可以选择 spring batch。

如果您有很多行,您可以使用 Spring Batch 的分区功能来并行化或简单地启动具有不同 id-range 的同一作业几次。

如果您要复制多个表,则可以使用拆分流从各个表中并行加载数据。

在我目前合作的公司,我们拥有完全通用的文件/数据库读取器和写入器,它们完全基于数据库元模型。如果我想做一个简单的复制工作,我只需要定义源数据源和目标数据源以及所需的表,并适当地初始化读取器和写入器。如果名称匹配,我什至不必添加配置来映射表之间的数据。

这导致我们提出以下基本问题

  1. 需要什么样的转换逻辑?
  2. 需要什么样的性能?
  3. 需要复制多少个表?
  4. 源和目标是否在同一个系统上?

【讨论】:

  • 感谢您的广泛回答,至于您的观点:1.不需要转换。 2.性能不是必需的——我们只需要成功克隆表。 3. 每个工作会话一个。 4. 源和目标可以在不同的系统上一样,通常是不同的数据库实例。
【解决方案2】:

我已经使用我的另一篇文章中描述的配置解决了我的任务:How should I use .tasklet() / .chunk() to finish job succesfully?。谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-23
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多