使用遠程管理工具(如 Navicat、Workbench)連接 MySQL,查詢正常,但刪除/修改/執行存儲過程報錯。錯誤碼通常為 1370、1418 或無明確提示僅操作無響應。
遠程工具執行 DDL/DML 往往封裝為存儲過程/預處理語句調用。用戶雖有 SELECT, INSERT, UPDATE, DELETE 權限,但缺失 EXECUTE、CREATE ROUTINE、ALTER ROUTINE 權限,導致工具內部調用失敗。
-- 1. 查看當前權限
SHOW GRANTS FOR 'app_user'@'10.0.1.%';
-- 輸出示例:
GRANT USAGE ON *.* TO 'app_user'@'10.0.1.%' IDENTIFIED BY PASSWORD '*...'
GRANT SELECT, INSERT, UPDATE, DELETE ON `biz_db`.* TO 'app_user'@'10.0.1.%'
-- 2. 補充存儲過程相關權限
GRANT EXECUTE, CREATE ROUTINE, ALTER ROUTINE ON `biz_db`.* TO 'app_user'@'10.0.1.%';
FLUSH PRIVILEGES;
-- 3. 驗證新權限
SHOW GRANTS FOR 'app_user'@'10.0.1.%';
-- 應包含:EXECUTE, CREATE ROUTINE, ALTER ROUTINE
現象:mysqldump -uroot -ntd -R db_name > db.sql 導入時:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled
根因:log_bin_trust_function_creators=OFF(默認),禁止創建不確定性函數。
解決:
-- 1. 檢查當前值
SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
-- 輸出:OFF
-- 2. 臨時開啟(全局動態生效)
SET GLOBAL log_bin_trust_function_creators = 1;
-- 3. 導入 SQL 文件
mysql -uroot -p db_name < db.sql
-- 4. 導入完成後關閉(安全建議)
SET GLOBAL log_bin_trust_function_creators = 0;
| 權限 | 作用對象 | 典型場景 |
|---|---|---|
| SELECT | 表/視圖/列 | 查詢業務數據 |
| INSERT/UPDATE/DELETE | 表 | 增刪改業務數據 |
| EXECUTE | 存儲過程/函數 | 調用存儲過程、函數 |
| CREATE ROUTINE | 庫 | 創建存儲過程/函數 |
| ALTER ROUTINE | 存儲過程/函數 | 修改/刪除存儲過程/函數 |
| CREATE TEMPORARY TABLES | 庫 | 創建臨時表(複雜查詢中轉) |
| LOCK TABLES | 庫 | 手動鎖表(批量導入/Schema 變更) |
| REFERENCES | 表/列 | 創建外鍵約束 |
| TRIGGER | 表 | 創建/刪除觸發器 |
| EVENT | 庫 | 創建/執行定時事件 |
-- 建立專用賬號,權限最小化但覆蓋工具全功能
CREATE USER 'tool_user'@'10.0.1.%' IDENTIFIED BY 'ToolPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE, CREATE ROUTINE, ALTER ROUTINE,
CREATE TEMPORARY TABLES, LOCK TABLES, REFERENCES, TRIGGER, EVENT
ON `biz_db`.* TO 'tool_user'@'10.0.1.%';
FLUSH PRIVILEGES;
遠程工具操作失敗常因隱性權限缺失(EXECUTE/CREATE ROUTINE/ALTER ROUTINE)。標準排查:SHOW GRANTS → 對比工具功能需求 → 補充缺失權限 → FLUSH PRIVILEGES。導入存儲函數需臨時開啟 log_bin_trust_function_creators=1,導入後立即關閉。建立專用工具賬號,權限矩陣覆蓋全功能,避免反復排查。