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. 最佳实践

  1. 生产用 CMAN:大规模连接场景
  2. 防火墙场景用 CMAN:网络隔离
  3. 启用 Multiplexing:减少连接数
  4. 严格规则:仅允许必要访问
  5. 多 CMAN 高可用:避免单点
  6. 监控 CMAN 日志:发现异常
  7. 定期审查规则:业务变化调整
  8. 合理 MAXIMUM_RELAYS:避免资源耗尽
  9. LOG_LEVEL 生产用 1:平衡日志量
  10. 与 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