为什么MySQL创建自定义函数提示log_bin_trust报错

冬明君_8814

冬明君_8814

2026-11-08

998人浏览

原创

RC隔离级别强制要求binlog_format=ROW,因MVCC依赖每行最新已提交版本,与STATEMENT日志重放逻辑冲突;RR级别理论上兼容STATEMENT但需规避非确定性函数;MIXED在RC下实际等价于ROW。

为什么mysql创建自定义函数提示log_bin_trust报错

这不是函数写错了,是 MySQL 在开启 binlog 后强制校验函数声明

只要你的 MySQL 实例启用了 log_bin(比如主从复制、PITR 备份场景),创建自定义函数时就必须在 CREATE FUNCTION 语句里明确标注行为类型——否则直接报 ERROR 1418 (HY000),根本不会进语法解析阶段。

为什么必须加 DETERMINISTIC / NO SQL / READS SQL DATA

MySQL 要保证主从一致性:如果一个函数在主库返回 100,在从库因 NOW() 或子查询执行时机不同返回 99,binlog 回放就不可靠。所以它只接受三种可安全复制的函数类型:

  • DETERMINISTIC:输出仅由输入参数决定(如 ABS(x)),禁止 RAND()、UUID()、未限定的子查询
  • NO SQL:函数体内完全不出现任何 SQL 语句(纯字符串/数学运算)
  • READS SQL DATA:只允许 SELECT,不能 INSERT/UPDATE/DELETE

注意:MODIFIES SQL DATA 和 CONTAINS SQL 在函数中不被接受——它们只适用于存储过程或触发器。

set global log_bin_trust_function_creators = 1 为什么无效

这条命令看似简单,但实际生效需要同时满足三个条件,缺一不可:

  • 执行账号必须拥有 SYSTEM_VARIABLES_ADMIN 权限(SUPER 权限在 8.0+ 已被弃用)
  • 设置后只影响后续新建连接,当前会话不受影响
  • MySQL 重启后自动恢复为 0,不是持久化配置

常见误判:执行 SET GLOBAL 返回 Query OK,但立刻查 SELECT @@global.log_bin_trust_function_creators 发现仍是 0——说明权限不足,MySQL 静默忽略该操作。

MySQL8 CRM Schema Design Expert
MySQL8 CRM Schema Design Expert

面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。

下载

my.cnf 配置了 log_bin_trust_function_creators 却不生效

配置文件写法错误是最隐蔽的原因:

  • 必须放在 [mysqld] 段下,不能写在 [client] 或其他段
  • 变量名必须严格为 log_bin_trust_function_creators(不能带下划线变体、不能拼错)
  • 值只能是 1 或 0,不能加引号,不能写成 ON/TRUE
  • Docker 环境要确认挂载路径(如 /etc/mysql/conf.d/custom.cnf),云数据库(RDS/Aurora)需通过控制台参数组修改

验证是否加载成功:启动后执行 SELECT @@GLOBAL.config_file(8.0.25+ 支持),再查 SHOW VARIABLES LIKE 'log_bin_trust_function_creators'。

函数创建失败但 SHOW CREATE FUNCTION 报错或查不到

这是典型因果倒置:报 ERROR 1418 是创建被拒,不代表函数“已存在但隐藏”。更可能是以下两种情况之一:

  • 从 5.7 升级到 8.0 时,mysql.proc 表未迁移,函数元数据已丢失,此时改任何配置都无效
  • CREATE FUNCTION 语句里写了 DEFINER=`xxx`@`%`,但当前用户无权模拟该 definer,导致创建静默失败

先确认函数是否存在:SELECT ROUTINE_NAME FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = 'your_db' AND ROUTINE_TYPE = 'FUNCTION'。空结果就说明没创建成功,别在配置上反复折腾。

真正麻烦的是那些依赖 NOW() 或 SELECT ... INTO 的函数——它们看起来只读,但 MySQL 不认为 NOW() 是确定性的(除非你手动加 DETERMINISTIC 并承担风险),而 SELECT ... INTO 属于 READS SQL DATA,漏写就会卡死在第一步。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql sql创建

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2513

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1519

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

895

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3592

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

6208

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1319

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

6471

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

5562

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

7534

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 194人学习