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

MySQL 5.1 存儲過程、函數、觸發器與復制交互完整指南:安全限制、確定性要求與最佳實踐

     編輯:MySQL 資料庫相關知識

復制行為確認

  • 存儲過程/函數執行效果會復制:主庫執行的 DML 事件逐條記錄 Binlog,重放到從庫(不復制 CALL 語句本身)。
  • DDL 同步復制:CREATE/ALTER/DROP PROCEDURE|FUNCTION 同步到從庫。

安全限制(關鍵)

因從庫線程擁有執行 Binlog 任意語句的權限,MySQL 強制兩種安全模式二選一:

  1. 創建者需 SUPER 權限:GRANT SUPER ON *.* TO 'dev'@'%';
  2. 或開啟信任模式:SET GLOBAL log_bin_trust_routine_creators = 1;(或配置文件 log_bin_trust_routine_creators=1),允許僅有 CREATE ROUTINE 權限的用戶創建。

生產環境建議方案一,嚴格控制 SUPER 權限分配。

復制限制與陷阱

1. 非確定性函數不可復制

  • UUID()、RAND()、NOW()、SYSDATE()、FOUND_ROWS() 等每次調用結果不同。
  • 主從執行結果不一致 → 數據漂移。
  • 聲明 DETERMINISTIC 或設置 log_bin_trust_routine_creators=0 只會阻止創建,無法改變運行時行為。

2. 基於時間的邏輯不可復制

  • Binlog 僅記錄 DML 事件,不記錄壁鐘時間上下文。
  • 存儲過程中用 NOW() 判斷業務邏輯,重放時時間已變 → 邏輯分支不一致。

3. 大批量 DML 部分失敗的不一致風險

  • 主庫大批次 INSERT 中途報錯(如唯一鍵衝突),已執行行提交,未執行行回滾。
  • 從庫重放同一語句,若用 IGNORE 則跳過錯誤行繼續執行 → 主從行數不一致。
  • 函數內 DML 隱式以 IGNORE 執行,錯誤不中斷復制但可能導致數據差異。

最佳實踐清單

  1. 存儲過程/函數盡量純確定性邏輯,避免隨機、時間、非確定性函數。
  2. 業務時間邏輯由應用層傳參數,而非存儲過程內調用 NOW()。
  3. 大批量寫入應用層分批、捕獲異常、決定重試/補償,不依賴存儲過程原子性。
  4. 嚴格控制 SUPER、CREATE ROUTINE 權限,審計所有對象變更。
  5. 監控主從延遲與數據一致性(pt-table-checksum、pt-heartbeat)。
  6. MySQL 5.7+ 推薦使用 GTID + ROW 格式 Binlog,語句級復制風險更大。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved