我们在多租户架构(multitenant architecture)环境中使用下面命令登录数据库时,一般默认是登录到CDB$ROOT下面。如下所示
$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Feb 6 15:10:16 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> show con_name;
CON_NAME
------------------------------
CDB$ROOT
SQL>
一般情况下,我们使用ALTER命令在容器间切换,如下所示:
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB2 READ WRITE NO
SQL> alter session set container=PDB1;
Session altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1 READ WRITE NO
SQL> alter session set container=PDB2;
Session altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
4 PDB2 READ WRITE NO
SQL>
那么多租户架构(multitenant architecture )下直接连接多租户PDB的方法有哪一些呢?下面简单总结了Oracle直接登录PDB的一些方法,希望对你有用。
1:使用环境变量ORACLE_PDB_SID
[oracle@kerrydb ~]$ export ORACLE_PDB_SID=PDB1
[oracle@kerrydb ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Feb 6 15:12:04 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1 READ WRITE NO
SQL>
注意:ORACLE_PDB_SID没有在公开的官方文档中找到描述,但是从MOS上有不少文档都有提及这个环境变量。例如如下链接文章:
Export ORACLE_PID_SID=PDBSID Connects To CBD$ROOT instead of PDB (Doc ID 2826170.1)
Performing bequeath direct connections to PDB as SYS and SYSTEM (Doc ID 2728684.1)
另外需要注意的是,这个环境变量是从Oracle 18c 开始支持的,Oracle 12下使用ORACLE_PDB_SID环境变量无效。
2:使用环境变量TWO_TASK
在Unix和Linux环境下,可以设置TWO_TASK环境变量,当用户连接数据库且没有指定服务名时,会自动利用TWO_TASK的设置作为环境变量连接数据库。使用环境变量TWO_TASK配置tnsnames.ora 的别名(alias_name), 并在监听服务正常的情况下,使用no-sys和sys密码的方式是可以登录的,但是 sqlplus / as sysdba这种认证方式是不允许的。
首先,在tnsname.ora中增加如下配置
PDB1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.9.98)(PORT = 15021))
)
(CONNECT_DATA =
(SERVICE_NAME = PDB1)
)
)
然后设置环境变量TWO_TASK
[oracle@kerrydb ~]$ export TWO_TASK=PDB1
[oracle@kerrydb ~]$ sqlplus sys/xxxxxx as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Feb 6 16:11:01 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1 READ WRITE NO
SQL>
当配置了TWO_TASK环境变量后,就无法使用操作系统验证来登录数据库了,会报“ORA-01017: invalid username/password; logon denied”的错误。如下所示:
[oracle@kerrydb ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Feb 6 16:12:17 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
ERROR:
ORA-01017: invalid username/password; logon denied
Enter user-name:
如果你要取消环境变量设置,可以使用下面命令设置:
unset TWO_TASK
在windows平台,可以用Windows环境下的变量LOCAL
set LOCAL=xxxx
3:使用TNS配置直接连接到PDB
使用TNS配置连接到PDB,这个比较简单,就是像上面例子,在tnsnames.ora中配置好tns,然后使用tns的网络别名登录PDB
[oracle@kerrydb ~]$ echo $TWO_TASK
PDB1
[oracle@kerrydb ~]$ unset TWO_TASK
[oracle@kerrydb ~]$ echo $TWO_TASK
[oracle@kerrydb ~]$ sqlplus sys/xxxx@PDB1 as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Feb 6 20:42:12 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
3 PDB1 READ WRITE NO
原文始发于微信公众号(DBA闲思杂想录):Oracle多租户环境直接登录PDB总结
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/228067.html