ERROR 1419 (HY000): You do not have the SUPER Privilege and Binary Logging is Enabled
-- 或導入含 trigger/function 的 dump 時:
You do not have the SUPER privilege and binary logging is enabled
(you *might* want to use the less safe log_bin_trust_function_creators variable)
啟用二進制日志(log_bin=ON)且配置了主從復制時,MySQL 為防止不安全函數導致主從數據不一致,強制要求創建 FUNCTION、TRIGGER、EVENT 的用戶擁有 SUPER 權限,或開啟 log_bin_trust_function_creators。
所謂「不安全」指:函數/觸發器中包含可能產生不同結果的語句(如 UUID()、RAND()、NOW()、未確定性的 SELECT 等),在主庫執行一次、從庫重放時結果可能不同。
-- 以 root 或擁有 SUPER 權限的用戶登錄
mysql -uroot -p
-- 授予目標用戶創建權限(可選)
GRANT CREATE ROUTINE, ALTER ROUTINE, CREATE TRIGGER, SUPER ON *.* TO 'dev_user'@'%';
FLUSH PRIVILEGES;
生產環境建議:僅由 DBA 使用高權限賬號部署函數/觸發器,普通開發賬號不授予 SUPER。
-- 臨時生效(重啟失效)
SET GLOBAL log_bin_trust_function_creators = 1;
-- 永久生效:編輯 my.cnf [mysqld] 區段
log_bin_trust_function_creators = 1
# 重啟生效
systemctl restart mysqld
⚠️ 風險提示: 開啟後,任何擁有 CREATE ROUTINE 權限的用戶均可創建「不確定性」函數,可能導致主從數據漂移。僅建議在開發/測試環境或單機無復制環境使用。
# my.cnf 註釋掉
# log-bin=mysql-bin
# binlog_format=mixed
# 重啟生效
systemctl restart mysqld
適用場景:單機獨立部署、純讀取從庫、數據可重建的緩存實例。主庫/雙主/主從架構嚴禁關閉 binlog。
| 角色 | 所需權限 | 是否需 SUPER |
|---|---|---|
| DBA 部署 | CREATE ROUTINE, ALTER ROUTINE, CREATE TRIGGER, SUPER | 是 |
| 開發測試 | CREATE ROUTINE, ALTER ROUTINE, CREATE TRIGGER | 否(配合方案二) |
| 應用賬號 | EXECUTE, TRIGGER(觸發器自動執行不需額外權限) | 否 |
# 方法 1:使用 SUPER 用戶導入
mysql -uroot -p --force < dump_with_triggers.sql
# 方法 2:臨時開啟信任變量導入再關閉
mysql -uroot -p -e "SET GLOBAL log_bin_trust_function_creators=1;"
mysql -uapp_user -p < dump_with_triggers.sql
mysql -uroot -p -e "SET GLOBAL log_bin_trust_function_creators=0;"
# 方法 3:sed 移除 DEFINER 子句(避免權限檢查)
sed -i 's/DEFINER=`[^`]*`@`[^`]*` //g' dump_with_triggers.sql
mysql -uapp_user -p < dump_with_triggers.sql
SHOW VARIABLES LIKE 'log_bin'; 是否為 ONSHOW GRANTS;UUID()、RAND()、SYSDATE() 等)SHOW TRIGGERS;、SHOW FUNCTION STATUS;