文章目录
环境
系统平台:银河麒麟 (海光)
版本:4.5.8
症状
数据库版本:瀚高安全版4.5.8.8
介质包:hgdb-see-4.5.8.8-3937-efc2bbd-20241016.x86_64.rpm
信号11的报错信息:
2025-06-16 10:23:04.890 CST,1857,681b3d37.741,370,2025-05-07 19:00:07 CST,0,LOG,00000,"server process (PID 656071) was terminated by signal 11: Segmentation fault","Failed process was running:xxx查询SQL
报错SQL:
sql
1)非聚合字段不在group by中的SQL
SELECT t1.id
,t1.v
,t1.v1
,count(t1.id) AS num
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE t1.v1 IS NOT NULL;
2)group by中包含所有非聚合字段,但是order by字段不在group by中的SQL
SELECT t1.id
,t1.v
,t1.v1
,count(t1.id) AS num
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE t1.v1 IS NOT NULL
GROUP BY t1.id
,t1.v
,t1.v1
ORDER BY t2.id;
问题原因
数据库开启oracle兼容后group by、order by相关语法与oracle仍有区别,使用oracle兼容的分支会引起信号11导致数据库服务异常。
解决方案
1、临时解决方案:
1)非聚合字段不在group by中的SQL,要把非聚合字段都添加到group by中。
修改后的SQL:
sql
SELECT t1.id
,t1.v
,t1.v1
,count(t1.id) AS num
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE t1.v1 IS NOT NULL
GROUP BY t1.id
,t1.v
,t1.v1;
2)group by中包含所有非聚合字段,但是order by字段不在group by中的SQL,要把order by中不在group by中的字段删除,按需改成group by中的字段。
修改后的SQL:
sql
SELECT t1.id
,t1.v
,t1.v1
,count(t1.id) AS num
FROM t1
LEFT JOIN t2 ON t1.id = t2.id
WHERE t1.v1 IS NOT NULL
GROUP BY t1.id
,t1.v
,t1.v1
ORDER BY t1.id; --t2.id改成了t1.id
2、永久解决方案
申请补丁包或者升级数据库版本。