【问题标题】:Sync a huge table of remote database to a table of local database with table containing a field "lastModificationTime"将一个巨大的远程数据库表同步到一个本地数据库表,其中包含一个字段“lastModificationTime”
【发布时间】:2015-05-26 09:12:12
【问题描述】:

无法回答我的问题的类似问题: copy data from a mysql database to other mysql database with javaCopy a huge MySQL table from a remote to a local database

我的问题:我有一个远程 mysql 数据库,我只有 mysql 读取权限,无法访问服务器。那是源数据库。我有另一个 mysql 数据库,我可以同时访问服务器和 mysql。可以说它是目标数据库。两个目标数据库都有一个与源数据库中的表结构重复的表。为了使问题简单化,假设只有新数据被添加到源表中。该表有一个名为“lastModificationTime”的字段,其中包含上次修改(插入)的行的时间戳。基于该字段,使用 java 应用程序,我必须从需要插入到目标数据库表的源表中提取行以同步它们。最初,目标表是空的,源表大小几乎是 3 GB。当我的 java 应用程序尝试从远程表中选择所有行并出现异常时,这会导致问题。异常是 java.sql.SQLException: Communication link failure:... bla bla ...

*注意:我使用 jdbc 连接到这两个数据库。 *注意:如果由于表大小接近 3GB 而没有发生“通信链路故障”,也有可能发生 OutOfMemoryException。

提前致谢。

【问题讨论】:

  • 在一个事务中,尝试从源表中读取COUNT,然后遍历源表,一次处理 1000 条记录。
  • 谢谢。我已经根据您的想法提出了解决方案。我首先读取源表中“lastModificationTime”大于目标表中“lastModificationTime”的行数。然后使用“select ... ... from ... where lastModificationTime> some_value order by lastModificationTime limit a,b”之类的查询迭代从源表中读取行块。然后在目标表中插入这些行。再次感谢您的回复。

标签: java mysql database jdbc


【解决方案1】:

鉴于您的源表的大小,您几乎肯定需要将其划分为可管理的块。

由于您的记录带有时间戳,这应该很容易。精确的实现将取决于您的时间戳格式,您可能需要花一些时间分析源记录以优化它。对于初始导入,您可以从当前日期向后迭代。

基本实现如下所示:

public static void import (){

    int interval = -10; //get records in 10 day blocks
    int returnedRecords = 0;

    Calendar startTime = Calendar.getInstance(); //This will default to now
    Calendar endTime = startTime.add(Calendar.DAY_OF_MONTH, interval); // 10 days ago

    do {

        //code here to get records between start and end timestamps
        returnedRecords = ?? // Get the count of any returned records
        startTime = endTime;
        endTime = endTime.add(Calendar.DAY_OF_MONTH, interval);

    } while (returnedRecords > 0);

【讨论】:

    【解决方案2】:

    最初,您可以简单地将数据备份和恢复到目标服务器。如果可能,您可以尝试在源服务器上编写程序来检测表是否有更改。该程序可以作为 Windows 服务在后台运行。

    另一种方法是编写一个程序,当源数据库中发生更新事务时,该程序将更新目标数据库。

    我参与过几个需要类似同步的集成项目。最好将数据库恢复到最新状态,然后再进行同步。这在处理大量数据库同步的同时减少了开销和异常。

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多