在 Ubuntu + Oracle Database 环境下做调优,通常从 操作系统层、Oracle 实例参数、SQL、存储/IO、监控 几个方面入手。下面给你一套比较实用的调优思路和常见做法(适用于 Oracle 11g/12c/19c)。
Oracle 官方对 Linux 有明确要求,Ubuntu 也要改。
编辑:
/etc/sysctl.conf
常见参数示例(按内存调整):
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmax = 17179869184 # 示例:16G
kernel.shmall = 4194304
kernel.shmmni = 4096
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
减少系统开销:
systemctl disable snapd
systemctl disable bluetooth
Oracle 数据文件建议:
defaults,noatime,nodiratime
示例:
/dev/sdb1 /u01 ext4 defaults,noatime 0 0
查看:
SHOW PARAMETER memory_target;
SHOW PARAMETER sga_target;
SHOW PARAMETER pga_aggregate_target;
推荐(物理内存 16G 示例):
ALTER SYSTEM SET memory_target=12G SCOPE=SPFILE;
ALTER SYSTEM SET sga_target=8G SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target=4G SCOPE=SPFILE;
重启生效:
SHUTDOWN IMMEDIATE;
STARTUP;
SHOW PARAMETER processes;
ALTER SYSTEM SET processes=500 SCOPE=SPFILE;
减少 IO 压力:
ALTER SYSTEM SET log_checkpoint_interval=0;
ALTER SYSTEM SET fast_start_mttr_target=300;
SELECT * FROM v$sqlarea
ORDER BY elapsed_time DESC
FETCH FIRST 10 ROWS ONLY;
EXPLAIN PLAN FOR
SELECT * FROM t WHERE id=1;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
关注:
CREATE INDEX idx_t_col ON t(col);
放不同磁盘
Ubuntu 上也可用,但配置复杂
中小系统可用:
@?/rdbms/admin/awrrpt.sql
看:
top
iostat -x 1
vmstat 1
free -h
| 现象 | 可能原因 |
|---|---|
| CPU 高 | 坏 SQL / 缺索引 |
| IO 高 | redo / 全表扫 |
| 内存不足 | SGA 太小 |
| 连接慢 | processes 不够 |
| 系统卡 | swap 使用 |
如果你愿意,可以告诉我:
我可以直接给你一套 可执行的调优参数清单。