• 专注于网站建设,网络推广,关键词优化,SEO优化,专业的网站建设开发团队!
首页 > IT技术 > MySQL > 内容

MySQL 错误1418 的原因分析及解决方法

2015-06-11 21:59:57   来源:叶景网络
        叶景网络(www.cngxit.com),致力于互联网品牌建设与网络营销,专业领域包括网站建设、电子商务、移动互联网营销、系统平台开发, 与其他网站建设等。叶景网络为您分享:MySQL 错误1418 的原因分析及解决方法
    具体错误:
    使用mysql创建、调用存储过程,函数以及触发器的时候会有错误符号为1418错误。
    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)
    经过一番百度之后,总结如下:
    因为CREATE PROCEDURE, CREATE FUNCTION, ALTER PROCEDURE,ALTER FUNCTION,CALL, DROP PROCEDURE, DROP FUNCTION等语句都会被写进二进制日志,然后在从服务器上执行。但是,一个执行更新的不确定子程序(存储过程、函数、触发器)是不可重复的,在从服务器上执行(相对与主服务器是重复执行)可能会造成恢复的数据与原始数据不同,从服务器不同于主服务器的情况。
    为了解决这个问题,MySQL强制要求:
    在主服务器上,除非子程序被声明为确定性的或者不更改数据,否则创建或者替换子程序将被拒绝。这意味着当创建一个子程序的时候,必须要么声明它是确定性的,要么它不改变数据。
    声明方式有两种:
    第一种:声明是否是确定性的
    DETERMINISTIC和NOT DETERMINISTIC指出一个子程序是否对给定的输入总是产生同样的结果。
    如果没有给定任一特征,默认是NOT DETERMINISTIC,所以必须明确指定DETERMINISTIC来声明一个子程序是确定性的。 
    这里要说明的是:使用NOW() 函数(或它的同义)或者RAND() 函数不会使一个子程序变成非确定性的。对NOW()而言,二进制日志包括时间戳并会被正确的执行。RAND()只要在一个子程序内被调用一次也可以被正确的复制。所以,可以认为时间戳和随机数种子是子程序的确定性输入,它们在主服务器和从服务器上是一样的。
    第二种:声明是否会改变数据  
    CONTAINS SQL, NO SQL, READS SQL DATA, MODIFIES SQL用来指出子程序是读还是写数据的。
    无论NO SQL还是READS SQL DATA都指出,子程序没有改变数据,但是必须明确地指定其中一个,因为如果任何指定,默认的指定是CONTAINS SQL。
    默认情况下,如果允许CREATE PROCEDURE 或CREATE FUNCTION 语句被接受,就必须明确地指定DETERMINISTIC 或 NO SQL与READS SQL DATA 中的一个,否则就会产生1418错误。
    解决方法:
    解决办法也有两种,
    第一种是在创建子程序(存储过程、函数、触发器)时,声明为DETERMINISTIC或NO SQL与READS SQL DATA中的一个,
    例如:
    CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`()
    DETERMINISTIC
    BEGIN
    #Routine body goes here...
    END;
    第二种是信任子程序的创建者,禁止创建、修改子程序时对SUPER权限的要求,设置log_bin_trust_routine_creators全局系统变量为1。设置方法有三种:
    1.在客户端上执行SET GLOBAL log_bin_trust_function_creators = 1;
    2.MySQL启动时,加上--log-bin-trust-function-creators选贤,参数设置为1
    3.在MySQL配置文件my.ini或my.cnf中的[mysqld]段上加log-bin-trust-function-creators=1
叶景网络,网络推广,网站建设
特别推荐RECOMMEND
搜索引擎网站关键词seo优化的意义
视频推广怎么做
网站seo优化怎么做关键词排上首页?
SEO介绍什么叫搜索引擎网站关键词优化
seo优化怎样做提升关键词排名
热点图文Hot
MYSQL中导入大小超过2M的数据库文件解决办法 MYSQL中导入大小超
从MySQL中获得数据表auto_increment值的方法 从MySQL中获得数据
MySQL 错误1418 的原因分析及解决方法 MySQL 错误1418
MySQL group by 排序问题 MySQL group by 排序问题
关注排行RANKING
1

MYSQL中导入大小超过2M的数据库文件...

MYSQL中导入大小超过2M的数据库文件解决办法 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网...

2

从MySQL中获得数据表auto_increment值的方法

从MySQL中获得数据表auto_increment值的方法 在插入一行数据前就想要知道将要产生的id。比如说想用来命名上传的文件。如果不事先...

3

MySQL 错误1418 的原因分析及解决方法

MySQL 错误1418 的原因分析及解决方法 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网...

4

MySQL group by 排序问题

MySQL group by 排序问题 id 为 自动增长字段, tid为该回复的主题帖子的id(外键关联), subject 为回复...

5

MySQL-bin导致阿里云LNMP20G系统盘...

MySQL-bin导致阿里云LNMP20G系统盘不够用处理方法 在MySQL数据库中,mysql-bin 000001、mysql- bin 000002等文件是数据库的操作日志,...

6

LNMP更改网站文件和MySQL数据库的存放目录

LNMP更改网站文件和MySQL数据库的存放目录 购买阿里云服务器,一般建议买一个数据盘,也就是系统盘和数据盘分开,将网站文...

7

MySQL无法启动ERROR! MySQL is r...

MySQL无法启动ERROR! MySQL is running but PID file could not be found ? 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领...

8

LNMP关闭MySQL日志保护硬盘空间

LNMP关闭MySQL日志保护硬盘空间 今天发现VPS硬盘居然快满了。第一反应是:肯定是某个东西的日志文件造成的,因为以前在W...

9

MySQL数据库批量修改表前缀的方法

MySQL数据库批量修改表前缀的方法 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网...