【问题分类】

数据库导出异常、资源管理问题

【关键词】

EXP、服务器卡死、OOM、DATA_BUFFER_SIZE、swap空间、内存管理

一、问题现象

某客户环境中使用 YashanDB 执行全库导出时(exp sys/Cod-2022 file=bim20240402.dmp full=y),发生以下问题:

DMP 导出文件达到约 30G 时,服务器突然卡死;

SSH 远程连接完全中断;

等待1~2小时后,才能重新连接;

主节点出现异常后,集群自动切换到备用节点。

二、问题分析过程

初步怀疑磁盘问题:

因为客户使用的是 NFS 网络磁盘,最初怀疑可能是网络或磁盘性能问题导致。但在更换本地磁盘测试后,问题依旧复现,排除 NFS 问题。

怀疑版本兼容问题:

数据库数据此前从 22.2.7.2 版本使用 exp 导出,imp 导入到 23.1 版本后发生的问题。然而本地同版本测试环境无法复现,GDB 调试、堆栈(pstack)分析均未发现异常,且未生成core文件。

检查系统日志:

查看服务器 /var/log/message 日志,发现数据库进程 yasdb 被系统 kill 掉,进一步分析发现与OOM(内存溢出)有关。
image.png
image.png

三、根本原因定位

通过深入分析后发现:

使用 exp 全量导出时,大量数据被加载到数据库缓存(data buffer);

导致数据库实际使用的内存超过了操作系统允许的阈值;

最终触发系统OOM(Out Of Memory)机制,将占用内存最多的数据库进程yasdb杀掉,从而导致服务器卡死现象。

四、问题解决及规避方法

经过多组环境测试验证,给出以下规避建议(任选一种或两种结合使用):

方案1:开启swap空间


swapoff -
dd if=/dev/zero of=/swap bs=1M count=30720
mkswap /swap
chmod 600 /swap
swapon /swap
sysctl -w vm.swappiness=60
# 永久配置 swap 空间

vi /etc/fstab

添加如下内容:

/swap swap swap defaults 0 0
方案2:降低数据库内存配置

-- 推荐:将DATA_BUFFER_SIZE调整到总内存的60%以下

alter system set DATA_BUFFER_SIZE=xxx SCOPE=SPFILE;

附:配置 core 文件生成(用于异常排查)

echo "ulimit -c unlimited" >> /etc/profile
source /etc/profile
mkdir -p /data/corefile
chmod 777 /data/corefile/
echo "/data/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
echo "kernel.core_pattern=/data/corefile/core-%e-%p-%t" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

五、经验总结

数据库实例内存(尤其是 DATA_BUFFER_SIZE)建议设置在服务器总内存的60%左右;

data buffer建议占数据库实例内存的80%;

若数据库进程消失但无core文件生成,通常为系统内存不足自动kill的结果,可通过查看/var/log/message来验证。


数据库砖家
1 声望0 粉丝