oracle rac中配置pdb多租户的核心是确保服务注册完整、实例绑定明确、状态同步;需用srvctl手动添加并启动服务,执行alter pluggable database open instances=all打开所有节点pdb,并配置客户端tnsnames.ora使用service_name与scan地址。
oracle rac 环境下配置多租户,核心不是“能不能”,而是“服务注册是否完整、实例绑定是否明确、状态是否同步”。pdb 本身不感知 rac,它依赖 cdb 实例层的服务路由和监听器注册;一旦漏配服务名或未在所有实例启用 pdb 自动打开,就会出现连接时断时续、ora-12514 或只连上部分节点的问题。
如何在 RAC 中为 PDB 创建并注册服务
RAC 下的 PDB 连接必须走 service_name,不能用 SID。监听器默认只注册 CDB 的全局服务(如 CDB1),不会自动注册 PDB 的服务——这需要手动创建并启动服务。
- 使用
srvctl在所有实例上添加服务(非 SQL):srvctl add service -d CDB1 -s SALES_PDB -r "CDB11,CDB12" -P BASIC -l PRIMARY -y AUTOMATIC -e SELECT -m BASIC -z 180 -w 5
其中-r指定运行该服务的实例列表(RAC 节点名),-e SELECT启用故障转移检测,-z是失败重试间隔(秒) - 启动服务:
srvctl start service -d CDB1 -s SALES_PDB
- 验证服务已注册到监听器:
lsnrctl status | grep -A 5 SALES_PDB
应看到类似Service "SALES_PDB" has 2 instance(s)的输出 - 确认服务在数据库内可见:
SELECT name, network_name, pdb FROM dba_services WHERE name = 'SALES_PDB';
注意network_name必须与客户端 tnsnames.ora 中配置的一致
为什么 PDB 在 RAC 中会“只在一个节点打开”
这是最常被忽略的坑:PDB 默认只在当前实例打开,RAC 多实例环境下,必须显式指定所有目标实例,否则 ALTER PLUGGABLE DATABASE OPEN 只影响当前连接的实例。
- 检查当前 PDB 在各实例的状态:
SELECT inst_id, con_id, open_mode, restricted FROM gv$pdbs WHERE name = 'SALES_PDB';
若某inst_id行为MOUNTED或空,则该节点未打开 - 在 CDB$ROOT 中,对所有实例批量打开(关键!):
ALTER PLUGGABLE DATABASE SALES_PDB OPEN INSTANCES=ALL;
不能省略INSTANCES=ALL,否则仅作用于当前实例 - 设置 PDB 开机自启(避免重启后失效):
ALTER PLUGGABLE DATABASE SALES_PDB SAVE STATE;
该命令将当前打开状态持久化到控制文件,RAC 所有节点重启后均按此状态恢复
tnsnames.ora 客户端配置要点
客户端连接串若仍用 SID(如 (SID=CDB1))或错误的 service_name,必然报 ORA-12514 或 ORA-12505。RAC + PDB 场景下,必须用带负载均衡/故障转移的 service 配置。
- 最小可用配置(含 TAF):
SALES_PDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = scan.example.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = SALES_PDB) (FAILOVER_MODE = (TYPE = SELECT)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5)) ) ) - 不要混用
SID和SERVICE_NAME;SERVICE_NAME值必须与srvctl add service中的-s参数完全一致(大小写敏感) - SCAN 地址是必须项,不能写单节点 VIP;否则无法实现跨节点透明路由
真正容易出问题的地方不在命令本身,而在于 RAC 的“多实例一致性”思维惯性——PDB 的状态、服务注册、监听器配置、客户端解析,四者必须全部对齐。少一个环节,连接就可能随机失败,且日志里未必直接报错,得逐层查 gv$pdbs、lsnrctl status、srvctl config service 和客户端 trace 才能定位。











