
一、问题描述:
MySQL [(none)]> show slave status\G;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 100.100.101.211Master_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000011Read_Master_Log_Pos: 840319815Relay_Log_File: prd-carry-mysql-centos-02-relay-bin.000016Relay_Log_Pos: 6594972Relay_Master_Log_File: mysql-bin.000007Slave_IO_Running: YesSlave_SQL_Running: NoReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 1418Last_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: 'carry_admin'. Query: 'CREATE DEFINER=`root`@`%` FUNCTION `F_GET_SEQ_NO`(in_seq_id VARCHAR(50)) RETURNS varchar(255) CHARSET utf8mb4 COLLATE utf8mb4_general_ciBEGINSkip_Counter: 0Exec_Master_Log_Pos: 6594757Relay_Log_Space: 3465214023Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: NULLMaster_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 1418Last_SQL_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: 'carry_admin'. Query: 'CREATE DEFINER=`root`@`%` FUNCTION `F_GET_SEQ_NO`(in_seq_id VARCHAR(50)) RETURNS varchar(255) CHARSET utf8mb4 COLLATE utf8mb4_general_ciBEGINReplicate_Ignore_Server_Ids:Master_Server_Id: 1Master_UUID: ab09d6b7-7cb5-11eb-942e-fefcfea23161Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State:Master_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp: 210310 22:58:38Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position: 0Replicate_Rewrite_DB:Channel_Name:Master_TLS_Version:Master_public_key_path:Get_master_public_key: 0Network_Namespace:1 row in set, 1 warning (0.00 sec)ERROR:No query specified

二、故障原因
当二进制日志启用后,这个变量(log_bin_trust_function_creators)就会启用。它控制是否可以信任存储函数创建者,不会创建写入二进制日志引起不安全事件的存储函数。
如果设置为0(默认值),用户不得创建或修改存储函数,除非它们具有除CREATE ROUTINE或ALTER ROUTINE特权之外的SUPER权限。设置为0还强制使用DETERMINISTIC特性或READS SQL DATA或NO SQL特性声明函数的限制。
如果变量设置为1,MySQL不会对创建存储函数实施这些限制。此变量也适用于触发器的创建
为什么MySQL有这样的限制呢?因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启二进制日志后,参数log_bin_trust_function_creators就会生效,限制存储函数的创建、修改、调用。
log_bin_trust_function_creators 最终目的就是保持mysql主从复制的一致性~
三、解决方案
MySQL [(none)]> show variables like '%function%';+---------------------------------+-------+| Variable_name | Value |+---------------------------------+-------+| log_bin_trust_function_creators | OFF |+---------------------------------+-------+1 row in set (0.00 sec)MySQL [(none)]> stop slave;Query OK, 0 rows affected, 1 warning (0.01 sec)MySQL [(none)]> SET GLOBAL log_bin_trust_function_creators = 1;Query OK, 0 rows affected (0.00 sec)MySQL [(none)]> start slave;Query OK, 0 rows affected, 1 warning (0.00 sec)MySQL [(none)]> SET GLOBAL log_bin_trust_function_creators = 1;Query OK, 0 rows affected (0.00 sec)MySQL [(none)]>
(这个动态设置的方式会在服务重启后失效,所以我们还必须在my.cnf中设置,加上log_bin_trust_function_creators=1,这样就会永久生效)
成功解决~

爱运维^_^爱分享

如果觉得文章有帮助,麻烦点个关注和转发^)^ 👇
文章转载自Linux运维技术之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




