应用于:
Oracle 数据库 - Oracle 12cR1 12.1.0.1.0 Enterprise Edition
操作系统 – Oracle Linux 6.4,带有内核 2.6.39-400.109.17.1.el6uek.x86-64 和
Red Hat Enterprise Linux,带有内核 2.6.32-431.el6.x86_64
存储平台 - Dell EqualLogic PS 5000 和 Dell EqualLogic PS 6110
问题:
如何连接到 Oracle RAC 12cR1 中的可插拔数据库?
解决方案:
有四种方法可以建立与可插拔数据库 (PDB) 的连接。
- 使用与 pdb 名称同名的默认服务,此服务由数据库软件自动创建。
- 使用用户定义的服务,这些服务通过将其与可插拔数据库相关联的 SRVCTL 实用程序创建,并带有 pdb 属性
- 使用 alter session 命令并将容器设置为所需的容器
- 使用 Enterprise Manager Express
1. 使用默认服务连接至 PDB
要使用默认服务建立与 pdb 的连接,需要执行以下操作。
- 需要在定义数据库地址(允许建立与数据库的连接)的 tnsnames.ora 文件中创建一个条目。
- pdb 的状态需要从已安装更改为读写模式。
在 tnsnames.ora 文件中创建一个条目:
对于 Oracle RAC 12c,虽然与可插拔数据库名称同名的默认服务由数据库软件自动创建,但是,无论如何,tnsnames.ora 文件仅通过与全局数据库有关的单个条目生成。例如,对于双节点 Oracle RAC 12c,其中,cpdb 是全局数据库,pdb1 和 pdb2 是创建的两个可插拔数据库,而 cpdb1 和 cpdb2 是两个实例,tnsnames.ora 文件中的默认条目如下所示:
CPDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = OracleRACscan.dbase.lab)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = cpdb.dbase.lab)
)
)
因此,需要在 tnsnames.ora 文件中为可插拔数据库的默认服务名称创建相关条目,如下所示:
PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP) (HOST = OracleRACscan.dbase.lab)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1.dbase.lab)
)
)
PDB2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP) (HOST = OracleRACscan.dbase.lab)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb2.dbase.lab)
)
)
更改可插拔数据库的状态:
创建 pdbs 后,默认情况下,open_mode 仅为“已安装”。这可以按以下方式进行验证:
SQL> select name, open_mode from v$pdbs;
NAME OPEN_MODE
PDB$SEED READ ONLY
PDB1 MOUNTED
PDB2 MOUNTED
以下命令以读写模式打开所有可插拔数据库。
SQL>Alter pluggable database all open;
之后,
可以使用 sqlplus 建立与数据库的连接,如下所示:
[oracle@node1 bin]$ sqlplus sys/oracle@pdb1 as sysdba
SQL*Plus: Release 12.1.0.1.0 Production on Tue Oct 8 11:23:32 2013
Copyright (c) 1982, 2013, Oracle. All rights reserved.
连接到:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP, Advanced Analytics and Real Application Testing options
2.使用用户定义的服务连接到 PDB
上述默认服务应仅用于管理目的,不应用于应用程序。用户定义的服务应始终用于应用程序,因为用户定义的服务可以根据应用程序的要求进行定制。使用用户定义的服务建立连接涉及以下步骤:
- 使用 SRVCTL 实用程序创建具有 PDB 属性的数据库服务
- 在 tnsnames.ora 文件中为所创建的服务创建条目
- 启动服务
- 使用在步骤 a 中创建的带有 pdb 属性的服务连接到数据库
a. 使用 SRVCTL 实用程序创建具有 PDB 属性的数据库服务
使用 SRVCTL 实用程序的以下命令创建与可插拔数据库 pdb1 关联的两个数据库服务 hr1 和 sales1:
[[oracle@node1 bin]$ srvctl add service -db cpdb -service hr1 -pdb pdb1 -preferred cpdb1 -available cpdb2
[oracle@node1 bin]$ srvctl add service -db cpdb -service sales1 -pdb pdb1 -preferred cpdb1 -available cpdb2
可以从 data dictionary view all_services 查看 pdb 属性。
SQL>SELECT NAME, PDB FROM all_services;
NAME PDB
pdb1.dbase.lab PDB1
hr1 PDB1
sales1 PDB1
命令 $ srvctl config service –db<databasename> 还列出了可用服务。
b. 在 tnsnames.ora 文件中为所创建的服务创建条目
我们可以创建 hr 应用程序和 sales 应用程序可以分别使用的净服务名称 HR_PDB1 和 SALES_PDB1,以连接到可插拔数据库 pdb1,如下所示:
HR_PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = OracleRACscan.dbase.lab)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = hr1.dbase.lab)
)
)
SALES_PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = OracleRACscan.dbase.lab)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sales1.dbase.lab)
)
)
c. 启动服务
[oracle@nsnode1 bin]$ srvctl status service -db cpdb -service hr1
Service hr1 未运行
[oracle@nsnode1 bin]$ srvctl start service -db cpdb -service hr1
启动与 pdb 关联的服务会自动以读写模式打开 pdb。
d.连接到数据库服务
用户使用具有 pdb 属性的数据库服务连接到 pdb。
例如,SYS 用户可以使用与 pdb1 关联的数据库服务 HR_PDB1 连接到 pdb1,如下所示:
SQL> connect sys/oracle@HR_PDB1 AS SYSDBA
Connected.
SQL> SHOW CON_ID;
CON_ID
3
SQL> SHOW CON_NAME;
CON_NAME
PDB1
3.使用 Alter Session 命令连接至 PDB
默认情况下,当您连接到 RAC 实例时,您将连接到 CDB$ROOT。每个 RAC 实例将作为一个整体打开 PDB,系统将提供单个系统图像。当您想要将会话更改为 pdb 时,可以通过更改会话并将容器设置为所需的容器来执行此操作。查询 show con_name 可用于验证当前容器的名称。
[oracle@node1 bin]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.1.0 Production on Wed Oct 9 13:56:27 2013
Copyright (c) 1982, 2013, Oracle. All rights reserved.
连接到:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options
SQL> show con_name;
CON_NAME
CDB$ROOT
SQL> ALTER SESSION SET CONTAINER = PDB1;
Session altered.
SQL> SHOW CON_NAME;
CON_NAME
PDB1
SQL> ALTER SESSION SET CONTAINER = PDB2;
Session altered.
SQL> SHOW CON_ID;
CON_ID
4
SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;
Session altered.
SQL> SHOW CON_NAME;
CON_NAME
CDB$ROOT
容器 Id 说明如下:
容器 ID |
描述 |
0 |
整个 CDB |
1 |
CDB$ROOT |
2 |
PDB$SEED |
3 至 254 |
PDB |
表 1: 容器 Id 说明
在这个特定的示例中,是 con_id 3 represents pdb1 和 con_id 4 represents pdb2。
grid@node1 bin]$ echo $ORACLE_HOME
/u01/app/12.1.0/grid
[grid@node1 bin]$ echo $ORACLE_SID
+ASM1
[grid@node1 bin]$ sqlplus / as sysdba
SQL*Plus:Release 12.1.0.1.0 Production on Wed Oct 9 13:51:39 2013
Copyright (c) 1982, 2013, Oracle.保留所有权利。
连接到:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Real Application Clusters and Automatic Storage Management options
SQL> show con_id;
CON_ID
0
SQL> show con_name;
CON_NAME
Non Consolidated
4.使用 Enterprise Manager(EM) Express 连接至 PDB
当使用 Database Configuration Assistant (DBCA) 创建数据库时,完成时,EM Express 的 URL 由 DBCA 提供。URL 的格式为 http://<hostname>:portnumber/em,5500 是默认端口 ID。
在转到该 URL 以访问 EM Express 之前,您需要发出以下 SQL 语句以确认 EM Express 端口:
SQL> SELECT dbms_xdb_config.gethttpsport from dual;
GETHTTPSPORT
5500
如果输出如上所示,则可以通过 DBCA 连接到上面显示的 URL。
但如果输出为空,例如
GETHTTPSPORT
必须执行 PL/SQL 程序 DBMS_XDB_CONFIG.SETHTTPSPORT,设置 EM Express 设置 HTTPS 端口。例如:
SQL> exec dbms_xdb_config.sethttpsport(5500);
已成功完成 PL/SQL 流程。
在此之后,您可以尝试使用 URL 访问 EM Express。
HTTP 端口也可按如下所示为 EM Express 配置:
SQL> select dbms_xdb_config.gethttpport from dual;
SQL> exec dbms_xdb_config.sethttpport(8080);
要设置 pdbs 的 EM Express 端口,需要将容器更改为相应的 pdbs,并执行 PL/SQL 过程来设置该容器的端口。
完成后,可以检查 cpdb、pdb1 和 pdb2 的 HTTP 端口,如下所示:
SQL> select dbms_xdb_config.gethttpport from dual;
GETHTTPPORT
8080
SQL> alter session set container = pdb1;
Session altered.
SQL> select dbms_xdb_config.gethttpport from dual;
GETHTTPPORT
8081
SQL> alter session set container = pdb2;
Session altered.
SQL> select dbms_xdb_config.gethttpport from dual;
GETHTTPPORT
8082
提醒:如果您仍然无法连接到 EM Express URL,作为网格用户重新加载侦听器控件,然后重试。