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
相关产品推荐
相关产品推荐

