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

MySQL 5.1 預存程序、函數與複寫互動完整問答指南

     編輯:MySQL 資料庫相關知識

核心問答

  1. 預存程序/函數對複寫有效嗎?
    是。主庫執行的標準行為會複寫到從庫。
  2. 主庫建立的程序/函數會複寫到從庫嗎?
    是。DDL 建立/修改/刪除 (CREATE/ALTER/DROP) 均會複寫,兩端結構一致。
  3. 複寫內部如何執行?
    記錄程序/函數內部的每個 DML 事件並複寫這些單獨動作,不複寫 CALL/呼叫語句本身。
  4. 安全性要求?
    從庫有權執行來自主庫二進位日誌的任何語句,故有特殊限制:
    方案 A:建立程序的用戶必須擁有 SUPER 權限
    方案 B:設定 log_bin_trust_routine_creators = 1 允許標準 CREATE ROUTINE 權限即可建立
  5. 複寫限制?
    • 非確定性 (隨機/時間相關) 行為無法正確複寫:
      隨機結果無法克隆;時間基準動作依賴二進位日誌只記錄 DML 不含時間約束,從庫無法重現
    • 大量 DML 中非事務表發生錯誤:主庫可能部分更新,從庫完全不更新 → 數據不一致
    • 函數內 DML 錯誤:工作區自動加 IGNORE 執行,主庫錯誤被忽略不複寫到從庫

實務啟示

  • 複寫環境下慎用 RAND()、NOW()、UUID() 等非確定性函數
  • 關鍵業務務必使用事務表 (InnoDB) 避免部分更新不一致
  • 函數中執行 DML 會隱式加 IGNORE,錯誤不會中斷複寫但可能導致數據偏差
  • 定期驗證主從數據一致性 (pt-table-checksum 等工具)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved