萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 主從資料同步實作:PHP 腳本 + Crontab 定時同步方案

針對主機 A (動態 IP) → 主機 B (固定 IP) 的單向資料同步需求,採用 PHP 腳本比對最大 ID 差異並補寫,配合 Crontab 定時執行。

架構邏輯

  1. 主機 A 連線本地 DB 取得目標表最大 ID ($local_max_id)。
  2. 主機 A 連線主機 B DB 取得目標表最大 ID ($remote_max_id)。
  3. 若 $local_max_id > $remote_max_id,查出差異區間資料 LIMIT $remote_max_id, $diff。
  4. 將差異資料陣列逐筆 INSERT 寫入主機 B。

核心 PHP 程式碼精簡版

<?php
$local = mysqli_connect('localhost', 'user', 'pass', 'test');
$remote = mysqli_connect('5.6.7.8', 'user', 'pass', 'test');

$local_max = (int)mysqli_fetch_row(mysqli_query($local, 'SELECT MAX(id) FROM t'))[0];
$remote_max = (int)mysqli_fetch_row(mysqli_query($remote, 'SELECT MAX(id) FROM t'))[0];

if ($local_max > $remote_max) {
    $res = mysqli_query($local, "SELECT col FROM t WHERE id > $remote_max AND id <= $local_max");
    while ($row = mysqli_fetch_row($res)) {
        mysqli_query($remote, "INSERT INTO t(col) VALUES('".mysqli_real_escape_string($remote, $row[0])."')");
    }
}
mysqli_close($local); mysqli_close($remote);
?>

定時執行設定

# /etc/crontab
0 2 * * * root /usr/bin/php -q /home/sync/sync_t.php >> /var/log/sync_t.log 2>&1

每天凌晨 2 點自動執行,日誌留存備查。

局限與改進方向

  • 僅支援新增同步,UPDATE/DELETE 需額外機制(如 Binlog 解析、觸發器記錄變更表)。
  • 單向同步,雙主雙寫衝突解決需引入 GTID 或應用層衝突檢測。
  • 大量差異時建議批次 INSERT ... VALUES (...),(...) 或 LOAD DATA 提升效能。
  • 生產環境強烈建議改用原生 Replication (GTID) 或 pt-table-sync,僅作為簡易備援或異構同步參考。
copyright © 萬盛學電腦網 all rights reserved