注册

SELECT seq.NEXTVAL INTO variable FROM dual” 触发 coredump 的问题,后期版本是否修复,能否调整sql解决

孤独的熊猫 2025/11/18 154 2 已解决

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:1-2-18-21.06.07-141116-10013-SEC Pack2
【操作系统】:ky10
【CPU】:Phytium飞腾
【问题描述】*:数据宕机,分析core文件定位到是1个,创建触发器的sql:CREATE OR REPLACE TRIGGER formtable_main_845_Id_Tr
BEFORE INSERT ON formtable_main_845
FOR EACH ROW
BEGIN
SELECT formtable_main_845_Id.nextval INTO :new.id FROM dual;
END;
堆栈:stack.txt
core文件解析:r1.txt
堆栈信息:Thread 1 (LWP 420837):
#0 0x00000000004a5458 in mem2_free ()
#1 0x00000000004a2de0 in rt_mem2_pool_ref_dec ()
#2 0x000000000053815c in nstr_data_free ()
#3 0x000000000053a3dc in nstr_clear ()
#4 0x0000000000e93f80 in vm_stkfrm_release_str ()
#5 0x0000000000e9addc in vm_stkfrm_delete ()
#6 0x0000000000e2d2e8 in nrtn_method_exec ()
#7 0x0000000000e9ca28 in vm_run_low ()
#8 0x0000000000e9cccc in vm_run ()
#9 0x0000000000e9dcdc in vm_run_pln_low ()
#10 0x0000000001247d30 in ntsk_process_exec_low ()
#11 0x00000000012484a0 in ntsk_process_prepare_and_exec ()
#12 0x000000000124f6e0 in ntsk_process_cop ()
#13 0x00000000011800c4 in uthr_db_main_for_sess ()
#14 0x0000ffff0df388cc in ?? () from /lib64/libpthread.so.0
#15 0x0000ffff0dbca1ec in ?? () from /lib64/libc.so.6
操作系统日志截图:操作系统日志.png
根据堆栈问题分析:判断是触发器的SELECT formtable_main_845_Id.nextval INTO :new.id FROM dual;触发了堆栈信息的异常:NEW/:OLD 里的字符串列内容被损坏,造成了内存越界崩溃in mem2_free ()

据我了解达梦数据库早期存在这个bug,本人本地相同版本测试无法复现问题,述求:除了升级数据库版本,是否可以调整sql彻底解决问题,计划调整创建触发器sql:
--方案1:-- 仅一次赋值,无大变量
CREATE OR REPLACE TRIGGER formtable_main_845_Id_Tr
BEFORE INSERT ON formtable_main_845
FOR EACH ROW
DECLARE
v_id NUMBER;
BEGIN
SELECT formtable_main_845_Id.NEXTVAL INTO v_id FROM dual;
:NEW.id := v_id;
END;

--方案2,直接赋值不用select into

CREATE OR REPLACE TRIGGER formtable_main_845_Id_Tr
BEFORE INSERT ON formtable_main_845
FOR EACH ROW
BEGIN
:NEW.id := formtable_main_845_Id.NEXTVAL;
END;

回答 0
暂无回答
扫一扫
联系客服