【Oracle数据库指南】第16篇:Oracle连接模式与内存管理——专用服务器、共享服务器与AMM
本文详细解析Oracle数据库的两种连接模式(专用服务器和共享服务器)及内存管理机制。专用服务器模式为每个连接分配独立进程,适合长连接场景;共享服务器模式通过调度进程复用服务进程,适合高并发短连接。文章还深入讲解Oracle 11g的自动内存管理(AMM)和自动共享内存管理(ASMM)的配置方法,包括参数设置、内存分配策略和性能调优建议,帮助DBA根据实际需求选择最优配置方案。
上一篇【第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#';
六、最佳实践与总结
- 连接模式选择:大多数现代应用(尤其是Web应用)使用连接池+专用服务器模式;只有连接数极多且连接时间极短时才考虑共享服务器模式
- AMM优先:Oracle 11g及以上优先使用AMM,大幅降低内存调优复杂度
- 设置最小保证值:使用AMM时,为关键组件设置最小值,防止Oracle在高负载下过度压缩某个组件
- 监控内存使用趋势:定期查看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
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)