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

MySQL 5.1 儲存程序、函數與複寫完整解析

     編輯:MySQL 資料庫相關知識

MySQL 5.1 引入儲存程序與函數支援,其在複寫環境下的行為備受關注。本文以問答形式系統說明複寫機制、安全限制與已知限制。

核心複寫機制

問題回答
儲存程序/函數執行是否複寫?是。標準行為從主庫複寫到從庫
CREATE/ALTER/DROP 陳述式是否複寫?是。DDL 操作會複寫,兩端結構保持一致
程式內部 DML 如何複寫?記錄每個 DML 事件並逐條複寫,不複寫 CALL 執行呼叫本身

安全性需求與設定

因從庫執行來自主庫二進制日誌的任意陳述式,存在安全風險。DBA 有兩種選項:

  1. 要求 SUPER 權限:建立儲存程序的用戶必須擁有 SUPER 權限
  2. 設定信任變數:SET GLOBAL log_bin_trust_routine_creators = 1,允許擁有 CREATE ROUTINE 權限的用戶建立程序

複寫限制與注意事項

1. 非確定性與時間相關操作

  • 隨機函數:RAND()、UUID() 等結果不可預測,從庫無法重現主庫結果
  • 時間函數:NOW()、SYSDATE() 依賴執行時刻,二進制日誌僅記錄 DML 不含時間約束,從庫重放時會產生不同結果
  • 宣告 DETERMINISTIC 或設定 log_bin_trust_routine_creators=0 仍允許呼叫,但複寫結果不一致風險由開發者自負

2. 大量 DML 部分更新問題

  • 非交易表(如 MyISAM)執行大量插入時發生錯誤,主庫可能部分更新,但從庫因錯誤完全不更新 → 主從資料不一致
  • 函數內 DML 自動以 IGNORE 模式執行,錯誤被忽略不複寫到從庫

最佳實務建議

  • 複寫環境優先使用交易表
  • 避免在儲存程序中使用非確定性函數
  • 時間敏感邏輯改由應用層處理,傳入固定參數
  • 定期驗證主從資料一致性(pt-table-checksum 等工具)
  • 重要業務邏輯考慮移至應用層,降低資料庫複雜度

理解這些機制與限制,能幫助架構師在複寫環境下正確設計儲存程序,避免資料不一致風險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved