MariaDB 10.11.6启用log_bin后事务提交报错解决方案咨询
问题解决方法
针对你遇到的MariaDB 10.11.6启用log_bin后,因调用未缓存存储过程触发mysql.proc(Aria引擎)查询,导致事务提交报错的问题,可通过以下方案解决:
方案一:将mysql.proc转换为InnoDB引擎(根治)
这是最彻底的解决方法,直接消除引擎不一致的根源:
- 先备份
mysql系统库,避免操作失误导致数据丢失 - 执行SQL语句修改表引擎:
ALTER TABLE mysql.proc ENGINE=InnoDB; - 执行完成后无需重启服务即可生效,后续调用存储过程时,即使触发
mysql.proc查询,也因引擎与自定义表一致,不会再触发事务提交错误。
方案二:预加载存储过程到元数据缓存(临时规避)
如果暂时无法修改系统表引擎,可通过预加载方式避免事务内查询mysql.proc:
- 在数据库服务启动后,手动执行以下操作之一:
- 逐个调用所有存储过程(无参数的存储过程可直接执行
CALL proc_name();,有参数的可传入合法测试参数) - 执行查询存储过程定义的语句,触发缓存加载:
SELECT ROUTINE_NAME, ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = '你的数据库名' AND ROUTINE_TYPE = 'PROCEDURE';
- 逐个调用所有存储过程(无参数的存储过程可直接执行
- 注意:元数据缓存会在服务重启、存储过程被修改/重建后失效,需重新执行预加载操作。
关于“能否确保mysql.proc始终处于元数据缓存中”的问题
无法永久确保。MariaDB的元数据缓存依赖内存存储,服务重启后缓存会被清空;当存储过程被修改、删除或重建时,对应缓存条目也会失效。只能通过每次服务启动后预加载的方式,让存储过程在大部分时间处于缓存中,但无法做到“始终”有效。
内容的提问来源于stack exchange,提问作者Nate L
相关产品推荐
相关产品推荐

