You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL只读副本存储过程异常:传入函数参数触发只读错误

更新于2022年11月15日

经过大量测试,发现问题规律:仅当将函数作为参数传入源存储过程时才会出现该问题,传入硬编码值或变量则完全正常。

问题根源在于该存储过程会调用另一个检查@@read_only变量以判断是否可写入数据库的存储过程。确认移除所有写入数据的代码后问题即可解决——显然传入静态值时,存储过程会因IF @@read_only = FALSE THEN ...write...逻辑跳过写入操作(符合预期)。

似乎传入函数时,MySQL会编译调用及子调用的“树状结构”,检查是否可能执行写入,而非实际是否执行写入。

目前唯一的规避方案是将参数赋值给变量后传入,但这需要大量重构工作。疑问:MySQL为何会有此逻辑?为何传入函数会导致系统提前检查是否可写入,而非检查实际是否执行写入?


我们的MySQL只读副本运行正常,可正常执行读操作。

执行以下语句正常:

CALL get_table_data(1, 1, "SELECT * from PERSON where ID=1;", @out_result, @out_result_value); 

该存储过程标记为READS SQL DATA,无任何写入操作。

执行以下只读函数也正常:

SELECT get_value("OBJECT_BASE", "NAME");

但执行以下语句时:

CALL get_table_data(1, get_value("OBJECT_BASE", "NAME"), "SELECT * from PERSON where ID=1;", @out_result, @out_result_value); 

触发错误:

Error: ER_OPTION_PREVENTS_STATEMENT: The MySQL server is running with the --read-only option so it cannot execute this statement

存储过程与函数均为只读,单独执行正常,但将函数作为参数传入存储过程时就会报错,求原因分析。

内容的提问来源于stack exchange,提问作者Floobinator

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 14:15:37