1. 首页 > 国产数据库教程 > YashanDB教程 > 正文

yashandb教程FG183-YashanDB内存溢出处理

本文档风哥主要介绍YashanDB内存溢出处理相关知识,包括YashanDB内存溢出的概念、原因、症状、内存规划与配置、内存监控、内存溢出排查与恢复、生产案例与实战讲解等内容,风哥教程参考YashanDB官方文档性能调优内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 YashanDB内存溢出的概念

YashanDB内存溢出是指数据库系统使用的内存超过了系统或配置的限制,导致数据库性能下降或崩溃的现象。内存溢出是数据库系统常见的性能问题之一,严重时会影响业务正常运行。更多视频教程www.fgedu.net.cn

YashanDB内存溢出的类型:

  • 共享内存溢出:数据库实例的共享内存区域使用过多
  • PGA内存溢出:用户进程的私有内存区域使用过多
  • 操作系统内存溢出:操作系统整体内存使用超过物理内存
  • JVM内存溢出:如果使用了基于Java的组件,可能出现JVM内存溢出

1.2 YashanDB内存溢出的原因

YashanDB内存溢出的常见原因包括:

  • 内存配置不当:共享内存、PGA等参数设置过大
  • SQL语句问题:复杂查询、大结果集查询导致内存使用过高
  • 并发连接过多:大量并发连接导致内存使用累积
  • 内存泄漏:数据库或应用程序存在内存泄漏
  • 操作系统限制:操作系统对进程内存使用的限制
  • 硬件资源不足:物理内存不足,无法满足数据库需求

1.3 YashanDB内存溢出的症状

YashanDB内存溢出的常见症状包括:

  • 数据库响应缓慢:内存不足导致数据库处理能力下降
  • 连接失败:无法创建新的数据库连接
  • 错误日志:数据库日志中出现内存相关错误
  • 操作系统告警:操作系统出现内存不足告警
  • 进程崩溃:数据库进程因内存不足而崩溃
  • 系统交换频繁:内存不足导致系统频繁使用交换空间
风哥提示:内存溢出是数据库性能问题的重要原因之一,必须充分重视内存管理。在设计数据库系统时,应根据业务需求和硬件资源合理配置内存参数。学习交流加群风哥微信: itpux-com

Part02-生产环境规划与建议

2.1 YashanDB内存规划

YashanDB内存规划建议:

# 内存规划原则
– 物理内存:根据业务需求和数据库大小选择合适的物理内存
– 内存分配:合理分配系统内存、数据库内存和应用内存
– 预留空间:为操作系统和其他应用预留足够的内存空间

# 内存分配建议
– 小型系统(16GB内存):
– 操作系统:4GB
– 数据库共享内存:8GB
– 应用和其他:4GB

– 中型系统(64GB内存):
– 操作系统:8GB
– 数据库共享内存:40GB
– 应用和其他:16GB

– 大型系统(128GB+内存):
– 操作系统:16GB
– 数据库共享内存:80GB+
– 应用和其他:32GB+

# 内存规划考虑因素
– 数据库大小:数据量越大,需要的内存越多
– 并发连接数:并发连接越多,需要的内存越多
– 业务类型:OLTP系统需要更多内存用于缓存,OLAP系统需要更多内存用于查询
– 硬件成本:平衡内存成本和性能需求

2.2 YashanDB内存参数配置

YashanDB内存参数配置建议:

# 共享内存参数
# 共享缓冲区大小(建议为物理内存的25-50%)
shared_buffers = 8GB

# 工作内存(用于排序、哈希等操作)
work_mem = 64MB

# 维护工作内存(用于VACUUM等维护操作)
maintenance_work_mem = 1GB

# 有效缓存大小(建议为物理内存的75%)
effective_cache_size = 24GB

# 事务日志缓冲区
wal_buffers = 16MB

# 操作系统内存参数
# 调整最大文件句柄数
fs.file-max = 6815744

# 调整内存管理
vm.swappiness = 10
vm.overcommit_memory = 2
vm.overcommit_ratio = 90

# 大页内存配置
# 启用大页内存
transparent_hugepage=never
# 配置大页数量
hugepages = 16384

2.3 YashanDB内存优化建议

YashanDB内存优化建议:

# 内存优化建议

# 1. 合理设置共享缓冲区
# 共享缓冲区过小会导致频繁的磁盘IO,过大则会占用过多系统内存
# 建议根据物理内存大小设置:
# – 物理内存 < 16GB: 25% of RAM # - 物理内存 16-64GB: 30-40% of RAM # - 物理内存 > 64GB: 40-50% of RAM

# 2. 调整工作内存
# 工作内存过大可能导致内存溢出,过小会影响查询性能
# 建议根据并发连接数和查询复杂度设置:
# – 并发连接数少:较大的work_mem
# – 并发连接数多:较小的work_mem

# 3. 优化维护工作内存
# 维护工作内存用于VACUUM、CREATE INDEX等操作
# 建议设置为系统内存的5-10%,最大不超过2GB

# 4. 启用大页内存
# 大页内存可以提高内存访问效率,减少内存碎片
# 建议启用大页内存,并根据共享缓冲区大小配置大页数量

# 5. 监控内存使用
# 定期监控内存使用情况,及时发现内存问题
# 建立内存使用基线,设置告警阈值

生产环境建议:内存配置需要根据实际业务需求和硬件资源进行调整,建议在测试环境中进行充分测试,找到最优配置。学习交流加群风哥QQ113257174

Part03-生产环境项目实施方案

3.1 YashanDB内存监控

3.1.1 YashanDB内存使用监控

# 操作系统内存监控
# 使用free命令监控系统内存
$ free -h
total used free shared buff/cache available
Mem: 32G 16G 8.0G 2.0G 8.0G 14G
Swap: 16G 0B 16G

# 使用top命令监控内存使用
$ top -o %MEM

top – 10:00:00 up 1 day, 1:00, 2 users, load average: 0.50, 0.40, 0.30
Tasks: 200 total, 1 running, 199 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.0 us, 2.0 sy, 0.0 ni, 92.0 id, 1.0 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 32768.0 total, 8192.0 free, 16384.0 used, 8192.0 buff/cache
MiB Swap: 16384.0 total, 16384.0 free, 0.0 used.

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12345 oracle 20 0 32.0g 8.0g 7.5g S 10.0 25.0 1:00.00 yasdb

# 数据库内存监控
# 查看数据库内存使用
SQL> SELECT name, value/1024/1024 AS “Value (MB)” FROM v$parameter WHERE name IN (‘shared_buffers’, ‘work_mem’, ‘maintenance_work_mem’, ‘wal_buffers’);

NAME Value (MB)
——————– ————
shared_buffers 8192.00
work_mem 64.00
maintenance_work_mem 1024.00
wal_buffers 16.00

# 查看实例内存使用
SQL> SELECT * FROM v$sgainfo;

NAME BYTES RESIZEABLE
——————————– ———- ———-
Fixed SGA Size 25165824 No
Redo Buffers 16777216 No
Buffer Cache Size 8589934592 Yes
Shared Pool Size 2147483648 Yes
Large Pool Size 104857600 Yes
Java Pool Size 104857600 Yes
Streams Pool Size 104857600 Yes
Shared IO Pool Size 104857600 Yes
Data Transfer Cache Size 104857600 Yes
Granule Size 16777216 No
Maximum SGA Size 12884901888 No
Startup overhead in Shared Pool 134217728 No
Free SGA Memory Available 1073741824 No

3.1.2 YashanDB内存监控脚本

#!/bin/bash
# memory_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`

# 内存监控脚本

# 输出文件
output_file=”/tmp/memory_monitor_$(date +%Y%m%d_%H%M%S).log”

echo “开始监控内存使用情况” > ${output_file}
echo “监控时间: $(date)” >> ${output_file}
echo “” >> ${output_file}

# 监控系统内存
echo “===== 系统内存使用 ====” >> ${output_file}
free -h >> ${output_file}
echo “” >> ${output_file}

# 监控进程内存使用
echo “===== 进程内存使用 ====” >> ${output_file}
top -b -n 1 -o %MEM | head -20 >> ${output_file}
echo “” >> ${output_file}

# 监控数据库内存使用
echo “===== 数据库内存使用 ====” >> ${output_file}
sqlplus -s / as sysdba << EOF >> ${output_file}
SELECT name, value/1024/1024 AS “Value (MB)” FROM vparameter WHERE name IN (‘shared_buffers’, ‘work_mem’, ‘maintenance_work_mem’, ‘wal_buffers’);
SELECT * FROM vsgainfo;
EXIT;
EOF

echo “” >> ${output_file}
echo “监控完成,结果保存至:${output_file}” >> ${output_file}
echo “监控完成,结果保存至:${output_file}”

3.2 YashanDB内存溢出排查

3.2.1 YashanDB内存溢出排查步骤

# 内存溢出排查步骤

# 1. 检查系统内存使用
$ free -h
$ top -o %MEM

# 2. 检查数据库内存参数
$ sqlplus / as sysdba
SQL> SELECT name, value/1024/1024 AS “Value (MB)” FROM v$parameter WHERE name IN (‘shared_buffers’, ‘work_mem’, ‘maintenance_work_mem’, ‘wal_buffers’);

# 3. 检查数据库内存使用
SQL> SELECT * FROM v$sgainfo;
SQL> SELECT * FROM v$pgastat;

# 4. 检查正在执行的SQL语句
SQL> SELECT sid, serial#, username, program, sql_id, memory_used FROM v$session WHERE memory_used > 0 ORDER BY memory_used DESC;

# 5. 检查SQL执行计划
SQL> EXPLAIN ANALYZE SELECT * FROM fgedu.large_table WHERE condition;

# 6. 检查数据库日志
$ tail -n 100 /yashandb/app/log/fgedudb_alert.log

# 7. 检查操作系统日志
$ tail -n 100 /var/log/messages

# 8. 检查内存泄漏
$ valgrind –leak-check=full –log-file=valgrind.log /yashandb/app/bin/yasdb

3.2.2 YashanDB内存溢出常见原因及解决方法

# 常见内存溢出原因及解决方法

# 原因1:共享缓冲区设置过大
# 症状:系统内存不足,数据库启动失败
# 解决方法:调整shared_buffers参数
SQL> ALTER SYSTEM SET shared_buffers = ‘4GB’ SCOPE=spfile;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

# 原因2:工作内存设置过大
# 症状:并发查询时内存使用过高
# 解决方法:调整work_mem参数
SQL> ALTER SYSTEM SET work_mem = ’32MB’ SCOPE=spfile;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

# 原因3:复杂查询导致内存使用过高
# 症状:特定查询执行时内存使用激增
# 解决方法:优化SQL语句,添加索引,限制结果集大小

# 原因4:并发连接过多
# 症状:大量连接导致内存使用累积
# 解决方法:限制并发连接数,使用连接池
SQL> ALTER SYSTEM SET max_connections = 100 SCOPE=spfile;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

# 原因5:内存泄漏
# 症状:内存使用持续增长,无法释放
# 解决方法:更新数据库版本,应用补丁,重启数据库

3.3 YashanDB内存溢出恢复

3.3.1 YashanDB内存溢出恢复步骤

# 内存溢出恢复步骤

# 1. 紧急处理
# 终止占用内存过高的进程
$ ps -ef | grep yasdb
$ kill -9

# 2. 调整内存参数
# 修改内存配置文件
$ vi /yashandb/app/yashandb.conf

# 3. 重启数据库
$ yasboot stop fgedudb
$ yasboot start fgedudb

# 4. 验证内存使用
$ free -h
$ sqlplus / as sysdba
SQL> SELECT * FROM v$sgainfo;

# 5. 优化SQL语句
# 找出并优化占用内存过高的SQL语句
SQL> SELECT sql_id, memory_used FROM v$session WHERE memory_used > 0 ORDER BY memory_used DESC;
SQL> EXPLAIN ANALYZE SELECT * FROM fgedu.large_table WHERE condition;

# 6. 监控内存使用
# 持续监控内存使用情况,确保恢复正常
$ ./memory_monitor.sh

3.3.2 YashanDB内存溢出预防措施

# 内存溢出预防措施

# 1. 合理配置内存参数
# 根据硬件资源和业务需求设置内存参数
# 定期检查和调整内存参数

# 2. 优化SQL语句
# 避免复杂查询,优化执行计划
# 限制结果集大小,使用分页查询

# 3. 控制并发连接
# 使用连接池管理连接
# 限制最大连接数

# 4. 启用内存监控
# 建立内存使用基线
# 设置内存使用告警阈值

# 5. 定期维护
# 定期执行VACUUM操作
# 定期重启数据库释放内存

# 6. 升级硬件
# 根据业务增长需求,及时升级内存
# 使用高性能内存

风哥提示:内存溢出恢复后,应及时分析故障原因,采取预防措施避免类似故障再次发生。建议建立内存管理规范,定期进行内存使用评估和优化。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 YashanDB内存溢出案例一

案例背景:某企业生产系统,数据库突然崩溃,日志显示内存溢出错误。

# 问题现象
– 数据库突然崩溃
– 日志文件显示内存溢出错误
– 应用系统无法访问数据库

# 分析步骤

# 1. 检查系统内存
$ free -h
total used free shared buff/cache available
Mem: 16G 15G 1.0G 2.0G 0.0G 0.0G
Swap: 8.0G 8.0G 0.0G

# 2. 检查数据库日志
$ tail -n 100 /yashandb/app/log/fgedudb_alert.log
2026-04-11 09:30:00.000 UTC [12345] FATAL: out of memory
2026-04-11 09:30:00.000 UTC [12345] DETAIL: Failed on request of size 16777216.

# 3. 检查数据库参数
$ sqlplus / as sysdba
SQL> SELECT name, value/1024/1024 AS “Value (MB)” FROM v$parameter WHERE name IN (‘shared_buffers’, ‘work_mem’);

NAME Value (MB)
——————– ————
shared_buffers 12288.00
work_mem 256.00

# 4. 问题原因
– 共享缓冲区设置过大(12GB),超过系统内存(16GB)的合理范围
– 工作内存设置过大,导致并发查询时内存使用过高

# 5. 解决方案
– 调整共享缓冲区和工作内存参数
– 重启数据库
– 测试应用连接

# 执行步骤
$ vi /yashandb/app/yashandb.conf
# 修改shared_buffers = 4GB
# 修改work_mem = 64MB
$ yasboot stop fgedudb
$ yasboot start fgedudb
$ sqlplus fgedu/fgedu@fgedudb

4.2 YashanDB内存溢出案例二

案例背景:某电商系统,大促期间数据库响应缓慢,出现内存溢出告警。

# 问题现象
– 大促期间数据库响应缓慢
– 系统监控显示内存使用接近100%
– 部分查询超时

# 分析步骤

# 1. 检查系统内存
$ free -h
total used free shared buff/cache available
Mem: 64G 60G 4.0G 2.0G 0.0G 0.0G
Swap: 32G 10G 22G

# 2. 检查数据库内存使用
$ sqlplus / as sysdba
SQL> SELECT * FROM v$sgainfo;

NAME BYTES RESIZEABLE
——————————– ———- ———-
Fixed SGA Size 25165824 No
Redo Buffers 16777216 No
Buffer Cache Size 34359738368 Yes
Shared Pool Size 8589934592 Yes
Large Pool Size 104857600 Yes
Java Pool Size 104857600 Yes
Streams Pool Size 104857600 Yes
Shared IO Pool Size 104857600 Yes
Data Transfer Cache Size 104857600 Yes
Granule Size 16777216 No
Maximum SGA Size 44739242496 No
Startup overhead in Shared Pool 134217728 No
Free SGA Memory Available 1073741824 No

# 3. 检查正在执行的SQL语句
SQL> SELECT sid, serial#, username, program, sql_id, memory_used FROM v$session WHERE memory_used > 0 ORDER BY memory_used DESC;

SID SERIAL# USERNAME PROGRAM SQL_ID MEMORY_USED
———- ———- ———- ——————– ————- ———–
123 456 FGEDU application.exe a1b2c3d4e5f6 10485760
124 457 FGEDU application.exe g7h8i9j0k1l2 5242880

# 4. 查看SQL执行计划
SQL> EXPLAIN ANALYZE SELECT * FROM fgedu.orders WHERE order_date BETWEEN ‘2026-04-01’ AND ‘2026-04-10’;

Seq Scan on orders (cost=0.00..100000.00 rows=1000000 width=100) (actual time=0.01..1000.00 rows=1000000 loops=1)
Filter: (order_date >= ‘2026-04-01’::date AND order_date <= '2026-04-10'::date) Rows Removed by Filter: 9000000 Planning Time: 0.10 ms Execution Time: 1000.10 ms # 5. 问题原因 - 复杂查询导致大结果集,占用大量内存 - 并发连接数过高,内存使用累积 - 共享池配置不足 # 6. 解决方案 - 优化SQL语句,添加索引 - 限制结果集大小,使用分页查询 - 调整共享池大小 - 控制并发连接数 # 执行步骤 $ sqlplus / as sysdba SQL> CREATE INDEX idx_orders_order_date ON fgedu.orders(order_date);
SQL> ALTER SYSTEM SET shared_pool_size = ’12GB’ SCOPE=spfile;
SQL> ALTER SYSTEM SET max_connections = 200 SCOPE=spfile;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP;

4.3 YashanDB内存溢出案例三

案例背景:某金融系统,数据库内存使用持续增长,最终导致内存溢出。

# 问题现象
– 数据库内存使用持续增长
– 系统交换空间使用增加
– 数据库响应速度逐渐下降

# 分析步骤

# 1. 检查系统内存
$ free -h
total used free shared buff/cache available
Mem: 32G 30G 2.0G 2.0G 0.0G 0.0G
Swap: 16G 12G 4.0G

# 2. 检查数据库内存使用
$ sqlplus / as sysdba
SQL> SELECT * FROM v$sgainfo;

NAME BYTES RESIZEABLE
——————————– ———- ———-
Fixed SGA Size 25165824 No
Redo Buffers 16777216 No
Buffer Cache Size 16106127360 Yes
Shared Pool Size 4294967296 Yes
Large Pool Size 104857600 Yes
Java Pool Size 104857600 Yes
Streams Pool Size 104857600 Yes
Shared IO Pool Size 104857600 Yes
Data Transfer Cache Size 104857600 Yes
Granule Size 16777216 No
Maximum SGA Size 21474836480 No
Startup overhead in Shared Pool 134217728 No
Free SGA Memory Available 1073741824 No

# 3. 检查数据库版本
SQL> SELECT * FROM v$version;

BANNER
——————————————————————————–
YashanDB 8.0.0.1 Production on Linux x86_64

# 4. 检查数据库日志
$ tail -n 100 /yashandb/app/log/fgedudb_alert.log
2026-04-11 09:30:00.000 UTC [12345] WARNING: memory leak detected
2026-04-11 09:30:00.000 UTC [12345] DETAIL: Memory allocated but not freed: 1073741824 bytes

# 5. 问题原因
– 数据库版本存在内存泄漏 bug
– 长时间运行导致内存累积
– 未及时应用补丁

# 6. 解决方案
– 应用最新补丁
– 重启数据库释放内存
– 监控内存使用情况

# 执行步骤
$ yasboot stop fgedudb
# 应用补丁
$ ./apply_patch.sh
$ yasboot start fgedudb
$ sqlplus / as sysdba
SQL> SELECT * FROM v$version;

生产环境建议:内存溢出问题的解决需要综合考虑内存配置、SQL优化、并发控制等多个方面。建议建立内存管理规范,定期进行内存使用评估和优化。from yashandb视频:www.itpux.com

Part05-风哥经验总结与分享

5.1 YashanDB内存管理最佳实践

YashanDB内存管理最佳实践:

  • 合理规划:根据硬件资源和业务需求,合理规划内存分配
  • 参数调优:根据实际情况调整内存相关参数,如shared_buffers、work_mem等
  • SQL优化:优化SQL语句,减少内存使用,避免大结果集查询
  • 并发控制:合理控制并发连接数,使用连接池管理连接
  • 监控体系:建立完善的内存监控机制,及时发现内存问题
  • 定期维护:定期执行数据库维护操作,如VACUUM、ANALYZE等
  • 补丁管理:及时应用数据库补丁,修复内存泄漏等问题
  • 硬件升级:根据业务增长需求,及时升级内存硬件
风哥提示:内存管理是数据库性能优化的重要组成部分,需要持续关注和优化。建议建立内存管理的规范和流程,定期review和改进。

5.2 YashanDB内存检查清单

# YashanDB内存检查清单
– [ ] 系统内存是否满足数据库需求
– [ ] 数据库内存参数是否合理配置
– [ ] 共享缓冲区大小是否合适
– [ ] 工作内存大小是否合适
– [ ] 维护工作内存大小是否合适
– [ ] 并发连接数是否合理控制
– [ ] SQL语句是否优化,避免大结果集
– [ ] 内存监控是否完善
– [ ] 内存使用基线是否建立
– [ ] 内存溢出应急预案是否制定

# 内存问题处理流程
1. 发现内存问题
2. 收集内存使用相关信息
3. 分析内存问题原因
4. 制定处理方案
5. 执行处理方案
6. 验证问题解决
7. 总结经验,优化预防措施

5.3 YashanDB内存管理工具推荐

YashanDB内存管理常用工具:

  • free/top:操作系统内存监控工具
  • vmstat:系统内存和虚拟内存监控工具
  • pmap:进程内存映射分析工具
  • valgrind:内存泄漏检测工具
  • YashanDB内置视图:v$sgainfo、v$pgastat等
  • YCM监控平台:YashanDB监控工具,提供内存监控
  • Zabbix/Prometheus:第三方监控工具,可配置内存监控告警
  • shell脚本:自定义内存监控和分析脚本
持续改进:内存管理是一个持续的过程,需要根据业务需求和系统变化不断调整和优化。建议定期进行内存使用评估,及时发现和解决内存问题。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息