问题现象
存储过程递归调用及
max_sp_recursion_depth
参数配置。
处理方法
存储过程递归调用的时候会引起报错。
示例
drop procedure if exists pro_test_1;
delimiter |
create procedure pro_test_1(lvl int)
begin
select '1';
set lvl=lvl-1;
if lvl>=0 then
call pro_test_1(lvl);
end if;
end |
delimiter ;
call pro_test_1(2017);
会产生以下报错信息:
错误:
{STATEMENT: call pro_test_1(2017)
INSTRUCTION: call pro_test_1(lvl) [4]}
Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for
routine pro_test_1
从字面意思上来看,是超过递归调用的最大深度,可以通过设置集群层的
max_sp_recursion_depth
参数解决该问题。
处理方法
set max_sp_recursion_depth =3000;
call pro_test_1(2017);
执行成功。
说明
max_sp_recursion_depth
参数范围是
[0~255]
,该值设置超出
255
后会报错;
当递归层数参数
max_sp_recursion_depth
设置为
255
的情况下,需要相应的调大
gcluster
层的
thread_stack
参数(测试环境调整为
2M
),然后重启
gclusterd
;否则可
能会栈溢出从而引起
gclusterd
的宕机。