上一期发布了关于oracle数据库安装后的参数优化文档,此文档只给出了参考指引,没有给出对应的设置规则,接下来几期文档将详细的写写配置规则相关的给大家参考,这里列举依然是常规设置,实际项目中还是需要根据实际情况灵活调整。
前两期也分享了内存参数相关的优化,本期继续分享进程与会话参数相关部分,主要是
PROCESSES和SESSIONS参数。
注意:所有内存参数的修改都应在测试环境充分验证后再应用于生产环境,避免因内存分配不当导致数据库性能问题或实例无法启动。
重要提示:不同Oracle版本可能存在差异,生产环境调整前请务必查阅对应版本的官方文档并进行测试。所有修改操作前请做好参数文件备份
-- 创建PFILE备份 CREATE PFILE='/backup/initORCL_20231201.ora' FROM SPFILE; -- 直接复制SPFILE(需要数据库关闭) -- 在操作系统层面复制 -- cp $ORACLE_HOME/dbs/spfileORCL.ora /backup/
Oracle数据库进程与会话参数优化设置指南
1. 核心概念解析
1.1 PROCESSES参数
- 定义:
PROCESSES参数指定了同时连接到Oracle数据库实例的操作系统进程数量上限。 - 范围:包括后台进程(如数据库写入进程、日志写入进程等)和服务器进程(为用户会话服务的进程)。
- 重要性:当需要启动新的进程而当前进程数已达到此参数设置的上限时,Oracle会返回 "ORA-00020: maximum number of processes (number) exceeded" 错误。
1.2 SESSIONS参数
- 定义:
SESSIONS参数定义了一个Oracle数据库实例中允许同时存在的最大会话数量。 - 范围:每个登录到数据库的用户都会建立一个会话,因此此参数实际上决定了数据库的最大并发用户数。
- 重要性:当活动会话数达到此参数限制时,新的会话连接尝试将导致 "ORA-00018: maximum number of sessions exceeded" 错误。
1.3 进程与会话的关系
- 通常,
SESSIONS的值会大于PROCESSES的值,因为一个后台进程可能同时服务多个会话。 SESSIONS参数是一个派生值,通常基于PROCESSES参数的值通过特定公式计算得出。- 当数据库连接资源耗尽时,客户端可能会收到 "ORA-12519, TNS:no appropriate service handler found" 错误。
2. 版本差异与计算公式
不同Oracle版本中,SESSIONS 参数的计算公式有所变化,具体如下:
| Oracle 版本 | SESSIONS 计算公式 | 说明 |
|---|---|---|
| Oracle 10g, 11gR1 | SESSIONS = (1.1 * PROCESSES) + 5 |
早期版本的默认计算公式 |
| Oracle 11gR2, 18c, 19c | SESSIONS = (1.5 * PROCESSES) + 22 |
11gR2及以后版本的默认公式 |
注意事项:
- 如果当前
SESSIONS值大于计算值,则可能保持当前值;如果小于计算值,则SESSIONS会取计算值。即SESSIONS通常取MAX(当前值, 计算值)。 - 虽然可以手动设置
SESSIONS参数,但Oracle官方建议不要将其设置为低于默认计算值的值。
3. 参数设置操作指南
3.1 查询当前参数值
在进行任何修改前,首先需要查询当前的参数设置。
-- 查看当前PROCESSES参数值
SELECT value FROM v$parameter WHERE name = 'processes';
-- 或
SHOW PARAMETER processes;
-- 查看当前SESSIONS参数值
SELECT value FROM v$parameter WHERE name = 'sessions';
-- 或
SHOW PARAMETER sessions;
-- 查看当前活跃进程数
SELECT count(*) FROM v$process;
-- 查看当前活跃会话数
SELECT count(*) FROM v$session;
注意:查询参数时,V$PARAMETER 反映的是当前会话中生效的参数值,而 V$SYSTEM_PARAMETER 反映的才是实例级别的初始化参数。要获取系统启动参数,应使用 V$SYSTEM_PARAMETER。
3.2 计算与规划示例
场景:规划一个预计高峰时段并发用户为500人的Oracle 19c数据库系统参数。
-- 步骤1:计算PROCESSES参数
-- 高峰并发用户数 = 500
-- 后台进程数 ≈ 40(典型Oracle数据库后台进程)
-- 安全余量 ≈ 20%
-- 推荐PROCESSES = (500 + 40) * 1.2 = 648 ≈ 650
-- 步骤2:计算SESSIONS参数(19c使用新公式)
-- SESSIONS = (1.5 * PROCESSES) + 22
-- SESSIONS = (1.5 * 650) + 22 = 997 ≈ 1000
-- 最终设置:
-- PROCESSES = 650
-- SESSIONS = 1000
3.3 修改参数设置
重要:修改 PROCESSES 和 SESSIONS 参数必须重启数据库才能生效,且只能使用 SPFILE 方式进行修改。
-- 备份参数文件(重要!)
CREATE PFILE='/home/oracle/pfile_backup.ora' FROM SPFILE;
-- 修改PROCESSES参数
ALTER SYSTEM SET processes=650 SCOPE=SPFILE;
-- 修改SESSIONS参数
ALTER SYSTEM SET sessions=1000 SCOPE=SPFILE;
-- 重启数据库使更改生效
SHUTDOWN IMMEDIATE;
STARTUP;
关键注意事项:
- 务必在修改前备份参数文件,以防配置错误导致数据库无法启动。
- 在生产环境中,如果需要调整RAC环境的参数,可以逐个实例修改并分别重启,以减少服务中断时间。
PROCESSES参数不建议设置过大,因为数据库启动时会为每个进程预先分配内存结构,设置过大会导致启动失败或资源浪费。
3.4 ASM环境的特殊设置
对于ASM(Automatic Storage Management)实例,PROCESSES 参数的设置有所不同:
-- 当数据库实例数量 n < 10 时:
PROCESSES = 50 * n + 50
-- 当数据库实例数量 n >= 10 时:
PROCESSES = 10 * n + 450
Oracle官方通常不建议修改ASM实例的 PROCESSES 参数,除非存在多个数据库实例。
4. 性能优化与问题诊断
4.1 参数优化建议
监控与规划:
- 定期监控
V$PROCESS和V$SESSION视图,了解系统的实际使用情况。 - 根据监控数据和高并发时段的资源使用情况调整参数设置。
- 定期监控
容量规划:
- 设置
PROCESSES参数时,应考虑高峰时段的并发需求,并增加约20-50%的余量。 - 对于OLTP系统,需要预留更多的进程和会话资源。
- 设置
连接池优化:
- 对于Web应用,使用数据库连接池可以有效减少实际需要的数据库会话数。
- 调整应用服务器的连接池配置,避免创建过多并发连接。
4.2 常见问题与解决方案
问题1:遇到 "ORA-12519, TNS:no appropriate service handler found" 错误。
解决方案:
-- 1. 检查当前会话和进程使用情况
SELECT * FROM v$resource_limit WHERE resource_name IN ('processes', 'sessions');
-- 2. 如果接近上限,考虑增加PROCESSES和SESSIONS参数
-- 3. 或者检查应用连接池配置,确保连接被正确释放
问题2:数据库连接数达到上限,无法正常连接。
解决方案:
-- 1. 强制清理部分空闲会话(如有权限)
SELECT 'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''';'
FROM v$session
WHERE status = 'INACTIVE' AND last_call_et > 3600; -- 清理空闲超过1小时的会话
-- 2. 重启数据库(需要业务窗口)
-- 3. 临时增加参数值(需重启)
问题3:如何预防连接数耗尽问题。
解决方案:
- 设置监控告警,当会话和进程使用率超过80%时发出警告。
- 定期分析会话趋势,提前规划容量扩展。
- 优化应用程序,确保数据库连接及时关闭,避免连接泄漏。
5. 其他参数
SESSIONS_PER_USER:限制单个用户可以同时建立的最大会话数,防止资源被单一用户独占。
IDLE_TIME:设置在终止会话之前,允许会话保持空闲状态的最大分钟数。这有助于清理不活动的连接,释放系统资源。
-- 示例:设置默认配置文件的空闲时间限制为30分钟 ALTER PROFILE default LIMIT idle_time 30;USE_LARGE_PAGES:对于SGA较大(例如超过10GB)或高并发会话的环境,Oracle官方强烈建议启用HugePages(大页)以减少内存管理开销,提升性能。设置
USE_LARGE_PAGES=ONLY可以强制使用大页。-- 启用大页,并禁用与HugePages不兼容的AMM ALTER SYSTEM SET memory_target=0 SCOPE=spfile; ALTER SYSTEM SET use_large_pages=ONLY SCOPE=spfile;在高并发会话的环境中,内存管理至关重要。
OPEN_CURSORS:指定每个会话可以同时打开的最大游标数。如果应用存在游标泄漏或复杂查询,可能需要适当调高此值。




