閱讀821 返回首頁    go 阿裏雲 go 技術社區[雲棲]


MYSQL 創建函數出錯的解決方案

本文轉自IT擺渡網歡迎轉載,請標明出處
擺渡網

更多mysq文章請閱讀

mysql問題錯誤修改

  在使用MySQL數據庫時,有時會遇到MySQL函數不能創建的情況。下麵就教您一個解決MySQL函數不能創建問題的方法,供您借鑒參考。

  案例一:

  目前在項目中,執行創建mysql的函數出錯,

  mysql 創建函數出錯信息如下:

  Error Code: 1227. Access denied; you need (at least one of) the SUPER privilege(s) for this operation

  首先檢查創建函數的功能是否開啟,檢查是否開啟創建功能的SQL如下:

  -- 查看是否開啟創建函數的功能

  show variables like '%func%';

  -- 開啟創建函數的功能

  set global log_bin_trust_function_creators = 1;

  執行完SQL之後發現已經開啟了,隨檢查自己的SQL是否寫錯(因為SQL是別人給的,在別人環境沒問題,在自己的環境就有可能)。

  突然發現了確實是SQL出現問題,由於他創建的SQL有指定用戶,所以導致出現問題,以下是他的SQL:

  DROP FUNCTION IF EXISTS nextval;

  DELIMITER ;;

  CREATE DEFINER=devop@% FUNCTION nextval(seq_name VARCHAR(50)) RETURNS varchar(20) CHARSET utf8

  BEGIN

  DECLARE seq_max BIGINT(20);

  UPDATE sequenceconftable SET max = max + NEXT WHERE NAME = seq_name;

  SELECT max INTO seq_max FROM sequenceconftable WHERE NAME = seq_name ;

  RETURN seq_max;

  END

  ;;

  DELIMITER ;

  由於CREATE_FUNCTION規範,可以發現就是DEFINER這個參數是可以指定數據庫用戶的,但是自己的庫卻不是這個用戶,所以導致問題。

  目前問題已經解決。

  -EOF-

  案例二:

  在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)

  這是因為有一個安全參數沒有開啟,log_bin_trust_function_creators 默認為0,是不允許function的同步的,開啟這個參數,就可以創建成功了。

  mysql> show variables like '%fun%';

  +---------------------------------+-------+

  | Variable_name | Value |

  +---------------------------------+-------+

  | log_bin_trust_function_creators | ON |

  +---------------------------------+-------+

  1 row in set (0.00 sec)

  mysql> set global log_bin_trust_function_creators=1;

  Query OK, 0 rows affected (0.00 sec)

  mysql> show variables like '%fun%';

  +---------------------------------+-------+

  | Variable_name | Value |

  +---------------------------------+-------+

  | log_bin_trust_function_creators | ON |

  +---------------------------------+-------+

  1 row in set (0.00 sec)

  如果是在有master上開啟了該參數,記得在slave端也要開啟這個參數(salve需要stop後再重新start),否則在master上創建函數會導致replaction中斷。

  案例三:

  Error Code : 1418

  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)

  (0 ms taken)

  分析:

  根據係統提示,導致該錯誤的原因可能是一個安全設置方麵的配置,查手冊log_bin_trust_function_creators參數缺省0,是不允許function的同步的,一般我們在配置repliaction的時候,都忘記關注這個參數,這樣在master更新funtion後,slave就會報告錯誤,然後slave stoped。

  處理過程:

  登陸mysql數據庫

  > set global log_bin_trust_function_creators = 1;

  > start slave;

  跟蹤mysql的啟動日誌,slave正常運行,問題解決。

最後更新:2017-08-17 16:32:37

  上一篇:go  2017年前端開發工具趨勢
  下一篇:go  《新編計算機科學概論》一0.2 計算機的曆史