优化 Linux 下 Oracle 数据库性能是一个系统性工程,需要从硬件、操作系统、数据库参数、SQL、架构等多个层面协同进行。下面给你一份从浅到深的实战优化指南,适合生产环境。
Oracle 对内存非常敏感。
避免 SGA 被换页,提高性能。
# 查看是否启用
cat /proc/meminfo | grep Huge
# 设置大页数量(示例)
# 计算方式:
# SGA_MAX_SIZE / Hugepagesize
典型配置步骤:
vi /etc/sysctl.conf
vm.nr_hugepages = 4096
sysctl -p
⚠️ SGA 不要超过大页总量
THP 会导致 Oracle 性能抖动:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
永久生效:
vi /etc/rc.d/rc.local
vi /etc/sysctl.conf
建议配置:
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmmni = 4096
kernel.shmall = 1073741824
kernel.shmmax = 4294967295
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 4194304
sysctl -p
vi /etc/security/limits.conf
oracle soft nofile 65536
oracle hard nofile 65536
oracle soft nproc 2047
oracle hard nproc 16384
ALTER SYSTEM SET filesystemio_options=SETALL SCOPE=SPFILE;
ALTER SYSTEM SET disk_asynch_io=TRUE SCOPE=SPFILE;
cat /sys/block/sda/queue/scheduler
# 推荐 deadline 或 noop
echo deadline > /sys/block/sda/queue/scheduler
ALTER SYSTEM SET MEMORY_MAX_TARGET=16G SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_TARGET=16G SCOPE=SPFILE;
或手动管理(更稳定):
ALTER SYSTEM SET SGA_TARGET=12G SCOPE=SPFILE;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=4G SCOPE=SPFILE;
ALTER SYSTEM SET FAST_START_MTTR_TARGET=0;
SELECT * FROM v$log;
ALTER SYSTEM SET PROCESSES=2000 SCOPE=SPFILE;
ALTER SYSTEM SET SESSIONS=2200 SCOPE=SPFILE;
SELECT *查看慢 SQL:
SELECT sql_id, elapsed_time, executions
FROM v$sqlarea
ORDER BY elapsed_time DESC;
ALTER INDEX idx_name REBUILD;
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','EMP');
SELECT * FROM v$temp_space_header;
避免 TEMP 爆满。
@?/rdbms/admin/awrrpt.sql
重点关注:
@?/rdbms/admin/addmrpt.sql
| 现象 | 常见原因 |
|---|---|
| CPU 高 | SQL 未走索引 |
| IO 高 | 全表扫描、redo 小 |
| 内存 swap | 未用 HugePages |
| 等待 enq: TX | 锁竞争 |
| TEMP 满 | 大排序、HASH JOIN |
你可以直接告诉我:
我可以给你一套针对性的参数配置方案。