在 Ubuntu 下运行 Oracle 数据库(通常是 Oracle 19c / 21c,或旧版 11g/12c),优化可以从 系统层、Oracle 参数层、SQL 层、存储层 四个方面来做。下面给你一套实用优化清单。
编辑 /etc/sysctl.conf:
fs.file-max = 6815744
kernel.sem = 250 32000 100 128
kernel.shmmax = 4294967295
kernel.shmall = 1073741824
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
确保 pam_limits.so 已启用。
systemctl disable snapd
systemctl disable bluetooth
defaults,noatime,nodiratime
SHOW PARAMETER memory_target;
SHOW PARAMETER sga_target;
推荐(示例,8G 内存):
ALTER SYSTEM SET memory_target=6G SCOPE=SPFILE;
ALTER SYSTEM SET memory_max_target=6G SCOPE=SPFILE;
重启数据库生效。
ALTER SYSTEM SET processes=500 SCOPE=SPFILE;
ALTER SYSTEM SET open_cursors=1000 SCOPE=BOTH;
ALTER SYSTEM SET session_cached_cursors=200 SCOPE=BOTH;
ALTER SYSTEM SET undo_retention=1800 SCOPE=BOTH;
ALTER SYSTEM SET log_buffer=16M SCOPE=SPFILE;
ALTER SYSTEM SET fast_start_mttr_target=300 SCOPE=BOTH;
@?/rdbms/admin/awrrpt.sql
关注:
SELECT *LIKE '%xx%'EXEC DBMS_STATS.GATHER_SCHEMA_STATS('USERNAME');
放在不同磁盘
SELECT group#, members, bytes FROM v$log;
推荐:
ALTER SYSTEM SET filesystemio_options=SETALL SCOPE=SPFILE;
ALTER SYSTEM SET disk_asynch_io=TRUE SCOPE=SPFILE;
| 问题 | 解决 |
|---|---|
| 启动慢 | 关闭 avahi / snap |
| ORA-27102 | 调整 shmmax |
| 中文乱码 | 设置 NLS_LANG |
| 性能差 | 检查 swap 是否频繁 |
如果你能告诉我:
我可以给你一套 针对性参数模板。