在 Ubuntu 下遇到 Oracle 数据库访问/查询慢,可以从系统、数据库、网络、应用几个层面逐步排查。下面给你一套实用排查思路和常见解决办法。
先区分是:
可用工具:
time sqlplus user/pass@sid <<EOF
select count(*) from big_table;
EOF
top
htop
free -h
df -h
iostat -x 1
常见问题:
建议:
/u01 单独挂载,避免和系统盘抢 IOUbuntu 默认参数不适合 Oracle。
检查:
sysctl -a | grep shm
sysctl -a | grep sem
常见优化(示例,按内存调整):
# /etc/sysctl.conf
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmax = 17179869184
kernel.shmall = 4194304
net.ipv4.ip_local_port_range = 9000 65500
生效:
sysctl -p
ulimit -a
Oracle 用户建议:
# /etc/security/limits.conf
oracle soft nofile 65536
oracle hard nofile 65536
oracle soft nproc 16384
oracle hard nproc 16384
SELECT event, total_waits, time_waited
FROM v$system_event
ORDER BY time_waited DESC;
常见问题:
db file sequential read → 索引/IO 问题log file sync → 提交频繁latch free → 并发问题EXPLAIN PLAN FOR
SELECT * FROM your_table WHERE col=:x;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
常见原因:
LIKE '%xx%'WHERE TO_CHAR(time)=...)更新统计信息:
EXEC DBMS_STATS.GATHER_TABLE_STATS('USER','TABLE');
SHOW PARAMETER sga_target;
SHOW PARAMETER pga_aggregate_target;
Ubuntu 上 Oracle 默认可能很小,建议:
sga_target 至少 40%~60% 物理内存pga_aggregate_target 20% 左右如果:
会导致 commit 很慢
检查:
ARCHIVE LOG LIST;
Ubuntu 上 Oracle 客户端经常因 DNS 卡住。
解决:
listener.ora / tnsnames.ora 用 IP/etc/resolv.conf 精简# /etc/hosts
127.0.0.1 localhost
ufw status
常见问题:
建议:
如果你愿意,可以告诉我:
我可以直接帮你定位到具体原因。