上一篇【第15篇】Oracle后台进程详解——DBWR、LGWR、CKPT、SMON、PMON工作机制
下一篇【第17篇】Oracle逻辑与物理存储结构——表空间、段、区、数据块全解析


摘要

本文讲解Oracle数据库的两种连接模式(专用服务器模式和共享服务器模式)的工作原理、适用场景和配置方法,以及Oracle 11g的自动内存管理(AMM)和自动共享内存管理(ASMM)的配置与调优实践。


一、专用服务器模式(Dedicated Server)

1.1 工作原理

专用服务器(Dedicated Server)是Oracle的默认连接模式。每个用户连接都有一个专属的服务器进程,两者之间是一一对应的关系。

用户进程 → Oracle监听器 → 专用服务器进程(每个用户一个)
          (建立连接后,监听器不再参与通信)

专用服务器的特点

  • 每个连接独占一个服务器进程,进程数 = 连接数
  • UGA(用户全局区)存储在PGA中,每个进程私有
  • 适合连接数相对较少但每个连接持续时间较长的场景
-- 查看当前连接模式
SELECT server FROM v$session WHERE username IS NOT NULL;
-- DEDICATED:专用服务器
-- SHARED:共享服务器

-- 查看专用服务器进程数
SELECT COUNT(*) FROM v$session 
WHERE username IS NOT NULL AND server = 'DEDICATED';

-- 查看系统最大进程数限制
SHOW PARAMETER processes

-- 如果连接数接近processes限制,考虑:
-- 1. 增大processes参数(需重启)
-- 2. 使用连接池(如Oracle Connection Pool)
-- 3. 切换到共享服务器模式
ALTER SYSTEM SET processes = 500 SCOPE=SPFILE;

二、共享服务器模式(Shared Server / MTS)

2.1 工作原理

共享服务器(Shared Server,早期称为MTS—Multi-Threaded Server)使用调度进程(Dispatcher)分发用户请求,多个用户连接可以共享同一组服务器进程。

用户进程 → 调度进程(Dispatcher)→ 请求队列 → 共享服务器进程
                                              ↓
                                        处理完成→ 响应队列 → 用户进程
-- 配置共享服务器(需要重启才完全生效)
ALTER SYSTEM SET shared_servers = 5;       -- 最少5个共享服务器进程
ALTER SYSTEM SET max_shared_servers = 20;  -- 最多20个
ALTER SYSTEM SET dispatchers = '(PROTOCOL=TCP)(SERVICE=orcl)(DISPATCHERS=3)';
-- 3个TCP调度进程,服务名为orcl

-- 验证共享服务器配置
SHOW PARAMETER shared_servers
SHOW PARAMETER dispatchers

-- 查看调度进程状态
SELECT name, network, status, runtime_pct
FROM v$dispatcher;

-- 查看共享服务器进程
SELECT name, requests, responses, status
FROM v$shared_server;

-- 查看请求队列等待情况
SELECT network, queue, waited, totalq
FROM v$queue;

2.2 共享服务器 vs 专用服务器

特性 专用服务器 共享服务器
进程数 = 连接数 远少于连接数
适用场景 长连接、批处理 大量短连接(如Web应用)
UGA存储 PGA(私有) SGA的Large Pool
内存效率 低(每连接一个进程) 高(共享服务进程)
响应延迟 略高(需要队列调度)
连接池支持 好(Oracle Connection Pool) 需要调度进程支持
-- 共享服务器模式中,UGA存储在SGA的Large Pool中
-- 因此需要配置足够大的Large Pool
ALTER SYSTEM SET large_pool_size = 128M;

-- 禁用共享服务器(恢复到专用服务器模式)
ALTER SYSTEM SET shared_servers = 0;

三、自动内存管理(AMM)详细配置

3.1 AMM的工作原理

Oracle 11g的AMM(Automatic Memory Management)可以自动管理SGA和PGA的总量分配,无需手动设置各个组件的大小。

-- 前提条件:需要操作系统支持(Linux需要/dev/shm)
-- 检查/dev/shm大小(必须大于MEMORY_TARGET)
-- df -h /dev/shm

-- 启用AMM的步骤:
-- 1. 确认当前SGA和PGA的大小
SHOW PARAMETER sga_target
SHOW PARAMETER pga_aggregate_target

-- 2. 设置MEMORY_TARGET(SGA + PGA的总量)
-- 建议:MEMORY_TARGET ≈ sga_target + pga_aggregate_target
ALTER SYSTEM SET memory_target = 2G SCOPE=SPFILE;

-- 3. 设置MEMORY_MAX_TARGET(上限,建议比memory_target大20%)
ALTER SYSTEM SET memory_max_target = 2500M SCOPE=SPFILE;

-- 4. 禁用之前的手动设置(让AMM完全接管)
ALTER SYSTEM SET sga_target = 0 SCOPE=SPFILE;
ALTER SYSTEM SET pga_aggregate_target = 0 SCOPE=SPFILE;

-- 5. 重启数据库
SHUTDOWN IMMEDIATE;
STARTUP;

-- 验证AMM已启用
SHOW PARAMETER memory_target
SELECT component, current_size / 1024 / 1024 AS mb
FROM v$memory_dynamic_components
WHERE current_size > 0
ORDER BY current_size DESC;

3.2 AMM下的组件最小值设置

即使使用AMM,也可以为各组件设置最小保证值:

-- 设置组件最小值(AMM不会将组件缩小到此值以下)
ALTER SYSTEM SET db_cache_size = 512M;      -- Buffer Cache最小512M
ALTER SYSTEM SET shared_pool_size = 128M;   -- Shared Pool最小128M
ALTER SYSTEM SET large_pool_size = 32M;     -- Large Pool最小32M

-- 查看AMM自动分配的结果和最小值
SELECT component, 
       ROUND(current_size / 1024 / 1024, 2) AS current_mb,
       ROUND(min_size / 1024 / 1024, 2) AS min_mb,
       ROUND(max_size / 1024 / 1024, 2) AS max_mb
FROM v$memory_dynamic_components
WHERE current_size > 0
ORDER BY current_size DESC;

四、自动共享内存管理(ASMM)

如果操作系统不支持AMM(如某些Linux版本或Solaris不支持POSIX共享内存),可以使用ASMM:

-- ASMM:只管理SGA,PGA手动设置
-- 禁用AMM,启用ASMM
ALTER SYSTEM SET memory_target = 0 SCOPE=SPFILE;

-- 启用ASMM
ALTER SYSTEM SET sga_target = 1500M SCOPE=BOTH;    -- SGA总量,ASMM自动分配
ALTER SYSTEM SET pga_aggregate_target = 512M SCOPE=BOTH;  -- PGA手动设置

-- 查看ASMM对各SGA组件的分配
SELECT component, current_size / 1024 / 1024 AS mb
FROM v$sga_dynamic_components
WHERE current_size > 0;

-- 内存顾问报告(帮助确定最优SGA大小)
SELECT sga_size, sga_size_factor, estd_db_time, estd_db_time_factor
FROM v$sga_target_advice
ORDER BY sga_size;

五、连接池

无论使用哪种连接模式,Oracle Connection Pool或中间件连接池(如Apache DBCP、HikariCP)都是现代应用架构的重要组件:

-- 查看连接池相关统计
SELECT username, COUNT(*) AS session_count,
       SUM(DECODE(status, 'ACTIVE', 1, 0)) AS active_count,
       SUM(DECODE(status, 'INACTIVE', 1, 0)) AS inactive_count
FROM v$session
WHERE username IS NOT NULL
GROUP BY username
ORDER BY session_count DESC;

-- 终止闲置时间过长的会话(可以写成定时脚本)
SELECT sid, serial#, username, last_call_et / 60 AS idle_minutes
FROM v$session
WHERE username IS NOT NULL
AND status = 'INACTIVE'
AND last_call_et > 1800  -- 空闲超过30分钟
ORDER BY last_call_et DESC;

-- ALTER SYSTEM KILL SESSION 'sid,serial#';

六、最佳实践与总结

  1. 连接模式选择:大多数现代应用(尤其是Web应用)使用连接池+专用服务器模式;只有连接数极多且连接时间极短时才考虑共享服务器模式
  2. AMM优先:Oracle 11g及以上优先使用AMM,大幅降低内存调优复杂度
  3. 设置最小保证值:使用AMM时,为关键组件设置最小值,防止Oracle在高负载下过度压缩某个组件
  4. 监控内存使用趋势:定期查看v$memory_dynamic_components,了解Oracle的内存分配决策

上一篇【第15篇】Oracle后台进程详解——DBWR、LGWR、CKPT、SMON、PMON工作机制
下一篇【第17篇】Oracle逻辑与物理存储结构——表空间、段、区、数据块全解析


参考资料

  • 《Oracle 11g数据库管理员指南》— 刘宪军著
  • Oracle官方文档:Database Administrator’s Guide - Configuring Shared Servers
  • Oracle官方文档:Database Administrator’s Guide - Automatic Memory Management
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐