Oracle 在 Linux 上内存不足,通常不是“加内存”这么简单,而是监控 + 调参数 + 排查异常一起处理。下面按排查 → 应急 → 根治 → 最佳实践给你一整套方案。
free -h
重点看:
top
或
ps -eo pid,user,%mem,vsz,rss,cmd | sort -k4 -nr | head
常见大户:
oracleora_pmon, smon, dbw, lgwrshow parameter sga_max_size
show parameter sga_target
show parameter pga_aggregate_target
Oracle 非常容易 SGA + PGA > 物理内存。
sync
echo 1 > /proc/sys/vm/drop_caches
⚠️ 不影响数据库,但会降一点 IO 性能
systemctl list-units --type=service
如:
alter system set sga_target=4G scope=both;
alter system set pga_aggregate_target=1G scope=both;
⚠️ 不要低于官方最低值
SGA + PGA < 60% ~ 70% 物理内存
假设你是 16G 内存服务器:
memory_target=0
memory_max_target=0
sga_target=8G
sga_max_size=8G
pga_aggregate_target=2G
如果是 12c+ 且用 AMM:
memory_target=10G
memory_max_target=10G
查看:
cat /proc/meminfo | grep Huge
如果是:
HugePages_Total = 0
说明 没开
大致步骤:
vi /etc/sysctl.conf
vm.nr_hugepages = 4096
sysctl -p
Oracle 官方文档有 hugepages_settings.sh 脚本,能帮你算。
vi /etc/sysctl.conf
推荐:
vm.swappiness = 1
vm.overcommit_memory = 2
vm.overcommit_ratio = 90
生效:
sysctl -p
⚠️ overcommit_memory=2 能防止 OOM Killer 杀 Oracle
tail -f $ORACLE_BASE/diag/rdbms/*/*/trace/alert*.log
dmesg | grep -i oom
journalctl -k | grep oom
| 现象 | 原因 |
|---|---|
| ORA-4030 | PGA 不够 |
| ORA-00845 | MEMORY_TARGET 超出 shm |
| ORA-27102 | Linux 内存不足 |
| 数据库被 kill | OOM Killer |
| 内存 | SGA | PGA |
|---|---|---|
| 8G | 4G | 1G |
| 16G | 8G | 2G |
| 32G | 18G | 4G |
| 64G | 40G | 8G |
你可以直接告诉我:
free -h 和 show parameter memory 输出我可以给你一套 可直接执行的安全参数。