首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 複寫功能實測全紀錄:主從配置、雙向複寫、PHP 連線自動切換與超時處理

     編輯:MySQL 資料庫相關知識

基於 MySQL 3.23.23 實測完整複寫部署流程。官方建議生產環境用最新版、主從同版本。

架構規劃

  • A (10.1.1.1) 主伺服器
  • B (10.1.1.2) 備伺服器

步驟 1:配置主伺服器

  1. 建立複寫帳號:GRANT FILE ON *.* TO replicate@10.1.1.2 IDENTIFIED BY 'passWord';
  2. FLUSH PRIVILEGES;
  3. 編輯 my.cnf 加 log-bin,重啟產生二進位日誌
  4. 關閉服務,複製全庫資料目錄到備機,重啟主機
  5. 關鍵:確保複製前二進位日誌關閉,避免主鍵衝突

步驟 2:配置備機

  1. 停止備機 MySQL,放入主機資料目錄,修正擁有者/權限
  2. 啟動驗證 SELECT 正常,再關閉
  3. 編輯 my.cnf 加:
    master-host=10.1.1.1
    master-user=replicate
    master-password=passWord
  4. 啟動備機,自動同步主機變更
  5. 狀態查看:SHOW SLAVE STATUS;錯誤修正後 SLAVE START 續傳

步驟 3:建立雙向複寫 (互為主從)

  1. 備機加 log-bin 重啟
  2. 備機建帳號:GRANT FILE ON *.* TO replicate@10.1.1.1 IDENTIFIED BY 'passWord';
  3. 主機加 master-host=10.1.1.2 等設定,重啟
  4. 任一寫入自動同步至另一台

警示:同步延遲不可控,不建議用於負載平衡寫入。

步驟 4/5:PHP 連線自動切換與超時處理

基本版 (無超時,主機掛掉會無限等待)

function db_connect() {
  $link = @mysql_connect("10.1.1.1", "replUser", "passWord");
  if (!$link) $link = @mysql_connect("10.1.1.2", "replUser", "passWord");
  return $link;
}

進階版 (fsockopen 模擬連線超時)

function db_connect_plus() {
  $timeout = 15;
  if ($fp = @fsockopen("10.1.1.1", 3306, $errno, $errstr, $timeout)) {
    fclose($fp);
    return mysql_connect("10.1.1.1", "username", "passWord");
  }
  if ($fp = @fsockopen("10.1.1.2", 3306, $errno, $errstr, $timeout)) {
    fclose($fp);
    return mysql_connect("10.1.1.2", "username", "passWord");
  }
  return false;
}

先探測埠口存活再連線,避免主機掛掉導致 PHP 掛起。

結論與建議

  • 完整快照時機關鍵:關機 → 複製 → 開啟 binlog → 啟動
  • 定期監控 SHOW SLAVE STATUS 確保同步
  • 負載平衡建議:一寫多讀,寫入集中單主
  • 詳細文件參考官方手冊第 11 章
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved