从源数据库插入到目标数据库,不同的服务器

时间:2017-11-30 17:26:45

标签: mysql sql

我有2个数据库服务器,一个源和目的地。

我最近克隆了从源到目的地的2个表,我有一个脚本,它使用目标表的最大ID来从源中插入所有内容。这是每5分钟运行一次,作为更新目标服务器上数据的粗略方法。

它缺少记录,所以我希望采用不同的方法。

我想从源表中选择所有内容,如果目标中没有id,则插入它。我不知道最好的方法,但我需要一些准确的东西,以便它不再错过记录。

这是当前的脚本:

$latest_result_summary = $conn2->query("
        SELECT MAX(`NOTABLECALLID`) FROM `ambition`.`callsummary`");
$latest_row_summary = $latest_result_summary->fetch_row();
$latest_summary_id = $latest_row_summary[0];

//select All rows from the source phone database(callsummary)
$source_data_summary = mysqli_query($conn, "
        SELECT * FROM `cdrdb`.`callsummary` 
        WHERE `NOTABLECALLID` > $latest_summary_id");

// Loop on the results
while($source_summary = $source_data_summary->fetch_assoc()) {

        // Check if row exists in destination phone database, cdrdb.callsummary
        $row_exists_summary = $conn2->query("
                SELECT NOTABLECALLID FROM ambition.callsummary 
                WHERE NOTABLECALLID = '".$source_summary['NOTABLECALLID']."' ")
        or die(mysqli_error($conn2));

        //if query returns false, rows don't exist with that new ID.
        if ($row_exists_summary->num_rows == 0){

                //Insert new rows into ambition.callsummary
                $stmt_summary = $conn2->prepare("
                        INSERT INTO ambition.callsummary 
                        (NOTABLECALLID, STARTTIME, ENDTIME, DURATION, 
                         ANSWERED, ts, firstcallid)
                        VALUES ( ?, ?, ?, ?, ?, ?, ?)")
                or die(mysqli_error($conn2)) ;

                mysqli_stmt_bind_param($stmt_summary, "issiisi", 
                        $source_summary['NOTABLECALLID'], 
                        $source_summary['STARTTIME'],
                        $source_summary['ENDTIME'], 
                        $source_summary['DURATION'],
                        $source_summary['ANSWERED'], 
                        $source_summary['ts'],
                        $source_summary['firstcallid'] 
                );

                $stmt_summary->execute() or die(mysqli_error($conn2));


        }
}       

这里的关键是我们没有使用我们的dba和电话系统来设置复制,所以如果它不存在,我只需要一个很好的准确方法来插入目的地。

1 个答案:

答案 0 :(得分:1)

我会使用mysqldump

  1. 找到最大的NOTABLECALLID并将其存储在变量$latest_summary_id中,就像现在一样。

  2. 转储源数据库中的数据,但使用选项将数据限制为大于$latest_summary_id的行。还可以使用INSERT IGNORE,因此它将跳过任何现有行而不会抛出错误。当然,不要包含目标表的drop / create语句!

    mysqldump cdrdb callsummary
      --host sourcedbhost
      --single-transaction 
      --no-create-info 
      --insert-ignore 
      --where "notablecallid > $latest_summary_id"
      > callsummary-YYMMDD.sql
    
  3. 将转储导入目标数据库:

    mysql
      --host destdbhost
      --execute "source callsummary-YYMMDD.sql"