堕落不振功业废,勤耕不辍日月新

oracle 12c的cdb、pdb简介

Oracle hailen 745℃

oracle 12c引入了多租户环境,允许一个数据库容器CDB承载多个可插拔数据库PDB,CDB全称为Container Database翻译为数据库容器,PDB全称为Pluggable Database翻译为可插拔数据库,在oracle 12c之前实例与数据库是一对一或者多对一的关系,而在oracle 12c之后实例与数据库可以实现一对多的关系,也就是一个CDB,多个PDB,这个其实如果大家有接触过mysql、sqlserver这类数据库,对于这个概念就很好理解了,摘要下官方文档关于CDB和PDB的关系图:

cdb、pdb

CDB组成:
root组件:也就是CDB$ROOT,存储着ORACLE提供的元数据库和common user,元数据比如oracle提供的pl/sql包的源代码,common user是指每个容器中都存在的用户
SEED组件:Seed又叫做PDB$SEED,这个是创建PDBS数据库的模板,不能在Seed中添加或者修改对应,这个基本类似于sql server的module数据库
PDBS组件:具体的PDB数据库

ROOT、Seed、PDB关系可以这么简单描述:ROOT(根)是一个容器,Seed(种子)是一个容器,每个PDB是一个容器。每个容器在CDB中都有一个独一无二的的ID和名称。

查看数据库是否为CDB
SQL> select name,cdb from v$database;

NAME      CDB
——— —
ORA12C    YES

YES表示该数据库是CDB,NO表示是NO_CDB(普通数据库)

查看对应的PDB名称:
SQL> show con_name;

CON_NAME
——————————
CDB$ROOT
SQL> select sys_context(‘userenv’,’con_name’) “Container DB” from dual;

Container DB
——————————————————————————–
CDB$ROOT

SQL> select con_id,dbid,name,open_mode from v$pdbs;

CON_ID       DBID NAME                           OPEN_MODE
———- ———- —————————— ———-
2 3962890709 PDB$SEED                       READ ONLY
3 2723517908 PDB1                           MOUNTED
4  369175303 PDB2                           MOUNTED

启动和关闭对应的PDBS
SQL> alter pluggable database pdb1 open;

Pluggable database altered.

SQL> select con_id,dbid,name,open_mode from v$pdbs;

CON_ID       DBID NAME                           OPEN_MODE
———- ———- —————————— ———-
2 3962890709 PDB$SEED                       READ ONLY
3 2723517908 PDB1                           READ WRITE
4  369175303 PDB2                           MOUNTED

SQL> alter pluggable database pdb1 close;

Pluggable database altered.

SQL> select con_id,dbid,name,open_mode from v$pdbs;

CON_ID       DBID NAME                           OPEN_MODE
———- ———- —————————— ———-
2 3962890709 PDB$SEED                       READ ONLY
3 2723517908 PDB1                           MOUNTED
4  369175303 PDB2                           MOUNTED

切换到对应的PDBS
SQL> alter session set container=pdb1;

Session altered.

SQL> alter database open;

Database altered.

SQL> select con_id,dbid,name,open_mode from v$pdbs;

CON_ID       DBID NAME                           OPEN_MODE
———- ———- —————————— ———-
3 2723517908 PDB1                           READ WRITE

查看cdb、pdb模式下数据文件、日志文件、undo tablespace、控制文件等变化:
切换到cdb$root下:
SQL>conn / as sysdba
SQL> select con_id,name from v$datafile order by con_id,name;

CON_ID NAME
———- —————————————————————————————————-
1 /oracle12c/app/oracle/oradata/ora12c/sysaux01.dbf
1 /oracle12c/app/oracle/oradata/ora12c/system01.dbf
1 /oracle12c/app/oracle/oradata/ora12c/undotbs01.dbf
1 /oracle12c/app/oracle/oradata/ora12c/users01.dbf
2 /oracle12c/app/oracle/oradata/ora12c/pdbseed/sysaux01.dbf
2 /oracle12c/app/oracle/oradata/ora12c/pdbseed/system01.dbf
3 /oracle12c/app/oracle/oradata/ora12c/pdb1/pdb1_users01.dbf
3 /oracle12c/app/oracle/oradata/ora12c/pdb1/sysaux01.dbf
3 /oracle12c/app/oracle/oradata/ora12c/pdb1/system01.dbf
4 /oracle12c/app/oracle/oradata/ora12c/pdb2/pdb2_users01.dbf
4 /oracle12c/app/oracle/oradata/ora12c/pdb2/sysaux01.dbf
4 /oracle12c/app/oracle/oradata/ora12c/pdb2/system01.dbf

12 rows selected.

SQL> select con_id,name from v$controlfile order by con_id,name;

CON_ID NAME
———- —————————————————————————————————-
0 /oracle12c/app/oracle/fast_recovery_area/ora12c/control02.ctl
0 /oracle12c/app/oracle/oradata/ora12c/control01.ctl
SQL> select con_id,member from v$logfile;

CON_ID MEMBER
———- —————————————————————————————————-
0 /oracle12c/app/oracle/oradata/ora12c/redo03.log
0 /oracle12c/app/oracle/oradata/ora12c/redo02.log
0 /oracle12c/app/oracle/oradata/ora12c/redo01.log

SQL> select con_id,name from v$tempfile;

CON_ID NAME
———- —————————————————————————————————-
1 /oracle12c/app/oracle/oradata/ora12c/temp01.dbf
2 /oracle12c/app/oracle/oradata/ora12c/pdbseed/pdbseed_temp012016-07-17_09-08-17-AM.dbf
3 /oracle12c/app/oracle/oradata/ora12c/pdb1/temp012016-07-17_09-08-17-AM.dbf
4 /oracle12c/app/oracle/oradata/ora12c/pdb2/temp012016-07-17_09-08-17-AM.dbf

这里可以看出CDB、PDB模式下,每个PDB都有自己的数据文件、临时文件,所有的PDB共享相同的日志文件、控制文件

[oracle@oracle12c ~]$ ls -l /oracle12c/app/oracle/product/12.1.0/dbhome_1/dbs
total 17576
-rw-rw—-. 1 oracle dba     1544 Jul 20 03:36 hc_ora12c.dat
-rw-r–r–. 1 oracle dba     2992 Feb  3  2012 init.ora
-rw-r—–. 1 oracle dba       24 Jun 25 13:12 lkORA12C
-rw-r—–. 1 oracle dba     7680 Jul 17 09:12 orapwora12c
-rw-r—–. 1 oracle dba 17973248 Jul 17 09:26 snapcf_ora12c.f
-rw-r—–. 1 oracle dba     3584 Jul 20 08:54 spfileora12c.ora

[oracle@oracle12c ~]$ ls -l /oracle12c/app/oracle/product/12.1.0/dbhome_1/network/admin/
total 20
-rw-r—–. 1 oracle dba  343 Jul  7 03:00 listener.ora
drwxr-xr-x. 2 oracle dba 4096 Jun 25 11:56 samples
-rw-r–r–. 1 oracle dba  373 Oct 31  2013 shrept.lst
-rw-r—–. 1 oracle dba  208 Jul  7 03:00 sqlnet.ora
-rw-r—–. 1 oracle dba  420 Jul 17 09:12 tnsnames.ora

[oracle@oracle12c ~]$ lsnrctl status

LSNRCTL for Linux: Version 12.1.0.2.0 – Production on 20-JUL-2016 08:59:47

Copyright (c) 1991, 2014, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle12c)(PORT=1521)))
STATUS of the LISTENER
————————
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.2.0 – Production
Start Date                20-JUL-2016 08:59:34
Uptime                    0 days 0 hr. 0 min. 12 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oracle12c/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
Listener Log File         /oracle12c/app/oracle/diag/tnslsnr/oracle12c/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle12c)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=oracle12c)(PORT=5500))(Security=(my_wallet_directory=/oracle12c/app/oracle/product/12.1.0/dbhome_1/admin/ora12c/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary…
Service “ora12c” has 1 instance(s).
Instance “ora12c”, status READY, has 1 handler(s) for this service…
Service “ora12cXDB” has 1 instance(s).
Instance “ora12c”, status READY, has 1 handler(s) for this service…
Service “pdb1” has 1 instance(s).
Instance “ora12c”, status READY, has 1 handler(s) for this service…
Service “pdb2” has 1 instance(s).
Instance “ora12c”, status READY, has 1 handler(s) for this service…
The command completed successfully

SQL> select name,con_Id from v$active_services order by 2;

NAME                                                                 CON_ID
—————————————————————- ———-
ora12cXDB                                                                 1
SYS$BACKGROUND                                                            1
SYS$USERS                                                                 1
ora12c                                                                    1
pdb1                                                                      3
pdb2                                                                      4

6 rows selected.

同样也只有一个spfile文件、控制文件快照、密码文件,监听程序会将所有的PDB对应的services注册到监听程序中,可以连接到cdb$root,也可以连接到指定的pdb

可以用os认证、ezconnect方式连接到cdb$root环境下:
SQL> conn / as sysdba
Connected.
SQL> show con_name;

CON_NAME
——————————
CDB$ROOT
SQL> conn sys/oracle@192.168.212.139:1521/ora12c as sysdba
Connected.
SQL> show con_name;

CON_NAME
——————————
CDB$ROOT

用ezconnect连接PDBS
SQL> conn sys/oracle@192.168.212.139:1521/pdb1 as sysdba
Connected.
SQL> show con_name;
CON_NAME
——————————
PDB1
SQL> conn sys/oracle@192.168.212.139:1521/pdb2 as sysdba
Connected.
SQL> show con_name;

CON_NAME
——————————
PDB2

创建pdb
SQL>conn / as sysdba
SQL> create pluggable database pdb3 admin user pdb_admin identified by password roles=(dba) file_name_convert=(‘/oracle12c/app/oracle/oradata/ora12c/pdbseed’,’/oracle12c/app/oracle/oradata/ora12c/pdb3′);

Pluggable database created.
SQL> select * from cdb_pdbs;

PDB_ID PDB_NAME         DBID    CON_UID GUID                             STATUS    CREATION_SCN        VSN LOGGING   FOR FOR     CON_ID
———- ———- ———- ———- ——————————– ——— ———— ———- ——— — — ———-
3 PDB1       2723517908 2723517908 37CB98E04474679CE0538BD4A8C07711 NORMAL         1741469  202375680 LOGGING   NO  NO           3
2 PDB$SEED   3962890709 3962890709 37CB7CA2D31D63D9E0538BD4A8C03C51 NORMAL         1594409  202375680 LOGGING   NO  NO           2
4 PDB2        369175303  369175303 37CB997769736856E0538BD4A8C08647 NORMAL         1742072  202375680 LOGGING   NO  NO           4
5 PDB3       2895601090 2895601090 3807F68447B4320DE0538BD4A8C05719 NEW            2000447  202375680 LOGGING   NO  NO           5

SQL> !lsnrctl status

LSNRCTL for Linux: Version 12.1.0.2.0 – Production on 20-JUL-2016 09:20:58

Copyright (c) 1991, 2014, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=oracle12c)(PORT=1521)))
STATUS of the LISTENER
————————
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.2.0 – Production
Start Date                20-JUL-2016 08:59:34
Uptime                    0 days 0 hr. 21 min. 24 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oracle12c/app/oracle/product/12.1.0/dbhome_1/network/admin/listener.ora
Listener Log File         /oracle12c/app/oracle/diag/tnslsnr/oracle12c/listener/alert/log.xml
Listening Endpoints Summary…
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle12c)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=oracle12c)(PORT=5500))(Security=(my_wallet_directory=/oracle12c/app/oracle/product/12.1.0/dbhome_1/admin/ora12c/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary…
Service “ora12c” has 1 instance(s).
Instance “ora12c”, status READY, has 1 handler(s) for this service…
Service “ora12cXDB” has 1 instance(s).
Instance “ora12c”, status READY, has 1 handler(s) for this service…
Service “pdb1” has 1 instance(s).
Instance “ora12c”, status READY, has 1 handler(s) for this service…
Service “pdb2” has 1 instance(s).
Instance “ora12c”, status READY, has 1 handler(s) for this service…
Service “pdb3” has 1 instance(s).
Instance “ora12c”, status READY, has 1 handler(s) for this service…
The command completed successfully

SQL> select name,con_id from v$active_services;

NAME                                                                 CON_ID
—————————————————————- ———-
pdb3                                                                      5
pdb2                                                                      4
pdb1                                                                      3
ora12cXDB                                                                 1
ora12c                                                                    1
SYS$BACKGROUND                                                            1
SYS$USERS                                                                 1

7 rows selected.

创建新的pdb后,监听程序也会自动将这个pdb的services注册到监听程序中

需要注意的是在数据库重新启动后PDB默认是mounted状态,需要手动将PDB open,也可以直接写database级别的trigger,在数据库每次启动后将所有的pdb open
SQL> conn / as sysdba
Connected.
SQL> startup force;
ORACLE instance started.

Total System Global Area 1644167168 bytes
Fixed Size                  2925024 bytes
Variable Size            1040191008 bytes
Database Buffers          587202560 bytes
Redo Buffers               13848576 bytes
Database mounted.
Database opened.
SQL> select open_mode from v$pdbs;

OPEN_MODE
———-
READ ONLY
MOUNTED
MOUNTED
MOUNTED
SQL> alter pluggable database all open;

Pluggable database altered.

修改pdb的名称
SQL> conn sys/oracle@192.168.212.139:1521/pdb3 as sysdba
Connected.
SQL> alter pluggable database pdb3 rename global_name to pdb_his;
alter pluggable database pdb3 rename global_name to pdb_his
*
ERROR at line 1:
ORA-65045: pluggable database not in a restricted mode

这里修改pdb的名称需要将对应的pdb open restricted模式下
SQL> alter pluggable database pdb3 close immediate;

Pluggable database altered.

SQL> alter pluggable database pdb3 open restricted;

Pluggable database altered.

SQL> alter pluggable database pdb3 rename global_name to pdb_his;

Pluggable database altered.

SQL> alter pluggable database close immediate;

Pluggable database altered.

SQL> alter pluggable database open;

Pluggable database altered.

创建用户:
SQL> conn / as sysdba
Connected.
SQL> select name,open_mode from v$pdbs;

NAME                           OPEN_MODE
—————————— ———-
PDB$SEED                       READ ONLY
PDB1                           READ WRITE
PDB2                           READ WRITE
PDB_HIS                        READ WRITE

在root中创建common user,用户必须以c##开头,在root中创建的用户会级联复制到所有的pdbs中,除了seed pdb
SQL> create user c##xiaoyu identified by xiaoyu container=all;

User created.

SQL> select username,common,con_id from cdb_users where username=’C##XIAOYU’;

USERNAME                                                                                                                         COM     CON_ID
——————————————————————————————————————————– — ———-
C##XIAOYU                                                                                                                        YES          1
C##XIAOYU                                                                                                                        YES          5
C##XIAOYU                                                                                                                        YES          3
C##XIAOYU                                                                                                                        YES          4

common user登陆到cdb$root和pdbs中
SQL> conn c##xiaoyu/xiaoyu;
ERROR:
ORA-01045: user C##XIAOYU lacks CREATE SESSION privilege; logon denied

Warning: You are no longer connected to ORACLE.
SQL> conn c##xiaoyu/xiaoyu@192.168.212.139:1521/pdb1
ERROR:
ORA-01045: user C##XIAOYU lacks CREATE SESSION privilege; logon denied

Warning: You are no longer connected to ORACLE.

登陆cdb$root给common user授权
SQL> conn / as sysdba
Connected.
SQL> grant dba to c##xiaoyu;

Grant succeeded.

SQL> conn c##xiaoyu/xiaoyu
Connected.

common user在cdb$root中权限默认并不级联到pdb中,需要在pdb中重新授权
SQL> conn c##xiaoyu/xiaoyu@192.168.212.139:1521/pdb1
ERROR:
ORA-01045: user C##XIAOYU lacks CREATE SESSION privilege; logon denied

Warning: You are no longer connected to ORACLE.

SQL> conn sys/oracle@192.168.212.139:1521/pdb1 as sysdba
Connected.
SQL> grant dba to c##xiaoyu;

Grant succeeded.
SQL> conn c##xiaoyu/xiaoyu@192.168.212.139:1521/pdb1
Connected.

当然还是跟授权的SQL语句有关,比如在授权时添加container=all,该全选则会级联到所有的pdbs中
SQL> conn / as sysdba
Connected.
SQL> grant dba to c##xiaoyu container=all;

Grant succeeded.

SQL> conn c##xiaoyu/xiaoyu@192.168.212.139:1521/pdb2
Connected.

删除pdb
SQL> drop pluggable database pdb_his including datafiles;
drop pluggable database pdb_his including datafiles
*
ERROR at line 1:
ORA-65025: Pluggable database PDB_HIS is not closed on all instances.

SQL> alter pluggable database pdb_his close immediate;

Pluggable database altered.

SQL> drop pluggable database pdb_his including datafiles;

Pluggable database dropped.

这里简单先介绍下cdb、pdb的概念和常规管理,后续会陆续推出一些cdb、pdb的简单应用的文章!

转载请注明:我是IT » oracle 12c的cdb、pdb简介

喜欢 (0)or分享 (0)