头图

Oracle12c新特性大全(一)可插入数据库的概念

Oracle Multitenant Container Database是Oracle 12C引入的新特性,Multitenant Container Database (CDB),多租户容器数据库是指可以容纳一个或者多个可插拔数据库的数据库,这个特性允许在CDB容器数据库中创建并且维护多个数据库,在CDB中创建的数据库被称为PDB,每个PDB在CDB中是相互独立存在的,在单独使用PDB时,与普通数据库无任何区别。**

CDB根容器数据库的主要作用就是容纳所有相关的PDB的元数据,以及在CDB中对所有的PDB进行管理。

图片1.png

多租户环境的组成

· 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

图片2.png

 

“Application”

图片3.png

在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级别的。

1 声望
0 粉丝
0 条评论
推荐阅读
Oracle12c新特性大全 IO资源隔离
 12cR2中,引入了两个参数MAX_IOPS和MAX_MBPS来限制PDB的物理IO。这两个参数只作用于PDB,不对CDB和非多租户环境生效。另外,这两个参数不限制redo log的写入(LGWR进程)和buffer cache脏块写入磁盘(DBWR进程)。

沃趣数据库私有云阅读 294

封面图
一次偶然机会发现的MySQL“负优化”
今天要讲的这件事和上述的两个sql有关,是数年前遇到的一个关于MySQL查询性能的问题。主要是最近刷到了一些关于MySQL查询性能的文章,大部分文章中讲到的都只是一些常见的索引失效场合,于是我回想起了当初被那个...

骑牛上青山6阅读 1.6k评论 2

Mysql索引覆盖
通常情况下,我们创建索引的时候只关注where条件,不过这只是索引优化的一个方向。优秀的索引设计应该纵观整个查询,而不仅仅是where条件部分,还应该关注查询所包含的列。索引确实是一种高效的查找数据方式,但...

京东云开发者2阅读 695

封面图
MySQL 数据库索引技术原理初探
一本书 500 页的书,如果没有目录,直接去找某个知识点,可能需要找一会儿,但是借助前面的目录,就可以快速找到对应知识点在书的哪一页。这里的目录就是索引。

mylxsw1阅读 1.2k

Mybatis源码解析之执行SQL语句
通过调用 session.getMapper (AccountMapper.class) 所得到的 AccountMapper 是一个动态代理对象,所以执行 accountMapper.selectByPrimaryKey (1) 方法前,都会被 invoke () 拦截,先执行 invoke () 中的逻辑。

京东云开发者3阅读 789评论 1

封面图
2023最新MySQL高频面试题汇总
本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~

程序员大彬3阅读 775

第十六届中国大数据技术大会五大分论坛顺利举办!
1 月 8 日下午,由苏州市人民政府指导、中国计算机学会主办、苏州市吴江区人民政府支持,CCF 大数据专家委员会、苏州市吴江区工信局、吴江区东太湖度假区管委会、苏州市吴江区科技局、苏州大学未来科学与工程学院...

MissD阅读 5.7k

1 声望
0 粉丝
宣传栏