mysql主从同步,从库又出现问题:
<pre name="code" class="sql">mysql> show slave status\G
*************************** 1. row ***************************
........
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
<span style="color:#ff6666;">Last_Errno: 1418</span>
Last_Error: Error '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)' on query. Default database: 'gmkq'. Query: 'CREATE DEFINER=`kaoqin`@`%` FUNCTION `queryChildrenAreaInfo`(areaId INT) RETURNS varchar(4000) CHARSET utf8....
明显是主库创建的函数,从库无法同步创建。该错误信息意思是:
在该子程序的在其声明没有DETERMINISTIC、NO SQL或READS SQL DATA,而且二进制日志功能已启用(你或许打算使用不太安全的log_bin_trust_routine_creators变量)
mysql对存储过程、函数及触发器的同步,尤其是对函数,需要在创建时必须添加相应的关键字:
1、DETERMINISTIC——确定的(说明:如果程序或线程总是对同样的输入参数产生同样的结果,则被认为它是“确定的”,否则就是“非确定”的。);
2、NO SQL——没有SQl语句,当然也不会修改数据;
3、READS SQL DATA——只是读取数据,当然也不会修改数据;
4、MODIFIES SQL DATA——要修改数据;
5、CONTAINS SQL——包含了SQL语句。
当然主库已经创建了好多函数,且日志已到从库。那只能采取另一种解决方法:
从库设置log_bin_trust_function_creators。
<pre name="code" class="sql">mysql> show variables like '%function%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | OFF |
+---------------------------------+-------+
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> SET GLOBAL log_bin_trust_function_creators = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%function%';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| log_bin_trust_function_creators | ON |
+---------------------------------+-------+
从库已正常同步。
说明:可以在my.cnf中配置,否则重启后参数失效。