在 Linux 上优化 Oracle 数据库,一般从 操作系统、Oracle 参数、存储、SQL、架构 五个层面来做。下面给你一个实用型优化清单,适合生产环境参考。
编辑 /etc/sysctl.conf:
# 共享内存
kernel.shmmax = 17179869184 # 16GB,建议 ≥ SGA
kernel.shmall = 4194304
# 信号量
kernel.sem = 250 32000 100 128
# 文件句柄
fs.file-max = 6815744
# 网络
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 = 1048576
执行:
sysctl -p
编辑 /etc/security/limits.conf:
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
oracle hard stack 32768
systemctl disable firewalld
systemctl disable selinux
生产环境建议关闭或放行 Oracle 端口(1521)
xfs 或 ext4echo deadline > /sys/block/sda/queue/scheduler
SHOW PARAMETER memory_target;
SHOW PARAMETER sga_target;
SHOW PARAMETER pga_aggregate_target;
示例(16G 内存服务器):
ALTER SYSTEM SET memory_max_target=12G SCOPE=SPFILE;
ALTER SYSTEM SET memory_target=12G SCOPE=SPFILE;
重启数据库生效。
db_cache_size
shared_pool_size
large_pool_size
java_pool_size
建议:
shared_pool_size 不宜过大(防 ORA-4031)SELECT name FROM v$controlfile;
SELECT name FROM v$datafile;
SELECT member FROM v$logfile;
ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/oracle/redo04a.log') SIZE 500M;
SHOW PARAMETER filesystemio_options;
ALTER SYSTEM SET filesystemio_options=SETALL SCOPE=SPFILE;
SELECT sql_id, sql_text, executions, elapsed_time
FROM v$sqlarea
ORDER BY elapsed_time DESC;
ALTER INDEX idx_name REBUILD;
EXEC DBMS_STATS.GATHER_TABLE_STATS('SCOTT','EMP');
定期执行,避免执行计划错误。
processes
sessions
ALTER SYSTEM SET processes=1000 SCOPE=SPFILE;
optimizer_mode = ALL_ROWS
cursor_sharing = FORCE
@?/rdbms/admin/awrrpt.sql)✅ 看 AWR 报告
✅ 给你 具体参数建议(按内存大小)
✅ 分析 慢 SQL
✅ 判断是 CPU / IO / 锁 问题
你可以直接告诉我:
Oracle 版本 + Linux 版本 + 内存 + 当前主要问题(慢查询 / 卡顿 / 高 IO)