在 Linux 上运行 Oracle 数据库 的调优是一个系统工程,通常分为 操作系统层、存储层、Oracle 实例层、SQL 层。下面给你一个实用、可落地的调优思路,适合生产环境。
编辑 /etc/sysctl.conf:
# 共享内存(Oracle SGA 依赖)
kernel.shmmax = 68719476736 # 64GB,建议 ≥ SGA
kernel.shmall = 16777216 # shmmax/PAGE_SIZE
# 信号量
kernel.sem = 250 32000 100 128
# 文件句柄
fs.file-max = 6815744
# 网络
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 4194304
sysctl -p
编辑 /etc/security/limits.conf:
oracle soft nofile 65536
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
oracle soft stack 10240
oracle hard stack 32768
systemctl disable firewalld
systemctl disable selinux
(生产环境视安全策略而定)
避免 SGA 被 swap:
grep Huge /proc/meminfo
计算大页数量:
Hugepagesize = 2048 kB
SGA = 32G → 32*1024*1024/2048 = 16384
/etc/sysctl.conf:
vm.nr_hugepages = 16384
| 场景 | 推荐 |
|---|---|
| 生产 | xfs / ext4 |
| 高性能 | ASM(首选) |
cat /sys/block/sda/queue/scheduler
推荐:
echo deadline > /sys/block/sda/queue/scheduler
或(新内核):
echo mq-deadline > /sys/block/sda/queue/scheduler
NORMAL / HIGH 冗余show parameter sga
show parameter pga
推荐设置:
alter system set sga_target=24G scope=spfile;
alter system set sga_max_size=24G scope=spfile;
alter system set pga_aggregate_target=8G scope=spfile;
经验值:
| 内存 | SGA | PGA |
|---|---|---|
| 64G | 40G | 12G |
| 128G | 80G | 20G |
⚠️ 生产不建议 AMM
alter system set memory_target=0 scope=spfile;
alter system set processes=2000 scope=spfile;
alter system set sessions=3000 scope=spfile;
alter system set open_cursors=1000;
alter system set undo_retention=3600;
alter index idx_name rebuild;
set autotrace on
关注:
使用:
/*+ INDEX *//*+ USE_HASH *//*+ LEADING */exec dbms_stats.gather_table_stats('SCOTT','EMP');
@?/rdbms/admin/awrrpt.sql
重点看:
@?/rdbms/admin/addmrpt.sql
| 现象 | 原因 | 解决 |
|---|---|---|
| CPU 高 | SQL 全表扫描 | 加索引 |
| IO 高 | 热块 / 索引失效 | 分区 / 索引 |
| Swap 高 | SGA 过大 | 开 HugePages |
| 锁等待 | 事务长 | 提交频率 |
| 连接慢 | processes 不够 | 调大参数 |
如果你愿意,我可以帮你:
你可以直接贴:
服务器内存、CPU、Oracle 版本、主要业务类型