在配置 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,從庫重放時同樣受此限制,導致同步中斷。
只有前三種特性在啟用 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,避免依賴全局信任設置