CentOS 上 Oracle 数据库调优实战指南
一 操作系统层优化
- 内存与大页
- 将 SGA 放入单个共享内存段:设置 kernel.shmmax 不小于实例的 SGA_MAX_SIZE,并按内存计算 kernel.shmall(以 4KB 页计)。经验上可将 shmmax 设为物理内存的约一半(如 32GB 内存可设约 17GB),再结合负载微调。启用 HugePages 降低页表开销,并关闭透明大页(THP)以避免抖动。示例计算:shmall ≈ 内存字节数 ÷ 4096。
- 虚拟内存与脏页
- 适度降低 vm.swappiness(如 10)以减少换页;结合业务调整 vm.dirty_background_ratio / vm.dirty_ratio,在写密集场景避免突发写放大。
- 文件句柄与 AIO
- 提高 fs.file-max 与 fs.aio-max-nr,满足 Oracle 高并发文件与异步 I/O 需求。
- 网络参数
- 增大套接字缓冲与本地端口范围,例如:net.core.rmem_default / rmem_max、net.core.wmem_default / wmem_max、net.ipv4.ip_local_port_range。
- I/O 调度器
- 物理机/裸金属优先 deadline(对延迟更友好);SSD/NVMe 或虚拟化环境优先 noop(由上层调度器/存储处理)。
- 其它
- 关闭不必要的系统服务,减少资源竞争;确保 NTP 时间同步,避免日志与统计失真。
二 数据库内存与实例参数
- 内存管理模式
- 优先启用自动内存管理:设置 MEMORY_TARGET / MEMORY_MAX_TARGET,让 Oracle 在 SGA 与 PGA 间自动平衡;或分别设置 SGA_TARGET 与 PGA_AGGREGATE_TARGET。示例:
- ALTER SYSTEM SET sga_target = 4G SCOPE=BOTH;
- ALTER SYSTEM SET pga_aggregate_target = 1G SCOPE=BOTH;
- 共享池与日志
- 适度增大共享池(如 SHARED_POOL_SIZE)与保留区(SHARED_POOL_RESERVED_SIZE),缓解高硬解析与对象老化抖动;OLTP 可适当增大 LOG_BUFFER 减少日志写等待。
- 并发与会话
- 结合负载设置 PROCESSES / SESSIONS,避免连接风暴;应用侧使用连接池,控制活跃会话峰值。
- RAC 专项(如适用)
- 高 SGA/高并发下关注 _gc_policy_time、_gc_policy_minimum、_lm_sync_timeout、_lm_tickets 等参数,降低 DRM 重配置与大消息同步的超时风险。
三 存储 I O 与文件系统
- 存储硬件
- 优先 SSD/NVMe 或高性能阵列(RAID10/条带化),分离 REDO/归档/数据/临时表空间 到不同磁盘组,降低争用。
- 文件系统与挂载
- 选择 XFS/ext4 等成熟文件系统,合理设置挂载选项(如 noatime、barrier 等按存储与可靠性权衡);条带对齐与对齐边界有助于顺序/随机 I/O 性能。
- I/O 路径
- 确认异步 I/O(AIO)工作正常;在虚拟化环境优先 virtio 驱动与 noop 调度器,减少双重调度。
四 SQL 与索引及对象设计
- SQL 写法
- 避免 *SELECT ,只查必要列;使用绑定变量减少硬解析;用 EXPLAIN PLAN 与执行计划分析定位全表扫描、隐式转换、笛卡尔积等根因。
- 索引策略
- 为高频过滤/连接/排序列建立合适索引,优先覆盖索引;定期清理未使用/重复索引;必要时重建碎片化严重的索引。
- 并行处理
- 对大表扫描/聚合/连接按需设置表级或语句级并行度(如 PARALLEL 提示或会话策略),避免无谓并行导致资源争用。
- 分区与压缩
- 对大表按时间/地域等维度分区,配合分区裁剪与并行维护;对历史/归档数据考虑压缩降低 I/O。
五 监控 维护与变更流程
- 监控与诊断
- 定期生成 AWR/ASH/ADDM 报告,定位 Top SQL、等待事件与瓶颈;结合 V$ 动态视图做细粒度排查。
- 统计信息与空间
- 定期收集对象统计信息(如 DBMS_STATS.GATHER_SCHEMA_STATS),保证优化器选择更优计划;监控 表/索引碎片 与空间使用,按需重组或分区维护。
- 变更流程
- 任何重大参数或结构变更先在测试环境验证,评估回滚方案;变更窗口内控制并发与负载,变更后复核 AWR/ASH 指标确认收益。