HGDB 4.5.8.8开启oracle兼容执行带聚合函数的SQL导致数据库进程被信号11杀死

文章目录

环境

系统平台:银河麒麟 (海光)

版本: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、永久解决方案

申请补丁包或者升级数据库版本。

相关推荐
2401_8463395620 小时前
CSS如何优化大型项目样式_使用SASS预处理器提升开发效率
jvm·数据库·python
ss2731 天前
食谱推荐系统功能测试如何写?
java·数据库·spring boot·功能测试
l1t1 天前
DeepSeek总结的数据库外部表
数据库
m0_674294641 天前
如何编写SQL存储过程性能对比_记录执行时间评估优化效果
jvm·数据库·python
014-code1 天前
CompletableFuture 实战模板(超时、组合、异常链处理)
java·数据库
运气好好的1 天前
怎样开启phpMyAdmin的操作审计日志_记录每条执行的SQL
jvm·数据库·python
それども1 天前
DELETE 和 TRUNCATE TABLE区别
java·数据库·mysql
wenha1 天前
数据库隔离级别
数据库·mysql·sqlserver·隔离级别
2401_871492851 天前
Layui如何修改Layui默认的UI主题颜色(换肤功能实现)
jvm·数据库·python
Edward111111111 天前
4.27mysql ,数据库,数据源
数据库·mysql