oracle 12c切换容器及查询当前容器
刚开始学习12C,很多地方用着都不是很顺手,特别是PDB,感觉特别扭,可能是刚开始学还没学到PDB带来的好处吧,这里总结下怎么查看当前在哪个容器、怎么切换容器的一些基础命令。
在12C的CONNECT角色里,多出一个SET CONTAINER权限,这个权限用来控制是否可以通过SET CONTAINER来切换容器。
SQL> select GRANTEE,PRIVILEGE from dba_sys_privs where GRANTEE='CONNECT'; GRANTEE PRIVILEGE -------------------- -------------------- CONNECT SET CONTAINER CONNECT CREATE SESSION
在知道可以通过SET CONTAINER来切换容器之前,我都是通过TNS的方法来切换容器。
[oracle@dbdream ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.1.0 Production on Fri Aug 16 02:28:46 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> select con_id,dbid,NAME,OPEN_MODE from v$pdbs; CON_ID DBID NAME OPEN_MODE ---------- ---------- ---------- -------------------- 2 4063594514 PDB$SEED READ ONLY 3 1587020587 STREAM READ WRITE 4 676818932 WIND READ WRITE SQL> conn dbdream/dbdream@localhost/stream Connected. SQL> show con_name CON_NAME ------------------------------ STREAM
下面在看下用SET CONTAINER来切换容器。
[oracle@dbdream ~]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.1.0 Production on Fri Aug 16 02:35:57 2013 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> alter session set container=wind; Session altered. SQL> show con_name CON_NAME ------------------------------ WIND
这样就切换过去了,而且用的是切换前登录数据库的用户(sys)。
SQL> show user USER is "SYS"
PDB和PDB之间是不可以用SET CONTAINER的方式切换的。我的wind、stream两个PDB中都存在wind用户,密码也一样,下面测试下用wind用户从wind容器切换到stream容器。
SQL> conn wind/wind@localhost/wind Connected. SQL> alter session set container=stream; ERROR: ORA-01031: insufficient privileges
PDB和PDB之间切换我只知道可以用TNS的方式,SET CONTAINER的方式只能是PDB和CDB之间切换,而且要求切换的用户在PDB和CDB都存在,这也就是说只有在CDB中创建的用户(COMM USER)才可以用SET CONTAINER方式切换容器(系统用户除外),因为在CDB中创建的用户以C##开头,并且在每个PDB中都可以看到CDB中创建的用户(COMM USER),而PDB中创建的用户(LOCAL USER)只能在当前PDB中看到,还不能以C##开头,那就只有COMM USER才可以用SET CONTAINER的方式切换容器了(系统用户除外),太局限了。
上文总结了怎样切换容器,在记录下怎么查看当前在哪个容器,从上文可以看到可以用show con_name的方式很方便的看到当前在哪个容器里,还可以用SYS_CONTEXT函数来查看。
SQL> SELECT SYS_CONTEXT ('USERENV', 'CON_NAME') FROM DUAL; SYS_CONTEXT('USERENV','CON_NAME') -------------------------------------------------------------------------------- WIND SQL> conn sys/oracle@localhost/dbdream as sysdba Connected. SQL> SELECT SYS_CONTEXT ('USERENV', 'CON_NAME') FROM DUAL; SYS_CONTEXT('USERENV','CON_NAME') -------------------------------------------------------------------------------- CDB$ROOT
这两种方法功能相同,但是show con_name的方式要少敲好几个单词,我比较喜欢。
小结:
切换容器:
TNS的方式比较实用,不但可以实现CDB和PDB之间的切换,还可以实现PDB与PDB之间的切换,并且可以在切换时直接切换用户。
SET CONTAINER方式切换容器只能是CDB与PDB之间切换,而且只能使用COMM USER(系统用户除外),范围比较局限。
查看当前容器:
show con_name相对简单,单次比较好记,不容易忘记。SYS_CONTEXT函数相对麻烦些,时间长不用可能会忘记。