使用free -h命令查看Ubuntu系统的物理内存总量,为Oracle内存配置提供基础依据(如8GB内存的服务器,建议SGA占用3-6GB、PGA占用1-2GB)。
编辑/etc/sysctl.conf文件,添加或修改以下关键参数以优化系统内存管理:
net.ipv4.ip_local_port_range = 1024 65000 # 扩展端口范围
fs.file-max = 65536 # 增加文件句柄数
kernel.shmall = 2097152 # 共享内存总页数(每页4KB)
kernel.shmmax = 2147483648 # 单个共享内存段最大大小(2GB)
kernel.shmmni = 4096 # 共享内存段最大数量
kernel.sem = 250 32000 100 128 # 信号量参数
vm.swappiness = 10 # 降低交换空间使用倾向(0-100,值越小越少用swap)
执行sudo sysctl -p使配置生效。
编辑/etc/security/limits.conf文件,添加以下内容限制Oracle用户的资源使用:
oracle soft nproc 2047 # 用户进程数软限制
oracle hard nproc 16384 # 用户进程数硬限制
oracle soft nofile 1024 # 用户打开文件数软限制
oracle hard nofile 65536 # 用户打开文件数硬限制
编辑/etc/sysctl.conf文件,添加以下参数以提升Oracle的I/O性能:
vm.aio-max-nr = 1048576 # 异步I/O最大请求数
执行sudo sysctl -p使配置生效。
Oracle内存管理主要分为自动内存管理(AMM)、自动共享内存管理(ASMM)和手动内存管理三种模式,以下是具体配置步骤:
AMM模式下,Oracle自动分配SGA与PGA的内存,无需单独设置SGA组件。
ALTER SYSTEM SET memory_target = 16G SCOPE=SPFILE; -- 总内存目标(SGA+PGA)
ALTER SYSTEM SET memory_max_target = 32G SCOPE=SPFILE; -- 最大允许内存
ALTER SYSTEM SET sga_target = 0 SCOPE=SPFILE; -- 关闭SGA单独管理
ALTER SYSTEM SET sga_max_size = 0 SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target = 0 SCOPE=SPFILE; -- 关闭PGA单独管理
SHUTDOWN IMMEDIATE;
STARTUP;
SHOW PARAMETER TARGET; -- 查看memory_target、memory_max_target等参数
SELECT * FROM V$MEMORY_DYNAMIC_COMPONENTS; -- 查看内存组件动态变化
ASMM模式下,Oracle自动管理SGA内的组件(如共享池、缓冲区缓存),但需单独设置SGA总大小和PGA大小。
ALTER SYSTEM SET sga_target = 8G SCOPE=SPFILE; -- SGA总大小
ALTER SYSTEM SET sga_max_size = 8G SCOPE=SPFILE; -- SGA最大大小
ALTER SYSTEM SET shared_pool_size = 2G SCOPE=SPFILE; -- 共享池大小(可选,ASMM下可自动调整)
ALTER SYSTEM SET db_cache_size = 4G SCOPE=SPFILE; -- 数据库缓冲区缓存大小(可选)
ALTER SYSTEM SET pga_aggregate_target = 2G SCOPE=SPFILE; -- PGA总大小
SHUTDOWN IMMEDIATE;
STARTUP;
SHOW PARAMETER SGA_TARGET;
SHOW PARAMETER PGA_AGGREGATE_TARGET;
SELECT * FROM V$SGAINFO; -- 查看SGA组件详情
SELECT * FROM V$PGA_AGGREGATE_TARGET_ADVICE; -- 查看PGA使用建议
手动模式下,需单独设置SGA的每个组件(如缓冲区缓存、共享池)和PGA的大小,适合对内存分配有精细需求的场景。
ALTER SYSTEM SET db_cache_size = 4G SCOPE=SPFILE; -- 数据库缓冲区缓存
ALTER SYSTEM SET shared_pool_size = 2G SCOPE=SPFILE; -- 共享池
ALTER SYSTEM SET large_pool_size = 200M SCOPE=SPFILE; -- 大池(可选)
ALTER SYSTEM SET java_pool_size = 200M SCOPE=SPFILE; -- Java池(可选)
ALTER SYSTEM SET sort_area_size = 10M SCOPE=SPFILE; -- 排序区大小(可选)
ALTER SYSTEM SET hash_area_size = 5M SCOPE=SPFILE; -- 哈希区大小(可选)
SHUTDOWN IMMEDIATE;
STARTUP;
SHOW PARAMETER DB_CACHE_SIZE;
SHOW PARAMETER SORT_AREA_SIZE;
SELECT * FROM V$BUFFER_POOL_STATISTICS; -- 查看缓冲区缓存命中率
SELECT * FROM V$SORT_SEGMENT; -- 查看排序段使用情况
大页可减少内存碎片、提高内存访问效率,适合大内存服务器。
grep -E 'hugepages|Hugepagesize' /proc/meminfo
/etc/sysctl.conf文件,添加以下内容:vm.nr_hugepages = 2048 # 根据SGA大小调整(每页2MB,2048页=4GB)
vm.hugetlb_shm_group = 54321 # Oracle用户组ID(通过id -g oracle获取)
sudo sysctl -p
hugetlb组(需提前创建):sudo usermod -aG hugetlb oracle
SELECT * FROM V$SGAINFO;SELECT * FROM V$PGA_AGGREGATE_TARGET_ADVICE;SELECT * FROM V$MEMORY_DYNAMIC_COMPONENTS;DBMS_WORKLOAD_REPOSITORY包生成AWR报告,识别内存瓶颈(如共享池命中率低、缓冲区缓存命中率低)。vm.swappiness参数控制)。