首页 > 数据库 > Oracle > Oracle中建立到CDB和PDB的连接
适用范围
适用于Oracle 19c CDB架构
方案概述
在CDB架构下,我们要对CDB和PDB进行管理维护,首先要连接进来。
一、默认服务
CDB成功创建后,与非CDB架构相比会创建一些新的对象和组件。
--连接到CDB中检查serviceSELECT name, pdb FROM cdb_services; SYS@cdb19c(CDB$ROOT)> show con_name CON_NAME ------------------------------ CDB$ROOT SYS@cdb19c(CDB$ROOT)> SELECT PDB, NETWORK_NAME, CON_ID FROM CDB_SERVICES WHERE PDB IS NOT NULL ORDER BY PDB; PDB NETWORK_NAME CON_ID --------------- -------------------- ---------- CDB$ROOT 1 CDB$ROOT 1 CDB$ROOT cdb19cXDB 1 CDB$ROOT cdb19c 1 HRPDB hrpdb 3 RCATPDB RCATPDB 6 6 rows selected. SYS@cdb19c(CDB$ROOT)> SYS@cdb19c(CDB$ROOT)> SELECT PDB, NETWORK_NAME, CON_ID FROM V$SERVICES WHERE PDB IS NOT NULL ORDER BY PDB; PDB NETWORK_NAME CON_ID --------------- -------------------- ---------- CDB$ROOT 1 CDB$ROOT cdb19cXDB 1 CDB$ROOT cdb19c 1 CDB$ROOT 1 HRPDB hrpdb 3 RCATPDB rcatpdb 6 6 rows selected. SYS@cdb19c(CDB$ROOT)>--切换到PDB中检查serviceSYS@cdb19c(CDB$ROOT)> SELECT PDB, NETWORK_NAME, CON_ID FROM CDB_SERVICES WHERE PDB IS NOT NULL ORDER BY PDB; PDB NETWORK_NAME CON_ID --------------- -------------------- ---------- HRPDB hrpdb 3 SYS@cdb19c(CDB$ROOT)> SELECT PDB, NETWORK_NAME, CON_ID FROM V$SERVICES WHERE PDB IS NOT NULL ORDER BY PDB; PDB NETWORK_NAME CON_ID --------------- -------------------- ---------- HRPDB hrpdb 3 SYS@cdb19c(CDB$ROOT)> SYS@cdb19c(CDB$ROOT)> 关闭PDB service 在cdb_service查询不到该PDB对应的服务名了,v$service中还可以查到。 SYS@cdb19c(CDB$ROOT)> SELECT PDB, NETWORK_NAME, CON_ID FROM CDB_SERVICES WHERE PDB IS NOT NULL ORDER BY PDB;SELECT PDB, NETWORK_NAME, CON_ID FROM CDB_SERVICES WHERE PDB IS NOT NULL ORDER BY PDB *ERROR at line 1: ORA-01219: database or pluggable database not open: queries allowed on fixed tables or views onlySYS@cdb19c(CDB$ROOT)> SELECT PDB, NETWORK_NAME, CON_ID FROM V$SERVICES WHERE PDB IS NOT NULL ORDER BY PDB; PDB NETWORK_NAME CON_ID --------------- -------------------- ---------- HRPDB hrpdb 3 SYS@cdb19c(CDB$ROOT)> SYS@cdb19c(CDB$ROOT)> conn / as sysdba Connected. Hello------------------------------------------------ Welcome! you are connected to CDB19C database CONNAME --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------CDB$ROOT SYS@cdb19c(CDB$ROOT)> SELECT PDB, NETWORK_NAME, CON_ID FROM CDB_SERVICES WHERE PDB IS NOT NULL ORDER BY PDB; PDB NETWORK_NAME CON_ID --------------- -------------------- ---------- CDB$ROOT 1 CDB$ROOT 1 CDB$ROOT cdb19cXDB 1 CDB$ROOT cdb19c 1 RCATPDB RCATPDB 6 SYS@cdb19c(CDB$ROOT)> SELECT PDB, NETWORK_NAME, CON_ID FROM V$SERVICES WHERE PDB IS NOT NULL ORDER BY PDB; PDB NETWORK_NAME CON_ID --------------- -------------------- ---------- CDB$ROOT 1 CDB$ROOT cdb19cXDB 1 CDB$ROOT cdb19c 1 CDB$ROOT 1 HRPDB hrpdb 3 RCATPDB rcatpdb 6 6 rows selected. SYS@cdb19c(CDB$ROOT)>
每个 PDB 都有一个默认服务。服务名必须在各个 CDB 中都是唯一的。当PDB关闭时cdb_services中将不能查询到该PDB的service。
二、创建服务
创建服务
如果数据库不是由 Oracle Restart 或 Oracle Clusterware 管理,可以使用 DBMS_SERVICE 程序包为每个 PDB 创建或修改服务。连接到当前执行操作的PDB中。
SQL> CONNECT system@hrpdb
SQL> EXECDBMS_SERVICE.CREATE_SERVICE('hrpdb','hrpdb')
SQL> EXEC DBMS_SERVICE.START_SERVICE
要为每个 PDB 创建或修改服务,还可以使用 Server Control 实用程序和 srvctl service 命令通过额外的属性 –pdb 指定 PDB 名:
$ srvctl add service -db mycdb -service hrpdb -pdb hrpdb
$ srvctl start service -db mycdb-service hrpdb
生产RAC环境如需要创建service,建议优先使用srvctl add service方式。
三、连接到CDB和PDB
1、基于OS认证的方式
–确认$ORACLE_SID环境变量
[oracle@19cdb01 ~]$ ps -ef|grep smon oracle 12645 1 0 Jun18 ? 00:00:00 ora_smon_cdb19c oracle 30959 29011 0 03:49 pts/0 00:00:00 grep --color=auto smon[oracle@19cdb01 ~]$ . oraenv ORACLE_SID = [cdb19c] ? The Oracle base remains unchanged with value /u01/app/oracle[oracle@19cdb01 ~]$ echo $ORACLE_SID cdb19c [oracle@19cdb01 ~]$
–以sysdba身份连接CDB
[oracle@19cdb01 ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 19 03:50:51 2026Version 19.27.0.0.0Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.27.0.0.0Hello------------------------------------------------Welcome! you are connected to CDB19C databaseCONNAME--------------------------------------------------------------------------------CDB$ROOTSYS@cdb19c(CDB$ROOT)> show con_name CON_NAME------------------------------ CDB$ROOTSYS@cdb19c(CDB$ROOT)> --以sysdba身份连接到PDB设置环境变量ORACLE_PDB_SID [oracle@19cdb01 ~]$ export ORACLE_PDB_SID=hrpdb [oracle@19cdb01 ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 19 04:12:05 2026Version 19.27.0.0.0Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.27.0.0.0Hello------------------------------------------------Welcome! you are connected to CDB19C databaseCONNAME--------------------------------------------------------------------------------HRPDBSYS@cdb19c(HRPDB)>
2、EasyConnect方式
sqlplus username@hostname:portnumber/service_name
--检查hostname[oracle@19cdb01 ~]$ hostname 19cdb01 [oracle@19cdb01 ~]$--使用sys用户以sysdba身份连接连接到CDB[oracle@19cdb01 ~]$ sqlplus sys/<password>@19cdb01:1525/cdb19c as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 19 03:53:55 2026Version 19.27.0.0.0Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.27.0.0.0Hello------------------------------------------------Welcome! you are connected to CDB19C databaseCONNAME--------------------------------------------------------------------------------CDB$ROOTSYS@19cdb01:1525/cdb19c(CDB$ROOT)> show con_name CON_NAME ------------------------------ CDB$ROOT SYS@19cdb01:1525/cdb19c(CDB$ROOT)> --使用sys用户以sysdba身份连接连接到PDB [oracle@19cdb01 ~]$ sqlplus sys/<password>@19cdb01:1525/hrpdb as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 19 03:58:37 2026Version 19.27.0.0.0Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.27.0.0.0Hello------------------------------------------------Welcome! you are connected to CDB19C databaseCONNAME--------------------------------------------------------------------------------HRPDBSYS@19cdb01:1525/hrpdb(HRPDB)> show con_name CON_NAME ------------------------------ HRPDB SYS@19cdb01:1525/hrpdb(HRPDB)>
3、 tnsnames.ora 中的别名连接
检查tnsnames.ora文件
[oracle@19cdb01 ~]$ cat $ORACLE_HOME/network/admin/tnsnames.ora# tnsnames.ora Network Configuration File: /u01/app/oracle/product/19c/db_1/network/admin/tnsnames.ora# Generated by Oracle configuration tools.CDB19C = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 19cdb01)(PORT = 1525)) ) (CONNECT_DATA = (SERVICE_NAME = cdb19c) ) ) HRPDB= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 19cdb01)(PORT = 1525)) ) (CONNECT_DATA = (SERVICE_NAME = hrpdb) ) )--连接到CDB[oracle@19cdb01 ~]$ sqlplus sys/<password>@cdb19c as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 19 03:56:17 2026Version 19.27.0.0.0Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.27.0.0.0Hello------------------------------------------------Welcome! you are connected to CDB19C databaseCONNAME--------------------------------------------------------------------------------CDB$ROOTSYS@cdb19c(CDB$ROOT)> show con_name CON_NAME ------------------------------ CDB$ROOTSYS@cdb19c(CDB$ROOT)> --连接到PDB [oracle@19cdb01 ~]$ sqlplus sys/<password>@hrpdb as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 19 03:57:40 2026Version 19.27.0.0.0Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.27.0.0.0Hello------------------------------------------------Welcome! you are connected to CDB19C databaseCONNAME--------------------------------------------------------------------------------HRPDBSYS@hrpdb(HRPDB)> show con_name CON_NAME ------------------------------ HRPDBSYS@hrpdb(HRPDB)>
四、切换连接
CDB 管理员可以使用重新连接 CONNECT 或 ALTER SESSION SET CONTAINER 在容器之间切换,从而连接到 CDB 中的任意容器。例如,CDB 管理员可以在一个会话中连接到根,然 后在同一会话中切换到 PDBHR 容器。这要求用户是这两个容器的已知公用用户,并且拥 有系统权限 SET CONTAINER。使用 CONNECT 命令时,能以公用或本地用户身份进行连接。使用 ALTER SESSION SET CONTAINER 时,只能以授予新系统权限 SET CONTAINER 的公用用户身份进行连接。
--通过connect连接到PDB [oracle@19cdb01 ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 19 04:05:20 2026Version 19.27.0.0.0Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.27.0.0.0Hello------------------------------------------------Welcome! you are connected to CDB19C databaseCONNAME--------------------------------------------------------------------------------CDB$ROOTSYS@cdb19c(CDB$ROOT)> connect hr@hrpdb Enter password: --通过ALTER SESSION SET CONTAINER切换到PDB [oracle@19cdb01 ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Fri Jun 19 04:06:07 2026Version 19.27.0.0.0Copyright (c) 1982, 2024, Oracle. All rights reserved. Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.27.0.0.0Hello------------------------------------------------Welcome! you are connected to CDB19C databaseCONNAME--------------------------------------------------------------------------------CDB$ROOTSYS@cdb19c(CDB$ROOT)> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 HRPDB MOUNTED 6 RCATPDB READ WRITE NO SYS@cdb19c(CDB$ROOT)> alter session set container=hrpdb; Session altered. SYS@cdb19c(CDB$ROOT)> show con_name CON_NAME ------------------------------ HRPDB --通过CONNECT连接到CDB SYS@cdb19c(CDB$ROOT)> conn / as sysdba Connected. Hello ------------------------------------------------ Welcome! you are connected to CDB19C database CONNAME -------------------------------------------------------------------------------- CDB$ROOTSYS@cdb19c(CDB$ROOT)>
-the end-
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28373936/viewspace-3179628/ ,如需转载,请注明出处,否则将追究法律责任。