CentOS环境下Oracle数据库调优指南
/etc/sysctl.conf文件,调整以下关键参数以适配Oracle内存需求:
vm.swappiness=10:降低系统将内存换出到交换空间的倾向(值越低,越优先使用物理内存);vm.dirty_background_ratio=10、vm.dirty_ratio=20:控制脏页写入磁盘的阈值(避免频繁I/O刷盘);fs.file-max=6815744:增加系统最大文件句柄数(满足Oracle大量文件访问需求);net.ipv4.ip_local_port_range=9000 65500:扩大本地端口范围(支持更多并发连接)。sysctl -p使参数生效。noatime,nodiratime选项(减少文件访问时间戳更新的开销)。systemctl stop firewalld)、SELinux(setenforce 0)及无用后台服务(如postfix、avahi-daemon),减少系统资源竞争。Oracle内存分为SGA(系统全局区,进程共享)和PGA(程序全局区,进程私有),合理分配是性能核心:
1 - (physical_reads / (db_block_gets + consistent_gets)))。若命中率低,可增加db_cache_size(如初始设置为2GB,逐步调整至系统内存的1/4)。SELECT (SUM(pins - reloads) / SUM(pins)) * 100 "Library Cache Hit Ratio" FROM v$librarycache;监控,若低于90%,增加shared_pool_size(如设置为1.5GB)。SELECT * FROM v$pgastat WHERE name = 'total PGA allocated';监控使用情况,调整至合理范围。HugePages = (SGA_SIZE * 1024) / 2048(单位:MB转页数),在/etc/sysctl.conf中添加vm.nr_hugepages=HugePages,并重启Oracle服务。SELECT emp_name, salary FROM employees),减少不必要的I/O开销;SELECT * FROM employees WHERE dept_id = :dept_id),降低硬解析频率(硬解析会消耗大量CPU);HASH JOIN适用于大表关联,嵌套循环NESTED LOOPS适用于小表关联),确保JOIN条件使用索引。CREATE INDEX idx_emp_dept ON employees(dept_id););ALTER INDEX idx_name REBUILD(碎片率>30%时),提升索引访问效率;SELECT * FROM dba_indexes WHERE table_name = 'TABLE_NAME' AND status = 'UNUSED'查找未使用的索引,减少维护开销。/u01/oradata放数据文件,/u02/oradata放redo log),避免磁盘争用;RANGE PARTITION BY MONTH)、范围(如RANGE PARTITION BY REGION)分区,减少查询扫描的数据量(如SELECT * FROM sales WHERE sale_date BETWEEN '2025-01-01' AND '2025-01-31'只需扫描对应分区);INITIAL(初始大小)、NEXT(下次扩展大小)参数(如INITIAL 100M NEXT 100M),减少动态扩展带来的性能损耗。@?/rdbms/admin/awrrpt.sql),分析top SQL、等待事件(如db file sequential read、log file sync);通过ADDM(自动数据库诊断监视器)报告(@?/rdbms/admin/addmrpt.sql)获取优化建议;EXEC DBMS_STATS.GATHER_SCHEMA_STATS('SCHEMA_NAME', cascade=>TRUE);(每周一次),确保优化器生成最佳执行计划;ALTER TABLE table_name MOVE)、索引碎片(ALTER INDEX index_name REBUILD),保持数据库高效运行。