将庞大的数据库表转换为另一个表

时间:2014-06-20 06:35:29

标签: java mysql sql performance jdbc

我们正在将大量数据从旧数据库迁移到新数据库。

目前,随着迁移的进行,他们都在积极[写/读]基于流/活动使用。

现在,这对我来说是真正的挑战。 我们有旧的数据库表,现在仍在使用。

每天都会插入100,000条新记录,我们需要将6个月大的数据[01-01-2014]移至新数据库。

我们在两个地方都使用MySQL。旧表的新表需要对数据进行一些逻辑转换,这些数据将通过Java-JDBC进行,因为表结构和功能已更改。

我需要遵循并注意尽可能快地完成此转换的理想步骤。

根据我的计算,我们将至少迁移20,000,000条记录。

一些信息:

  1. 目前索引仅存在于ID列上。 creation_date存在 没有索引
  2. 如何有效地获取这些记录,更好的查询 获取??
  3. 使用多线程进行转换的有效方法
  4. 将数据写入新数据库的有效方式

1 个答案:

答案 0 :(得分:3)

我希望你能够改变这两个数据库。 正如您所写的那样,在处理迁移过程中数据会发生变化,因此迁移需要多次运行时,所需的时间不应该太长。它必须应对不断变化的数据集,不要打扰性能,打扰正确性。

首先将索引的布尔列添加到旧数据库以标记迁移的数据,因此您不需要多次迁移它。如果旧数据库中的数据在迁移过程中更新(而不仅仅是插入),请使用时间戳列。标记最后一次移动的时刻和最后编辑的时刻 - 这样你就可以看到需要转换的内容和已经发生的内容。

从较旧到较新的块中选择数据。每个线程一个块(所以第一个线程需要第1周,第二个需要第2周等)。如果你的表没有插入日期字段,请使用其他东西来分割它 - ID范围,名字的第一个字母,你有什么。确保排序列上有索引!

然后以这种形式处理数据:

  1. 在两个dbs上打开交易。
  2. 从旧的数据中选择一大块数据
  3. 转换信息
  4. 创建batch以便在新方面插入(每行一行)
  5. 创建批次以标记为旧方转换
  6. 执行两个批次
  7. 仅在两个批次都正确执行时才提交两个事务。
  8. 这里的瓶颈很可能是java< - > SQL Server网络连接所以使用足够大的连接池是非常重要的(至少从开始+2我建议的几周后)。

    在转换完所有数据之后,您需要经常重新运行它以使数据保持最新。你对碰撞的处理取决于你。

    如果您可以从旧数据库中选择跨数据库,则插入触发器与跨数据库视图相结合将为您节省很多痛苦并使转换变得柔和。