内容简介:Oracle 12c CDB数据库中数据字典架构
数据字典就是元数据的集合,比如创建的表,列,约束,触发器等等这些都是元数据,需要保存到数据库中。除此之外,Oracle自身的一些数据库对象,如目录,PL/SQL代码等等这些都是元数据,都需要存放在数据字典中。随着12c 容器数据的普及,Oracle数据字典发生了哪些变化呢,下文即是具体描述。
一、数据字典及其形成
1、数据字典
数据字典是元数据的集合,从逻辑上和物理上描述了数据库及内容,存储于SYSTEM与SYSAUX表空间内的若干段。
SYS用户拥有所有的数据字典表,数据字典基本一般以
2、数据字典的形成
在数据库创建阶段创建,在使用阶段维护和更新
无法通过DML操作来修改,只能通过相关的命令修改系统,来达到间接修改数据字典。
3、数据字典包括的内容
数据库对象的定义信息
用户定义信息
PL/SQL代码
用户创建的其他对象等
关于数据字典详细介绍可以参考: Oracle 数据字典和数据字典视图
二、CDB数据库中数据字典架构
1、数据字典存放方式的变更
在Oracle 12c之前的数据库版本,系统数据字典和用户数据字典采取了混合存放的处理方式。
在Oracle 12c CDB数据库中采取分离存放的方式,及各个PDB数据字典独立存放。
从用户和应用程序的角度来看,CDB中每个容器中的数据字典是分开的,因为它将在非CDB中。
2、非CDB混用数据字典情形示意图
在新创建的不包含用户数据的非CDB中,数据字典仅包含系统元数据。
例如,TAB $ 表包含仅描述Oracle提供的表的行,例如TRIGGER $ 和SERVICE $ 。
随着用户数据库对象添加到数据库,则用户添加的这些对象信息被混合存放到了系统数据字典(即Oracle提供的数据对象字典)
如下图描绘了二个基础数据字典表
左边图示中黑色条表示描述系统数据字典的行,绿色条的表示用户对象产生的行相间到数据字典表
3、CDB分离数据字典情形示意图
在CDB中,数据字典元数据在根和PDB之间分割。
在下图中,表emp和dept位于PDB中。该用户数据的数据字典也驻留在PDB中。因此,TAB$PDB中的表具有emp表的行和表dept的行。
那对于Oracle提供的系统对象(系统级别数据字典)要如何访问呢,Oracle通过内部指针的方式来实现。
如下图显示PDB中的数据字典包含指向根中数据字典的指针。在内部,Oracle提供的对象(如数据字典表定义和PL / SQL包)仅在根中表示。
这种架构实现了CDB内的两个主要目标:
减少重复
例如,DBMS_ADVISORCDB不是将PL / SQL包的源代码存储在每个PDB中,而是将其存储在CDB$ROOT其中,从而节省了磁盘空间。
易于数据库升级
如果数据字典表的定义存在于每个PDB中,并且如果定义在新版本中更改,则每个PDB将需要单独升级以捕获更改。在根中存储表定义只有一次消除了这个问题。
4、元数据和数据链接
CDB使用内部链接机制来分离数据字典信息。
具体来说,Oracle数据库使用以下自动管理的指针:
- 元数据链接
Oracle数据库仅在CDB根目录中存储有关字典对象的元数据。例如,数据字典视图下的OBJ $ 字典表的列定义DBA_OBJECTS仅存在于根目录中。如前一图示,OBJ $ 在每个PDB表使用称为内部机构的元数据链接指向存储在根定义的OBJ$。
该数据对应于元数据链路驻留在其PDB,而不是在根。例如,如果您在hrpdb上的表mytable中添加行,然后将行存储在PDB数据文件。PDB和根中的数据字典视图包含不同的行。描述表mytable的一个新行被添加到hrpdb的OBJ $ ,但是不存在于CDB根目录中的OBJ $ 。因此,查询DBA_OBJECTS在CDB根和DBA_OBJECTS在hrdpb显示出不同的结果。
- 数据链接
注意:
Oracle数据库12 c版本1(12.1.0.2)中的数据链接称为对象链接。
在某些情况下,Oracle数据库将一个对象的数据(不仅仅是元数据)存储在应用程序根目录中。应用程序PDB使用称为数据链接的内部机制来引用应用程序根目录中的对象。创建数据链接的应用程序PDB还存储数据链接描述。数据链接继承其所涉及的对象的数据类型。
- 扩展数据链接
扩展数据链路是数据链路和元数据链路的混合。像数据链接一样,扩展数据链接引用应用程序根目录中的对象。然而,扩展数据链路也引用PDB中的相应对象。像元数据链接一样,应用程序PDB中的对象从应用程序根目录中的相应对象继承元数据。
在应用程序根目录中查询时,扩展的数据链接对象仅从应用程序根目录中获取行。然而,当在应用程序PDB中查询时,扩展的数据链接对象从应用程序根和应用程序PDB中获取行。
Oracle数据库自动创建和管理元数据和数据链接CDB$ROOT。用户无法添加,修改或删除这些链接。
三、演示非CDB及CDB数据字典
1、基于非CDB数据库数据字典变化演示
SQL> SELECT name, 2 DECODE (cdb, 3 'YES', 'Multitenant Option enabled', 4 'Regular 12c Database: ') 5 "Multitenant Option", 6 open_mode, 7 con_id 8 FROM v$database; --如查询结果所示,为非CDB数据库 NAME Multitenant Option OPEN_MODE CON_ID --------- -------------------------- -------------------- ---------- NOCDB Regular 12c Database: READ WRITE 0 --检查当前数据库数据字典是否存在T1对象 SQL> select name,owner#,ctime from obj$ where name='T1'; no rows selected --当前数据库总对象数 SQL> select count(*) from obj$; COUNT(*) ---------- 21703 --由于当前的cdb为手工创建,因此,创建一个新用户 SQL> create user leshami identified by pass 2 default tablespace users; --授权 SQL> grant dba,resource,connect to leshami; SQL> conn leshami/pass SQL> create table t1(id number,ename varchar2(20)); SQL> conn / as sysdba --可以查询到对象已经添加到数据字典 SQL> select name,owner#,ctime from obj$ where name='T1'; NAME OWNER# CTIME ---------- ---------- --------- T1 72 01-JUN-17 --相应的总数目也增加了1个 SQL> select count(*) from obj$; COUNT(*) ---------- 21704
2、基于CDB数据库数据字典变化演示
SQL> SELECT name, 2 DECODE (cdb, 3 'YES', 'Multitenant Option enabled', 4 'Regular 12c Database: ') 5 "Multitenant Option", 6 open_mode, 7 con_id 8 FROM v$database; --此查询结果如下,即连接到了CDB数据库 NAME Multitenant Option OPEN_MODE CON_ID --------- -------------------------- -------------------- ---------- CDB1 Multitenant Option enabled READ WRITE 0 --当前CDB数据库下的容器 SQL> select name,con_id,open_mode from v$containers; NAME CON_ID OPEN_MODE ------------------- ---------- ---------- CDB$ROOT 1 READ WRITE PDB$SEED 2 READ ONLY CDB1PDB1 3 MOUNTED --在CDB容器数据字典中查看是否存在表T1,如下结果显示为无 SQL> select name,owner#,ctime from obj$ where name='T1'; no rows selected --统计当前CDB容器数据字典中obj$的总数目 SQL> select count(*) from obj$; COUNT(*) ---------- 72635 --打开pdb数据库cdb1pdb1 SQL> alter pluggable database cdb1pdb1 open; Pluggable database altered. --切换到pdb容器数据库cdb1pdb1 SQL> alter session set container=CDB1PDB1; --在PDB中查看是否存在表T1 SQL> select name,owner#,ctime from obj$ where name='T1'; no rows selected --统计PDB容器数据字典中obj$的总数目 SQL> select count(*) from obj$; COUNT(*) ---------- 72648 --开启另外一个session,使用hr账号登陆 $ sqlplus hr/hr@cdb1pdb1 --创建表对象 SQL> create table t1(id number,ename varchar2(20)); --切换到cdb数据库 SQL> conn / as sysdba SQL> select 'Leshami' Author,'http://blog.csdn.net/leshami' Blog, 2 '645746311' QQ from dual; AUTHOR BLOG QQ ------- ---------------------------- --------- Leshami http://blog.csdn.net/leshami 645746311 SQL> select name,owner#,ctime from obj$ where name='T1'; no rows selected SQL> select count(*) from obj$; --数据库对象在cdb中不存在,总数也没有增加 COUNT(*) ---------- 72635 --切换到pdb数据库 SQL> alter session set container=CDB1PDB1; SQL> select name,owner#,ctime from obj$ where name='T1'; --数据字典中存在已创建的对象 NAME OWNER# CTIME --------------- ---------- --------- T1 107 01-JUN-17 SQL> select count(*) from obj$; --数据字典总数目增加1条 COUNT(*) ---------- 72649
四、数据字典视图
在启用CDB之后,数据字典相关视图也有一些变化,主要是增加了CDB相关的视图。如下图所示:
五、更多参考
http://docs.oracle.com/database/122/CNCPT/overview-of-the-multitenant-architecture.htm
Oracle 12c多租户架构及优缺点
Oracle 12c手工建库(非CDB及CDB创建)
以上所述就是小编给大家介绍的《Oracle 12c CDB数据库中数据字典架构》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First Python
Paul Barry / O'Reilly Media / 2010-11-30 / USD 49.99
Are you keen to add Python to your programming skills? Learn quickly and have some fun at the same time with Head First Python. This book takes you beyond typical how-to manuals with engaging images, ......一起来看看 《Head First Python》 这本书的介绍吧!