oracle12c 多租户环境,有2种用户:公用用户(Common User)和本地用户(Local User)。 多租户环境中,CDB Common User和 application common users可以访问其各自的容器,而本地用户(Local User)只用于特定于PDB。
CDB普通用户在CDB根目录中定义,并且可以访问CDB内的所有PDB,包括应用程序根目录及其应用程序PDB。应用程序普通用户在应用程序根目录中定义,并且可以访问属于应用程序容器的PDB。CDB PDB或应用程序PDB中的本地用户只能访问本地用户所在的PDB。
oracle 12c 有CDB公共用户和Application公共用户两种公共用户 CDB公共用户是在CDB root下创建的用户,在CDB root、每个现有的或者未来创建的PDB和Application root中都存在唯一标识和密码。CDB公共用户既可以是Oracle提供的也可以自己创建,例如SYS和SYSTEM就是Oracle提供的公共用户,它们具有DBA权限,可以连接整个CDB环境。 自己创建的CDB公共用户的用户名必须以C##或c##开头。每个CDB公共用户可以在不同的PDB中拥有不同的权限,例如创建一个用户c##test,只赋予它连接PDB1的权限而不赋予连接PDB2的权限。 Application公共用户是在Application root下创建的用户,它只在Application容器中是公用的。换句话说,Application公共用户无法CDB公共用户那样,能够连接整个CDB环境。Application公共用户负责创建、打开、关闭、插拔和删除Application PDB。
[oracle@esbqasdb ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Fri Apr 9 04:45:28 2021
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 ESBQASPDB READ WRITE NO
SQL> create user C##test identified by test;
User created.
###链接pdb
SQL> conn C##test/test@192.168.52.128:1521/ESBQASPDB
ERROR:
ORA-01045: user C##TEST lacks CREATE SESSION privilege; logon denied
###连接cdb root
SQL> conn C##test/test@192.168.52.128:1521/esbqas
ERROR:
ORA-01045: user C##TEST lacks CREATE SESSION privilege; logon denied
###授权链接CDB$ROOT权限并验证
SQL> conn / as sysdba
Connected.
SQL> grant create session to C##test container=current;
Grant succeeded.
SQL> conn C##test/test@192.168.52.128:1521/esbqas
Connected.
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
###链接未授权的pdb
SQL> conn C##test/test@192.168.52.128:1521/ESBQASPDB
ERROR:
ORA-01045: user C##TEST lacks CREATE SESSION privilege; logon denied
###授权pdb(container=all或者container=pddname),并验证链接
SQL> conn / as sysdba
Connected.
SQL> grant create session to C##test container=all;
Grant succeeded.
SQL> conn C##test/test@192.168.52.128:1521/ESBQASPDB
Connected.
创建Application容器的同时,创建Application Common User apptest,与CDB公共用户不同的是用户名不需要c##开头。
[root@esbqasdb ~]# mkdir -pv /oracle/u01/app/oracle/oradata/esbqas/apptest
mkdir: created directory ‘/oracle/u01/app/oracle/oradata/esbqas/apptest’
[root@esbqasdb ~]# chown oracle:oinstall !$
chown oracle:oinstall /oracle/u01/app/oracle/oradata/esbqas/apptest
#########下面数据库操作
SQL> conn / as sysdba
SQL> alter system set db_create_file_dest='/oracle/u01/app/oracle/oradata/esbqas/apptest';
System altered.
SQL> create pluggable database apptest as application container admin user apptest identified by apptest;
Pluggable database created.
SQL> column PDB_NAME format a40
#######通过视图dba_pdbs.application_root字段查看是否是Application root
SQL> select pdb_id,pdb_name,status,application_root,application_pdb from dba_pdbs;
PDB_ID PDB_NAME STATUS APP APP
---------- ---------------------------------------- ---------- --- ---
3 ESBQASPDB NORMAL NO NO
2 PDB$SEED NORMAL NO NO
4 APPTEST NEW YES NO
[oracle@esbqasdb ~]$ sqlplus apptest/apptest@192.168.52.128:1521/apptest
SQL> show con_name
CON_NAME
------------------------------
APPTEST
SQL> conn C##test/test@192.168.52.128:1521/apptest
Connected.
SQL> show con_name
CON_NAME
------------------------------
APPTEST
SQL> conn apptest/apptest@192.168.52.128:1521/ESBQASPDB
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
总结CDB公共用户(有create session权限)可以连接任意容器;application 公共用户可以连接application内容器;CDB公共用户前缀是c##或C##。
在独立的pdb内部创建,只有在这个pdb中有权限。
SQL> alter session set container=ESBQASPDB;
Session altered.
SQL> create user testss identified by 123456;
User created.
SQL> grant create session to testss;
Grant succeeded.
SQL> conn testss/123456@192.168.52.128:1521/ESBQASPDB
Connected.