CentOS 上提升 Oracle 性能的实用清单
一 操作系统与存储基础
- 使用SSD/NVMe或高性能阵列,优先将数据文件、在线重做日志、归档日志、临时表空间分别放在不同物理磁盘或阵列上,降低 I/O 争用。
- 选择XFS/ext4等合适文件系统,合理挂载(如 noatime、barrier 按存储特性设置),并尽量使用Oracle ASM或条带化布局提升吞吐。
- 规划充足的内存与 CPU,避免系统其他进程抢占数据库资源。
- 网络层面确保低时延与足够带宽,为 RAC/Data Guard/应用连接提供稳定链路。
二 内存与 HugePages 优化
- 内存分配建议:在保障 OS 与后台进程的前提下,SGA 通常占物理内存的 1/3~1/2,并满足SGA + PGA + OS 使用内存 < 总内存;PGA 交由自动管理更稳健。
- 启用自动内存管理(AMM)或自动共享内存管理(ASMM):
- 示例:
ALTER SYSTEM SET sga_target=4G SCOPE=BOTH; ALTER SYSTEM SET pga_aggregate_target=1G SCOPE=BOTH;
- 使用HugePages提升大页命中与减少 TLB 失效(对大 SGA 收益明显):
- 在
/etc/security/limits.conf 为 Oracle 用户设置 memlock(单位 KB,略小于物理内存);
- 若使用 HugePages,建议禁用 AMM(即不使用 memory_target/memory_max_target),改用
sga_target/pga_aggregate_target;
- 计算并配置
vm.nr_hugepages,确保 SGA 能完全落入大页;
- 启动后核对 HugePages 使用情况。
- 共享内存与页大小:按系统内存设置
kernel.shmmax、kernel.shmall(单位页),避免共享内存不足导致实例无法启动。
三 数据库参数与 I/O 调优
- 内存组件与关键参数:
- 合理设置
shared_pool_size、db_cache_size、large_pool_size、java_pool_size;
- 日志缓冲区:
log_buffer 通常在512KB~1MB范围,OLTP 可适当放大;
- 多块读:结合存储与负载设置
DB_FILE_MULTIBLOCK_READ_COUNT,长表扫描受益明显。
- 检查点与日志:
- 通过增大在线重做日志文件大小/组数,减少检查点频率与日志切换抖动;
- 关注
log file sync 等等待,必要时评估更快的存储或优化提交策略。
- I/O 分布与对象布局:
- 将数据、索引、临时、回滚等对象分离到不同表空间/磁盘;
- 使用本地管理表空间、合理 extent 管理,减少空间管理开销;
- 通过
v$filestat、v$datafile 等定位热点文件与异常 I/O。
四 SQL 与对象设计优化
- 执行计划与访问路径:
- 避免*SELECT ,使用绑定变量减少硬解析;
- 通过索引与谓词过滤降低全表扫描;
- 用
EXPLAIN PLAN/SQL Trace/执行计划分析定位高成本操作。
- 索引策略:
- 为高频过滤/连接/排序列建立合适索引;
- 定期清理未使用或重复索引,减少 DML 维护成本;必要时重建/重组碎片化索引。
- 分区与并行:
- 对大表按时间/范围/哈希进行分区,提升扫描与维护效率;
- 结合
PARALLEL 提示或资源管理器在合适场景启用并行。
- 统计信息与计划稳定性:
- 定期收集统计信息:
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCHEMA_NAME');
- 使用 SQL Tuning Advisor 与 SQL Plan Baselines 稳定优质计划。
五 监控、维护与容量规划
- 基线与分析:
- 定期生成 AWR/ADDM 报告,识别 Top SQL、等待事件与瓶颈;
- 结合 ASH 做短时段热点定位与会话级诊断。
- 连接与会话:
- 合理设置
processes、sessions,使用连接池控制并发,避免连接风暴;
- 利用 Resource Manager 对消耗型任务限流,保障关键业务。
- 日常维护:
- 持续更新统计信息、按需重建/重组索引、清理无用对象;
- 监控表/索引碎片与空间使用,提前做容量规划与结构调整。