Oracle12c之 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://blog.csdn.net/leshami/article/details/72833564
Oracle12c之 CDB数据库中数据字典架构的更多相关文章
- sql server 还原数据库后,删除用户,提示数据库主体在该数据库中拥有架构,无法删除解决方法
将另一台服务器上的数据库备份文件,在现在用的这台服务器上还原之后,再创建相同的用户名,提示用户已存在 想将之前的用户先删除掉,却提示“数据库主体在该数据库中拥有架构,无法删除解决方法” 在网上找到方法 ...
- SQL Server2008数据库中删除用户,提示数据库主体在该数据库中拥有 架构,无法删除
一个数据库,运行在SQL Server 2008下,数据库用户无法删除,在删除时提示“数据库主体在该数据库中拥有架构,无法删除”.原因很简单,就是由于此用户在数据库中拥有某些架构的所有权,将相关架构的 ...
- sqlserver2008出现数据库主体在该数据库中拥有架构,无法删除的解决方案
当要删除数据库中的某个用户名的时候会报错 出现数据库主体在该数据库中拥有架构,无法删除的解决方案(MicrosoftSQLServer,错误:15138) 和sql server2000不同 第一:这 ...
- 随机获得MySQL数据库中100条数据方法 驾照题库项目 MVC架构 biz业务层的实现类 根据考试类型rand或order通过dao数据访问层接口得到数据库中100或全部数据
package com.swift.jztk.biz; import java.util.Collections; import java.util.Comparator; import java.u ...
- Windows平台下解决Oracle12c使用PDB数据库创建SDE的问题 分类: oracle sde 2015-06-12 11:03 88人阅读 评论(0) 收藏
Windows平台下解决Oracle12c使用PDB数据库创建SDE的问题 Oracle 12C中引入了CDB与PDB的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant ...
- oracle12c之三 控制PDB中CPU 资源使用
CPU资源隔离 数据库中,不同的PDB对主机CPU资源使用要求不同,那么我们就可以使用CDB resourceplans来管理不同pdb对CPU资源的使用. CDB Resource Plans ...
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- 高访问量WEB开发中的架构模式,学习从点滴开始
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构 ...
- 将Oracle数据库中的数据写入Excel
将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...
随机推荐
- 设置了width和height的a元素在IE11与IE11以下浏览器中的不同渲染方式
#welcomeMiddleBtn { display: block; width: 73px; height: 120px; margin: 0px auto; } <a id="w ...
- Shell test 命令,Shell 输入/输出重定向
一.Shell test 命令 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -g ...
- Frequently-Used Network Time Server(Base On NTP:Network Time Protocol)
国家授时中心服务器 210.72.145.44 133.100.11.8 日本福冈大学 time-a.nist.gov 129.6 ...
- 极简MarkDown教程(常用样式)
推荐编辑软件,NotePad++ & MarkDownViewer++(插件),以下内容为MarkDown格式,可自行放到编辑软件中查看,或在线查看 #### . 标题 > 用#+空格开 ...
- LeetCode OJ:Palindrome Partitioning(回文排列)
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...
- Alpha冲刺一(1/10)
前言 队名:拖鞋旅游队 组长博客:https://www.cnblogs.com/Sulumer/p/9948330.html 作业博客:https://edu.cnblogs.com/campus/ ...
- React-Native基础_5.列表视图ListView
列表视图ListView 用来显示垂直滚动列表,需要指定两个东西,1 数据的来源 dataSource,2 渲染列表的条目布局 rendRow 'use strict' import React, { ...
- Windows7下PHP 7.1搭建开发环境
引言: PHP天生就是用来解决互联网时代的Web语言问题的专业工具,本文将记录在windows上搭建PHP的过程以及其中碰到的问题. 配置版本信息 OS: Windows 7 PHP: 7.1.7-n ...
- 开源一款资源分享与下载工具 —— 电驴(eMule)
这里分享一款资源分享与下载工具--电驴,其实严格来说,应该叫电骡,这是我维护的版本,eMuleVeryCD版本,VeryCD是一个不错的资源分享网站:http://www.verycd.com/.大概 ...
- loadrunner11 中文破解版安装教程
loadrunner11的安装:http://pan.baidu.com/share/link?shareid=316642707&uk=1395568298 汉化包(下载之后有可能是ISO格 ...