【问题分类】
数据库导出异常、资源管理问题
【关键词】
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(内存溢出)有关。
三、根本原因定位
通过深入分析后发现:
使用 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来验证。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。