首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 主從同步中函數與存儲過程同步失敗的解決方案

     編輯:MySQL 綜合教學

問題背景

在配置 MySQL 主從複製時,經常會遇到函數與存儲過程無法正常同步的問題。主庫創建或修改函數後,從庫報錯並導致 Slave 線程停止,嚴重影響數據同步的連續性。

錯誤原因分析

MySQL 為了安全性考慮,預設設置 log_bin_trust_function_creators = OFF (0)。當啟用二進制日誌時,創建函數必須顯式聲明其特性:DETERMINISTIC、NO SQL 或 READS SQL DATA。若未聲明,MySQL 會拒絕創建並拋出錯誤:

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

在主從架構中,主庫執行 DDL 操作寫入 Binlog,從庫重放時同樣受此限制,導致同步中斷。

函數特性聲明說明

  • DETERMINISTIC:確定性函數,相同輸入必產生相同輸出
  • NO SQL:不包含 SQL 語句
  • READS SQL DATA:僅讀取數據,不修改數據
  • MODIFIES SQL DATA:會修改數據(不被支持)
  • CONTAINS SQL:包含 SQL 語句(不被支持)

只有前三種特性在啟用 Binlog 時被允許。

解決方案

臨時生效(運行時動態調整)

mysql> SET GLOBAL log_bin_trust_function_creators = 1;
mysql> START SLAVE;

此設置立即生效,但 MySQL 重啟後失效。

永久生效(配置文件修改)

編輯 my.cnf(或 my.ini),在 [mysqld] 區段添加:

[mysqld]
log_bin_trust_function_creators = 1

重啟 MySQL 服務後永久生效。

驗證修改結果

mysql> SHOW VARIABLES LIKE '%func%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON    |
+---------------------------------+-------+

觀察 Slave 狀態 Slave_IO_Running 和 Slave_SQL_Running 均為 Yes,且 Seconds_Behind_Master 正常減少,即表示同步恢復正常。

最佳實踐建議

  • 生產環境建議在函數定義時顯式聲明 DETERMINISTIC 或 READS SQL DATA,避免依賴全局信任設置
  • 定期檢查主從同步狀態,設置監控告警
  • 重要變更前在測試環境驗證函數同步行為
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved