Oracle Connection Manager(CMAN)
Oracle Connection Manager(CMAN)
适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
Oracle Connection Manager(CMAN) 是 Oracle 提供的网络中间件[1]:
核心功能:
- 多路复用(Multiplexing):多个客户端通过一个连接
- 访问控制:防火墙功能
- 协议转换:不同协议间转换
- 连接池:减少数据库连接
典型场景:
- 大规模客户端连接
- 网络隔离(防火墙)
- 跨网络访问数据库
2. CMAN 架构
2.1 部署模式
+---------+ +---------+ +---------+ +---------+
| Client1 | | Client2 | | Client3 | | Client4 |
+---------+ +---------+ +---------+ +---------+
│ │ │ │
└──────────────┴──────────────┴──────────────┘
│
▼
+-------------------+
| CMAN Host |
| (Connection |
| Manager) |
+-------------------+
│
▼
+-------------------+
| Database Server |
+-------------------+
2.2 工作流程
1. 客户端连接到 CMAN(端口 1630)
2. CMAN 根据规则检查是否允许
3. 允许则建立 CMAN 与数据库的连接
4. 转发客户端与数据库的通信
5. 可多路复用多个客户端到一个连接
3. 安装与配置
3.1 安装
CMAN 是 Oracle Client 的一部分:
# 安装 Oracle Client(含 CMAN)
./runInstaller -silent -responseFile /tmp/client.rsp
# 或独立安装
./runInstaller -silent -responseFile /tmp/cman.rsp
3.2 配置文件
# cman.ora 位置
$ORACLE_HOME/network/admin/cman.ora
3.3 基本配置
# cman.ora
CMAN =
(ADDRESS=(PROTOCOL=TCP)(HOST=cman-host)(PORT=1630))
CMAN_PROFILE =
(PARAMETER_LIST=
(ASO_AUTHENTICATION=OFF)
(AUTHENTICATION_LEVEL=0)
(MAXIMUM_RELAYS=128)
(LOG_LEVEL=1)
(TRACING=NO)
(RELAY_STATISTICS=NO)
(SHOW_TNS_INFO=NO)
(USE_ASYNC_CALL=NO)
(REMOTE_ADMIN=FALSE)
)
CMAN_RULES =
(RULE_LIST=
(RULE=(SRC=dbclient*)(DST=dbserver)(SRV=orcl)(ACT=accept))
(RULE=(SRC=*)(DST=*)(SRV=*)(ACT=reject))
)
4. Profile 参数
4.1 常用参数
| 参数 | 说明 |
|---|---|
| ASO_AUTHENTICATION | 高级安全选项认证 |
| AUTHENTICATION_LEVEL | 认证级别 |
| MAXIMUM_RELAYS | 最大中继数 |
| LOG_LEVEL | 日志级别(0-4) |
| TRACING | 跟踪 |
| RELAY_STATISTICS | 中继统计 |
| SHOW_TNS_INFO | 显示 TNS 信息 |
| USE_ASYNC_CALL | 异步调用 |
| REMOTE_ADMIN | 远程管理 |
4.2 LOG_LEVEL
| 级别 | 说明 |
|---|---|
| 0 | 关闭 |
| 1 | 基本信息 |
| 2 | 详细信息 |
| 3 | 调试信息 |
| 4 | 详细调试 |
5. 规则配置
5.1 规则语法
(RULE=
(SRC=源IP/主机名) # * 通配符
(DST=目标IP/主机名)
(SRV=服务名)
(ACT=accept/reject) # 接受或拒绝
)
5.2 规则示例
CMAN_RULES =
(RULE_LIST=
# 允许特定客户端访问 orcl
(RULE=(SRC=192.168.1.0/24)(DST=dbserver)(SRV=orcl)(ACT=accept))
# 允许应用服务器访问 sales
(RULE=(SRC=app-server*)(DST=dbserver)(SRV=sales)(ACT=accept))
# 拒绝其他所有
(RULE=(SRC=*)(DST=*)(SRV=*)(ACT=reject))
)
5.3 规则匹配
- 按顺序匹配
- 第一个匹配的规则生效
- 默认拒绝所有
6. 启动与停止
6.1 启动
# 启动 CMAN
cmctl start -c CMAN
# 或交互式
cmctl
CMAN> administer -c CMAN
CMAN> startup
6.2 停止
# 停止
cmctl shutdown -c CMAN
# 交互式
CMAN> shutdown
6.3 状态
# 状态
cmctl show status -c CMAN
# 版本
cmctl show version -c CMAN
# 规则
cmctl show rules -c CMAN
7. 客户端配置
7.1 tnsnames.ora
# 通过 CMAN 连接
ORCL_CMAN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = cman-host)(PORT = 1630))
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = orcl))
(SOURCE_ROUTE = YES) # 必须启用
)
7.2 连接
sqlplus scott/tiger@orcl_cman
7.3 多跳连接
# 通过多个 CMAN
ORCL_MULTI =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = cman1)(PORT = 1630))
(ADDRESS = (PROTOCOL = TCP)(HOST = cman2)(PORT = 1630))
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = orcl))
(SOURCE_ROUTE = YES)
)
8. 多路复用
8.1 启用 Multiplexing
# cman.ora
CMAN_PROFILE =
(PARAMETER_LIST=
...
(MAXIMUM_RELAYS=128)
...
)
# 客户端 sqlnet.ora
USE_DEDICATED_SERVER_LISTENER = OFF
8.2 工作原理
多个客户端 ←→ CMAN ←→ 单个/少量数据库连接
- CMAN 维护多个客户端连接
- 通过少量数据库连接转发
- 减少数据库端进程数
9. 监控
9.1 CMAN 状态
cmctl show status -c CMAN
# 输出:
# Status: READY
# Up since: 21-JUL-2026 10:23:15
# Number of relays: 5
# Number of active connections: 12
9.2 连接信息
cmctl show connections -c CMAN
# 输出:
# Connection ID: 1
# Source: 192.168.1.100:54321
# Destination: dbserver:1521
# Service: orcl
# State: ESTABLISHED
9.3 日志
# CMAN 日志位置
$ORACLE_HOME/network/log/cman.log
# 实时查看
tail -f $ORACLE_HOME/network/log/cman.log
10. 高可用
10.1 多 CMAN
# 部署多个 CMAN
# tnsnames.ora
ORCL_HA =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = cman1)(PORT = 1630))
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = orcl))
(SOURCE_ROUTE = YES)
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = cman2)(PORT = 1630))
(ADDRESS = (PROTOCOL = TCP)(HOST = dbserver)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = orcl))
(SOURCE_ROUTE = YES)
)
)
10.2 CMAN 集群
- 多台 CMAN 主机
- 负载均衡
- 故障切换
11. 常见坑与排错
11.1 ORA-12537: TNS:connection closed
修复:
# 1. 检查 CMAN 状态
cmctl show status -c CMAN
# 2. 检查规则
cmctl show rules -c CMAN
# 3. 检查客户端 IP 是否在规则中
11.2 ORA-12533: TNS:illegal ADDRESS parameters
修复:
# 1. 检查 tnsnames.ora
# 2. 确认 SOURCE_ROUTE=YES
# 3. 检查地址顺序
11.3 CMAN 启动失败
修复:
# 1. 检查 cman.ora 语法
cat $ORACLE_HOME/network/admin/cman.ora
# 2. 检查端口占用
netstat -tln | grep 1630
# 3. 检查日志
cat $ORACLE_HOME/network/log/cman.log
11.4 规则不生效
修复:
# 1. 检查规则顺序
# 2. 重启 CMAN
cmctl shutdown -c CMAN
cmctl start -c CMAN
# 3. 验证规则
cmctl show rules -c CMAN
11.5 远程管理失败
修复:
# 1. 设置 REMOTE_ADMIN=TRUE
# cman.ora
CMAN_PROFILE =
(PARAMETER_LIST=
(REMOTE_ADMIN=TRUE)
...
)
# 2. 重启 CMAN
12. 最佳实践
- 生产用 CMAN:大规模连接场景
- 防火墙场景用 CMAN:网络隔离
- 启用 Multiplexing:减少连接数
- 严格规则:仅允许必要访问
- 多 CMAN 高可用:避免单点
- 监控 CMAN 日志:发现异常
- 定期审查规则:业务变化调整
- 合理 MAXIMUM_RELAYS:避免资源耗尽
- LOG_LEVEL 生产用 1:平衡日志量
- 与 Shared Server/DRCP 配合:最大化复用
13. 参考资料
[1] Oracle Database Net Services Administrator’s Guide 19c, “Oracle Connection Manager” https://docs.oracle.com/en/database/oracle/oracle-database/19/netag/oracle-connection-manager.html