我有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和电话系统来设置复制,所以如果它不存在,我只需要一个很好的准确方法来插入目的地。
答案 0 :(得分:1)
我会使用mysqldump
。
找到最大的NOTABLECALLID并将其存储在变量$latest_summary_id
中,就像现在一样。
转储源数据库中的数据,但使用选项将数据限制为大于$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
将转储导入目标数据库:
mysql
--host destdbhost
--execute "source callsummary-YYMMDD.sql"