Oracle Multitenant Container Database是Oracle 12C引入的新个性,Multitenant Container Database (CDB),多租户容器数据库是指能够包容一个或者多个可插拔数据库的数据库,这个个性容许在CDB容器数据库中创立并且保护多个数据库,在CDB中创立的数据库被称为PDB,每个PDB在CDB中是互相独立存在的,在独自应用PDB时,与一般数据库无任何区别。**

CDB根容器数据库的次要作用就是包容所有相干的PDB的元数据,以及在CDB中对所有的PDB进行治理。

多租户环境的组成

· ROOT\
Root容器数据库,是CDB环境中的根数据库,在根数据库中含有主数据字典视图,其中蕴含了与Root容器无关的元数据和CDB中所蕴含的所有的PDB信息。在CDB环境中被标识为CDB$ROOT,每个CDB环境中只能有一个Root容器数据库。

· CDB seed\
CDB seed为PDB的种子,其中提供了数据文件,在CDB环境中被标识为PDB$SEED,是创立新的PDB的模板,你能够连贯PDB$SEED,然而不能执行任何事物,因为PDB$SEED是只读的,不可进行批改。

· PDBs\
PDB数据库,在CDB环境中每个PDB都是独立存在的,与传统的Oracle数据库根本无差别,每个PDB领有本人的数据文件和objects,惟一的区别在于PDB能够插入到CDB中,以及在CDB中插入,并且在任何一个工夫点之上PDB必须插入或者插入到一个CDB中,当用户链接PDB时不会感觉到根容器和其余PDB的存在。

CDB with PDBs

sys. ora12c>show pdbs

 

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED


         2 PDB$SEED                       READ ONLY  NO

         3 ORA12CPDB                      READ WRITE NO

         4 PDB2                           MOUNTED

         5 PDB1                           MOUNTED

         6 PDB3                           READ WRITE NO

sys. ora12c>

 

PDB$SEED为CDB seed,ORA12CPDB/PDB1/PDB2/PDB3为PDB数据库。

 

Application Containers

在12cR2版本中Oracle带来新的Application Containers个性,该个性对原有的多租户性能进行了加强,在CDB root容器中能够创立一个叫做Application root的容器,相似于CDB root,可在其内创立多个依赖于Application root的Application PDBs,其架构图如下:

Application Containers in a CDB

 

“Application”

在Application Container个性下还有另一个概念,被命名为“Application”,咱们能够把“Application”了解为一个区域,“Application”只能创立在Application root中,其内能够创立表、视图、函数等公共对象,而后可在Application PDBs中应用sync同步命令,来实现“Application”内的公共对象共享到Application PDBs中。

 

CDB环境中的用户

CDB环境中蕴含两类用户,专用用户和本地用户。

· 专用用户\
专用用户是在root数据库中和所有的PDB数据库中都存在的用户,专用用户必须在根容器中创立,而后此用户会在所有的现存的PDB中主动创立,专用用户标识必须以c##或者C##结尾,sys和system用户是Oracle在CDB环境中主动创立的专用用户。\
create user c##yyh identified by yyh;\
创立实现专用用户,须要为专用用户赋予所有可插拔数据库的权限,专用用户才能够拜访其余PDB,如果在连贯根容器时仅仅为专用用户赋予了相干权限,那么该权限不会被传递到所有的可插拔数据库中,必须为专用用户赋予可能传递到PDB中的权限,能够创立专用角色而后赋予专用用户,或者在为公共用户付权时指定子句container=ALL;\
例如:\
create role c##dbaprivs container=all;\
grant dba to c##dbaprivs container=all;\
\
grant c##dbaprivs to c##yyh container=all;\
或者\
grant dba to c##yyh container=all;

· 本地用户\
本地用户指的是在PDB中创立的普通用户,只有在创立它的PDB中才会存在该用户,并且PDB中只能创立本地用户。

 

CDB架构中你须要在次理解的根底

SYSTEM/SYSAUX

在CDB的数据库环境中,SYSTEM/SYSAUX表空间并不是专用,CDB$ROOT以及每个PDB都领有本人的SYSTEM和SYSAUX表空间。

REDO文件

在CDB环境中所有的PDB共用CDB$ROOT中的REDO文件,REDO中的条目标识REDO来自那个PDB。

在PDB中无奈执行ALTER SYSTEM SWITCH LOGFILE命令,只有专用用户在ROOT容器中才能够执行该命令。

另外ALTER SYSTEM CHECKPOINT命令是能够在PDB中执行的。

归档

在CDB环境中所有的PDB共用CDB的归档模式,以及归档文件,不能够独自为PDB设置本人的归档模式,只有特权用户连贯根容器之后才能够启动归档模式。

UNDO MODE

  在12.2之前的版本中,所有的PDB共用CDB$ROOT中的UNDO文件,在12.2之后的版本中UNDO的应用模式有两种:SHARED UNDO MODE和LOCAL UNDO MODE,顾名思义,LOCAL UNDO MODE就是每个PDB应用本人的UNDO表空间,但当PDB中没有本人的UNDO表空间时,会应用CDB$ROOT中的公共UNDO表空间。

 

查看UNDO表空间的应用模式(CDB$ROOT):

COL PROPERTY_NAME FOR A50

COL PROPERTY_VALUE FOR A50

COL DESCRIPTION FOR A50

SELECT property_name, property_value

FROM database_properties

WHERE property_name='LOCAL_UNDO_ENABLED';

 

PROPERTY_NAME        PROPERTY_VALUE


LOCAL_UNDO_ENABLED   TRUE

 

在创立CDB时应用了SHARED UNDO MODE形式,如果后续想更改为LOCAL UNDO MODE,咱们能够应用如下命令更改UNDO MODE为LOCAL UNDO MODE:

startup upgrade

alter database local undo on;

shutdown immediate

startup

CDB中的所有的PDB会主动创立本人的UNDO表空间。

临时文件

每个PDB都有本人的长期表空间,如果PDB没有本人的长期表空间文件,那么,PDB能够应用CDB$ROOT中的长期表空间。

 

08:42:46 sys. woqu>select con_id, tablespace_name from cdb_temp_files;

 

    CON_ID TABLESPACE_NAME


         1 TEMP

         3 TEMP

 

Elapsed: 00:00:00.11

08:43:02 sys. woqu>

参数文件

参数文件中只记录了根容器的参数信息,没有记录PDB级别的参数信息,在根容器中批改初始化参数,会被继承到所有的PDB中,在PDB中批改参数后,批改后的参数会笼罩PDB从CDB继承的参数,PDB级别的参数记录在根容器的pdb_spfile$视图中,但并不是所有的参数都能够在PDB中批改,能够通过v$system_parameter视图查看PDB中可批改的参数:

SELECT name FROM v$system_parameter

WHERE ispdb_modifiable = 'TRUE'

ORDER BY name;

 

pdb_spfile$:

08:37:58 sys. yyh>show parameter open_cursors

 

NAME                                 TYPE        VALUE


open_cursors                         integer     999

08:38:04 sys. yyh>show parameter local_listener

 

NAME                                 TYPE        VALUE


local_listener                       string      CDB_YYH

08:38:08 sys. yyh>select pdb_uid, name, value$ from pdb_spfile$;

 

   PDB_UID NAME               VALUE$


1167267009 open_cursors       999

1167267009 local_listener     'PDB_YYH'

 

Elapsed: 00:00:00.00

08:38:11 sys. yyh>

这里在PDB:1167267009中更改了open_cursors/ local_listener两个参数。

管制文件

CDB环境中只有一组管制文件,所有的PDB共用这组公共的管制文件,从任何PDB中增加数据文件都会记录到公共管制文件当中,专用用户连贯根容器时,可对管制文件进行治理。

 

20:51:03 sys. woqu>show parameter control_files

 

NAME                                 TYPE        VALUE


control_files                        string      /u01/app/oracle/oradata/woqu/c

                                                 ontrol01.ctl, /u01/app/oracle/

                                                 oradata/woqu/control02.ctl

20:51:06 sys. woqu>

 

 

20:50:55 sys. woqupdb>show parameter control_files

 

NAME                                 TYPE        VALUE


control_files                        string      /u01/app/oracle/oradata/woqu/c

                                                 ontrol01.ctl, /u01/app/oracle/

                                                 oradata/woqu/control02.ctl

20:51:23 sys. woqupdb>

 

时区

在CDB环境中能够为CDB以及所有的PDB设置雷同的时区,也能够为每个PDB设置独自的时区。

 

20:51:50 sys. woqu>show pdbs

 

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED


         2 PDB$SEED                       READ ONLY  NO

         3 WOQUPDB                        READ WRITE NO

20:52:00 sys. woqu>select dbtimezone from dual;

 

DBTIME


+00:00

 

Elapsed: 00:00:00.00

20:52:01 sys. woqu>

 

 

20:51:53 sys. woqupdb>select dbtimezone from dual;

 

DBTIME


+08:00

 

Elapsed: 00:00:00.00

20:52:02 sys. woqupdb>

 

字符集

在CDB中定义字符集也能够利用于它所含有的PDB中,每个PDB也能够有本人的字符集设置。

20:52:33 sys. woqu>SELECT a.value || '_' || b.value || '.' || c.value NLS_LANG

20:52:33   2  FROM nls_database_parameters a, nls_database_parameters b, nls_database_parameters c

20:52:33   3  WHERE a.parameter = 'NLS_LANGUAGE' AND b.parameter = 'NLS_TERRITORY' AND c.parameter = 'NLS_CHARACTERSET';

 

 

NLS_LANG


AMERICAN_AMERICA.AL32UTF8

 

Elapsed: 00:00:00.06

20:52:33 sys. woqu>20:52:33 sys. woqu>

 

 

20:52:36 sys. woqupdb>SELECT a.value || '_' || b.value || '.' || c.value NLS_LANG

20:52:36   2  FROM nls_database_parameters a, nls_database_parameters b, nls_database_parameters c

20:52:36   3  WHERE a.parameter = 'NLS_LANGUAGE' AND b.parameter = 'NLS_TERRITORY' AND c.parameter = 'NLS_CHARACTERSET';

 

 

NLS_LANG


AMERICAN_AMERICA.AL32UTF8

 

Elapsed: 00:00:00.08

20:52:36 sys. woqupdb>20:52:36 sys. woqupdb>

数据字典视图与动静性能视图

在CDB环境中引入了CDB级别的数据字典视图,它的级别高于DBA_/ALL_/USER_,CDB级别的数据字典视图含有所有PDB的构造数据信息,该类视图中减少了con_id列,每个PDB在CDB中都会调配一个惟一的con_id。如果要想查看CDB级别的数据字典视图,必须应用专用用户在跟容器中查看,并且要查看的PDB必须处于open状态,才能够看到PDB中的信息。

CON_ID及其形容:

 

20:53:42 sys. woqu>show pdbs

 

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED


         2 PDB$SEED                       READ ONLY  NO

         3 WOQUPDB                        READ WRITE NO

20:53:45 sys. woqu>

 

20:54:40 sys. woqu>select con_id, pdb_id, pdb_name, dbid, status from cdb_pdbs;

 

    CON_ID    PDB_ID PDB_NAME          DBID         STATUS


         2         2 PDB$SEED          2834527297   NORMAL      

         3         3 WOQUPDB           3238406520   NORMAL

20:54:43 sys. woqu>

 

告警日志以及跟踪文件

在CDB中所有的PDB共用一个告警日志和一组跟踪文件,所有的PDB告警信息都会写入同一个告警日志中。

 

AWR报告

 在CDB中收集的就是CDB级别的,在PDB中收集默认是CDB级别的,然而能够抉择PDB级别的。