Oracle 12c CDB数据库中数据字典架构

数据字典就是元数据的集合,比如创建的表,列,约束,触发器等等这些都是元数据,需要保存到数据库中。除此之外,Oracle自身的一些数据库对象,如目录,PL/SQL代码等等这些都是元数据,都需要存放在数据字典中。随着12c 容器数据的普及,Oracle数据字典发生了哪些变化呢,下文即是具体描述。

一、数据字典及其形成

1、数据字典

数据字典是元数据的集合,从逻辑上和物理上描述了数据库及内容,存储于SYSTEM与SYSAUX表空间内的若干段。

SYS用户拥有所有的数据字典表,数据字典基本一般以结尾,如col,tab$等,这些数据字典存放在system表空间中。

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创建)

时间: 2024-10-21 07:37:52

Oracle 12c CDB数据库中数据字典架构的相关文章

ORACLE 12C CDB中PDB参数管理机制

转自:http://www.xifenfei.com/2013/06/oracle-12c-cdb%E4%B8%ADpdb%E5%8F%82%E6%95%B0%E7%AE%A1%E7%90%86%E6%9C%BA%E5%88%B6.html 在ORACLE 12C中参数文件只是记录了cdb的参数信息,没有记录任何的pdb的信息,那ORACLE是如何管理使得各个pdb有自己的参数,这里通过试验的出来ORACLE 12C CDB环境中是通过参数文件结合PDB_SPFILE$来实现参数管理数据库版本

如何解读:熟悉SQL Server、Oracle等常见数据库中的至少一种数据库

问题描述 招聘要求上经常有熟悉SQLServer.Oracle等常见数据库中的至少一种数据库的要求,不知道,到底要掌握到神马程度呢?需要掌握哪些技能.还望哪位大虾指点一二 解决方案 解决方案二:会insertdeleteupdateselect会create解决方案三:引用1楼ztglf521的回复: 会insertdeleteupdateselect会create 这个是最今本的吧,就行了么?解决方案四:基本的命令可以有很多组合的,不是那么简单的.另有groupby,orderby.各类函数.

ORACLE和SYBASE数据库中实现数据查询条数限制的SQL语句实现

一.概述 对于某些需要通过数据库与大量数据打交道的软件来说,处理性能相当的重要.为了保证软件能够将所有数据处理完而不至于崩溃,分批处理的思想应运而生.分批处理的具体做法是编写SQL语句,每次返回规定条数的数据给软件处理,待这一批数据处理完之后,再接着处理下一批. 本文通过对具体的数据库表(tb_employeeinfo)的操作过程,展示了ORACLE和SYBASE数据库中分批处理SQL语句的编写方法. 二.ORACLE数据库中的处理 首先,建立tb_employeeinfo表,其定义如下: be

MSSQL中删除用户时数据库主体在该数据库存中拥有架构 无法删除的解决方法_MsSql

在ms sql2005 下面删除一个数据库的用户的时候提示 "数据库主体在该数据库中拥有架构,无法删除" 的错误解决方案 1.在 安全性 -> 架构 下面看有没有该用户存在,如果有就删除 再试试在用户下面看能不能把该用户删掉,如果不行就用下面的文法 运行下SQL语句 ALTER AUTHORIZATION ON SCHEMA::db_owner TO dbo; --然后手动删除就可以了. 因为选定的用户拥有对象,所以无法除去该用户"解决方法 复制代码 代码如下: use

mssql2000升级到SQLServer2005数据库中更改数据架构方法

在网上找到:SQL Server 2005删除用户失败解决方法(15138错误) Microsoft SQL Server错误: 15138删除对于用户失败,数据库主体在该数据库中拥有架构,无法删除. 删除 对于 用户"*****"失败. (Microsoft.SqlServer.Smo) 其他信息: 执行 Transact-SQL 语句或批处理时发生了异常. (Microsoft.SqlServer.ConnectionInfo) 解决方法一 先删除此用户对应的架构,然后在删除对

《Oracle数据库管理与维护实战》——1.3 Oracle 12c新特性

1.3 Oracle 12c新特性 Oracle数据库管理与维护实战 纵观甲骨文全球大会和甲骨文公司的各种资讯,我们可以发现云计算和大数据是两个重要的主题,Oracle 12c则融合了这两大主题.与以往的Oracle数据库相比,Oracle 12c在16个方面进行了更新.本节将详细介绍Oracle 12c数据库中的16个新特性. 1.3.1 支持多线程模式 在Oracle 12c中,Oracle引入了多线程模式,允许在Windows平台之外的UNIX.Linux等系统使用多线程模式.结合多进程与

[参考文档] [翻译]Oracle 12c R2优化器白皮书

[参考文档] [翻译]Oracle 12c R2优化器白皮书 原文链接:http://www.oracle.com/technetwor ... edb-12c-1963236.pdf 第一版翻译链接:http://www.itpub.net/thread-1855401-1-1.html Oracle数据库12c第二版优化器 Oracle白皮书 2016年11月 序言 优化器是Oracle数据库最引人入胜的部件之一,因为它对每一个SQL语句的处理都必不可少.优化器为每个SQL语句确定最有效的执

Oracle 12C 执行计划提示TABLE ACCESS BY INDEX ROWID BATCHED

从Oracle 12C开始执行计划中可能会出现TABLE ACCESS BY INDEX ROWID BATCHED,官方的解释:TABLE ACCESS BY INDEX ROWID BATCHED:means that the database retrieves a few rowids from the index, and then attempts to access rows in block order to improve the clustering and reduce t

oracle数据库12c的cluster中,dbs下指定spfile不生效

在11g的cluster中,我们往往用dbs下的初始化文件(pfile),来指定asm中实际存在的spfile [oracle@ol6-112-rac1 dbs]$ cd /u01/app/oracle/product/11.2.0.4/db_1/dbs [oracle@ol6-112-rac1 dbs]$ ls hc_acfsdb.dat  hc_cdbrac_1.dat  hc_cdbrac_2.dat  initcdbrac_1.ora  initcdbrac_1.ora.orig  in