Oracle 12c多租户特性详解:从Schema到PDB的变化与隔离

news2024/11/17 5:31:50

 CDB和PDB的职责分离一些数据库管理员管理整个CDB,而另一些管理员管理单个的pdb。.管理整个CDB的dba作为普通用户连接到CDB,管理整个CDB和根的属性,以及pdb的一些属性。例如,这些dba可以创建、拔出、插入和删除pdb。它们还可以为根用户指定临时表空间和默认表空间,并且可以更改PDBs的开放模式。DBAs还可以连接到特定的PDB作为本地的PDB管理员,然后在PDB上执行

 CDB和PDB的职责分离

一些数据库管理员管理整个CDB,而另一些管理员管理单个的pdb。.

管理整个CDB的dba作为普通用户连接到CDB,管理整个CDB和根的属性,以及pdb的一些属性。例如,这些dba可以创建、拔出、插入和删除pdb。它们还可以为根用户指定临时表空间和默认表空间,并且可以更改PDBs的开放模式。

DBAs还可以连接到特定的PDB作为本地的PDB管理员,然后在PDB上执行一个管理任务的子集,DBA在非cdb上执行。子集包括PDB所需的任务 an . 例如,任务可以包括管理PDB中的表空间和模式、指定该PDB的存储参数、更改当前PDB的开放模式以及设置PDB级初始化参数。

-----------MSSQL 天然就是多租户啊,sa权限有点大

 用户管理

SYSTEM@localhost:1521/pdb4_his.oracle.com> conn / as sysdba

Connected.

在root中创建用户c##1,用户名需要以c##开头,在root中创建的用户会复制到所有的pdbs中,除了seed pdb。

SYS@cdbtest> create user c##2 identified by password container=all ;

User created.

SYS@cdbtest> select username,common,con_id from cdb_users where username like 'C##%' ;

USERNAME COM CON_ID

------------------------------ --- ----------

C##1 YES 4

C##2 YES 4

C##1 YES 3

C##2 YES 3

C##1 YES 1

C##2 YES 1

C##1 YES 5

C##2 YES 5

从上面的输出中可以看到在每个PDB中都有用户C##1,除了pdb seed。

尝试登录

SYS@cdbtest> conn c##2/password@localhost:1521/pdb4_his.oracle.com

ERROR:

ORA-01045: user C##2 lacks CREATE SESSION privilege; logon denied

Warning: You are no longer connected to ORACLE.

在pdb中创建用户

SYS@cdbtest> conn system/password@localhost:1521/pdb4_his.oracle.com

Connected.

SYSTEM@localhost:1521/pdb4_his.oracle.com> create user hr identified by password ;

User created.

SYSTEM@localhost:1521/pdb4_his.oracle.com> select username,common,con_id from cdb_users where username like 'HR';

USERNAME COM CON_ID

------------------------------ --- ----------

HR NO 5

尝试登录

SYSTEM@localhost:1521/pdb4_his.oracle.com> conn hr/password@localhost:1521/pdb4_his.oracle.com

ERROR:

ORA-01045: user HR lacks CREATE SESSION privilege; logon denied

Warning: You are no longer connected to ORACLE.

SYSTEM@localhost:1521/pdb4_his.oracle.com> conn system/password@localhost:1521/pdb4_his.oracle.com

Connected.

单独在pdb中赋予create session权限

SYSTEM@localhost:1521/pdb4_his.oracle.com> grant create session to c##2 ;

Grant succeeded.

再次登录pdb4

SYSTEM@localhost:1521/pdb4_his.oracle.com> conn c##2/password@localhost:1521/pdb4_his.oracle.com

Connected.

测试登录pdb3

C##2@localhost:1521/pdb4_his.oracle.com> conn c##2/password@localhost:1521/pdb3_his.oracle.com

ERROR:

ORA-01045: user C##2 lacks CREATE SESSION privilege; logon denied

Warning: You are no longer connected to ORACLE.

在所有的pdbs给用户c##2赋予create session权限

HR@localhost:1521/pdb4_his.oracle.com> conn / as sysdba

Connected.

SYS@cdbtest> grant create session to c##2 container=all ;

Grant succeeded.

SYS@cdbtest> conn c##2/password@localhost:1521/pdb1.oracle.com

Connected.

角色管理

C##2@localhost:1521/pdb1.oracle.com> conn / as sysdba

Connected.

SYS@cdbtest> create role c##r2 container=all ;

Role created.

SYS@cdbtest> select role,common,con_id from cdb_roles where role='C##R2' ;

ROLE COM CON_ID

---------- --- ----------

C##R2 YES 5

C##R2 YES 4

C##R2 YES 3

C##R2 YES 1

从上面的输出可以看到每个pdb(除了seed)都有role C##R2

SYS@cdbtest> conn system/password@localhost:1521/pdb4_his.oracle.com

Connected.

单独在pdb中创建role

SYSTEM@localhost:1521/pdb4_his.oracle.com> create role hr_manager ;

Role created.

SYSTEM@localhost:1521/pdb4_his.oracle.com> select role,common,con_id from cdb_roles where role='HR_MANAGER';

ROLE COM CON_ID

---------- --- ----------

HR_MANAGER NO 5

SYSTEM@localhost:1521/pdb4_his.oracle.com> create role c##r2 container=all ;

create role c##r2 container=all

*

ERROR at line 1:

ORA-65050: Common DDLs only allowed in CDB$ROOT

在root中给角色授予权限

SYSTEM@localhost:1521/pdb4_his.oracle.com> conn / as sysdba

Connected.

SYS@cdbtest> grant create session to c##2 container=all ;

Grant succeeded.

SYS@cdbtest> select grantee,privilege,common,con_id from cdb_sys_privs

2 where privilege='CREATE SESSION' and grantee='C##2';

GRANTEE PRIVILEGE COM CON_ID

------------------------------ ---------------------------------------- --- ----------

C##2 CREATE SESSION NO 5

C##2 CREATE SESSION YES 5

C##2 CREATE SESSION YES 4

C##2 CREATE SESSION YES 3

C##2 CREATE SESSION YES 1

SYS@cdbtest> conn c##2/password@localhost:1521/pdb4_his.oracle.com

Connected.

C##2@localhost:1521/pdb4_his.oracle.com> select * from session_privs ;

PRIVILEGE

----------------------------------------

CREATE SESSION

C##2@localhost:1521/pdb4_his.oracle.com> conn c##2/password@localhost:1521/pdb4_his.oracle.com

Connected.

C##2@localhost:1521/pdb4_his.oracle.com> select * from session_privs ;

PRIVILEGE

----------------------------------------

CREATE SESSION

C##2@localhost:1521/pdb4_his.oracle.com> connect system/password@localhost:1521/pdb4_his.oracle.com

Connected.

SYSTEM@localhost:1521/pdb4_his.oracle.com> grant create session to hr container=all ;

grant create session to hr container=all

*

ERROR at line 1:

ORA-65030: one may not grant a Common Privilege to a Local User or Role

SYSTEM@localhost:1521/pdb4_his.oracle.com> grant create session to hr ;

Grant succeeded.

SYSTEM@localhost:1521/pdb4_his.oracle.com> select grantee,privilege,common,con_id from cdb_sys_privs

2 where privilege='CREATE SESSION' and grantee='HR' ;

GRANTEE PRIVILEGE COM CON_ID

------------------------------ ---------------------------------------- --- ----------

HR CREATE SESSION NO 5

PDBs删除

SYSTEM@localhost:1521/pdb4_his.oracle.com> conn / as sysdba

Connected.

SYS@cdbtest>

SYS@cdbtest> alter pluggable database all close immediate ;

Pluggable database altered.

SYS@cdbtest> select name ,open_mode from v$pdbs ;

NAME OPEN_MODE

------------------------------ ----------

PDB$SEED READ ONLY

PDB1 MOUNTED

PDB3_HIS MOUNTED

PDB4_HIS MOUNTED

SYS@cdbtest> drop pluggable database pdb4_his including datafile ;

drop pluggable database pdb4_his including datafile

*

ERROR at line 1:

ORA-02000: missing DATAFILES keyword

SYS@cdbtest> drop pluggable database pdb4_his including datafiles ;

Pluggable database dropped.

SYS@cdbtest> select name ,open_mode from v$pdbs ;

NAME OPEN_MODE

------------------------------ ----------

PDB$SEED READ ONLY

PDB1 MOUNTED

PDB3_HIS MOUNTED

SYS@cdbtest>

SYS@cdbtest> drop user c##1;

User dropped.

SYS@cdbtest> drop user c##2;

User dropped.

SYS@cdbtest> drop role c##r1 ;

Role dropped.

SYS@cdbtest> drop role c##r2 ;

Role dropped.

SYS@cdbtest> drop tablespace cdata01 including contents ;

Tablespace dropped.

SYS@cdbtest> drop tablespace cdata including contents ;

Tablespace dropped.

SYS@cdbtest> drop tablespace temp_root_01 including contents ;

Tablespace dropped.

 

 

编辑手记:Oracle 12c的多租户特性是Oracle Database历史上最重要的革新之一,在云时代这一特性展现出强大的整合威力,这篇文章来自<深入解析Oracle>一书的摘录。

在Oracle Database 12c版本中,一个重要的新特性:插接式数据库(Pluggable Database)被引入进来。在12c之前的版本中,Oracle数据库中的多用户管理通过Schema – 模式管理方式来实现,而在12c中,插接式数据库在更高级别实现了进一步的隔离。

1. 插接式数据简介

插接式数据库由一个使用 CDB(Container Database)选项创建的容器数据库和一个或多个 PDB(Pluggable Database)组成,CDB 作为容器容纳 PDB,而 PDB 彼此隔离,就像一个独立的数据库般在 CDB 中存在。

 

CDB 需要在创建数据库时指定选项,如下图所示,必须选择“创建为容器数据库”选项,然后才能够在其中创建 PDB,在 CDB 之外的常规数据库中是不能够包含 PDB 的。以下页面中,选择包含了1个 PluggableDatabase,CDB 和 PDB 的名称就在这个页面分别指定:

在完成 CDB 的创建之后,可以登陆到数据库,查询数据库的创建模式,在 v$database 和 v$instance 视图中都可以找到相应信息,CDB 为 YES 显示该数据库为 CDB 模式:

PDB 是一组 Schema 的集合,在 CDB 中作为一个独立的组件容器而存在。从这个意义上说,PDB 也是一种容器(Container), 而 CDB 中可以存在多种不同类型的容器。

2. CDB 的组成

 

每个 CDB 通常包含如下容器(Container):

 ① ROOT

Root 是一个系统提供的容器,用于存储公用用户,公用用户可以连接到其他容器,可以查看系统级元数据,这个 Root 容器被命名为 CDB$ROOT.

以下两种查询方式显示了这个 Root 容器的名称:


 

以下查询整合输出了CDB的详细信息:

② Seed PDB

种子 PDB 是一个系统级模版,CDB 可以用这个模版创建其他 PDB,种子 PDB 的名称是 PDB$SEED,其中的对象不能被修改。

种子 PDB 数据库的模板存储于 $ORACLE_HOME/assistants/dbca/templates/ 目录下,以压缩格式提供,其命名为:pdbseed.tar.gz。解压缩这个文件,其中包含如下几个文件:

这其中最为主要的是 SYSTEM 和 SYSAUX 表空间文件,这是一个种子数据库,已经内置了字典对象,如果使用模板方式建库,PDB 则由此克隆创建出来。

在创建数据库时,如果选择定制数据库方式创建,则模板文件会自行创建出来,不需要使用模板中的文件。

容器 CDB$ROOT 和 PDB$SEED 对于一个插接式数据库来说是必须的基本组件,这两者构成了插接式数据库的基础支撑。其关系如下图所示:

③ PDB

PDB 是用户基于特定需求建立的对象容器,在创建 CDB 时,可以不同时创建 PDB,PDB 随后可以根据用户的需求创立。

 

以下示意图显示,CDB 中包含了 CDB$ROOT,PDB$SEED 和两个用户 PDB,两个 PDB 分别用于 SALES 和 HR 业务应用。

上图中,以 USB 移动硬盘的方式表现 PDB,正是突出了 PDB 的 plug 和 unplug 特点,由图中可以直观的了解到插接式数据库的主要特性:

 

  1. 可以通过现有数据库快速配置和部署新的环境;

  2. 通过 unplug 和 plug 可以快速进行数据库迁移和整合;

  3. 集中的部署可以加快升级迁移的过程,缩减维护成本;

  4. 方便的整合和拆分方式便于集中部署或在压力过大时迅速拆分部署;

  5. 分离管理员的职责,强化安全管理;

如上所述,插接式数据库的一个巨大便利是,可以简化数据库的整合迁移,降低管理成本。在一个大型企业中,可能存在几百上千个数据库实例,而随着硬件性能的提升,这些数据库的资源利用率可能很低,不仅浪费硬件资源,也加重了管理负担,按照以前版本的功能进行整合或拆分,通常要进行导出导入(Expdp / Impdp 等),不仅复杂,而且涉及很多变更,通常让人望而生畏。

而如果使用插接式数据库,则可以轻松的将数据库整合,当负载过高时,又可以迁移至独立的服务器,整个过程对应用完全透明,主要通过文件复制即可完成,这对于数据库的分分合合将是一个福音。

3. 元数据的隔离

CDB 与 PDB 的隔离随之带来了一系列的好处,如元数据的分离。

在一个 Non-CDB 的数据库中,数据库自身的元数据和用户元数据是混合存储的,如创建图示中的 EMP、DEPT 等数据表,其对象信息、表信息等都要存储在 OBJ$、TAB$ 等数据字典中,这在某些特殊情况下,可能会引起核心数据字典的性能衰减和故障:

在 CDB 的模式下,由于 PDB 具有独立的 SYSTEM 和 SYSAUX 表空间,其元数据和系统元数据自然分离,用户数据的字典信息也就无需再记录到系统的元数据中,这对于核心的元数据是一种更好的隔离和保护,下图描述了在 CDB、PDB 模式下用户数据和元数据的分离关系,其中数据字典元数据也就是 Root Container:

4. CDB 的内存管理

在内存管理上,SGA 统一分配,PDB 各自的内存对象通过 ID 进行区分,下图示意了 PDB 的内存管理示意,不同的 PDB 在 SGA 中统一分配内存,通过各自标识进行空间管理和识别(通过ID标识,但是内存是融合管理的):

以下来详细分析一下 Oracle 的 PDB 内存管理。首先启动数据库,SGA 在实例启动过程中创建分配:

这个测试数据库中包含如下 PDB:

初始的,两个用户 PDB 并未打开,内存分配情况如下:

可以看到有三个 Container 分配了一系列的内存条目,这三个容器分别为0、1、2.其中0号容器是 CDB 实例:

1号 Container 是 CDB$ROOT :

如前所述,2号 Container 是 PDB$SEED.

 

查询 X$BH,可以看到不同 Container 的内存分配:

打开一个 PDB:

可以看到相应 Container 的 Buffer Cache 和 Shared Pool 对象等都已经分配:

继续打开下一个 PDB,观察内存分配情况:

查询 v$sgastat 视图可以获得一个 PDB 的 Shared Pool 内存分配情况:

同样 PGA 的内存分配也是通过 CON_ID 区分不同 PDB 的 PGA 内存使用:

如下通过内存转储命令,可以分级转储 PDB 的 Buffer Cache 内容:

可以观察到对于不同 PDB 的 Buffer Cache 内容转储:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173336.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【c语言】文件操作详解

主页&#xff1a;114514的代码大冒险 qq:2188956112&#xff08;欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ &#xff09; Gitee&#xff1a;庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 目录 前言 一、文件是什么 二、文件的打开和关闭 1.文件指针 2.文件的打开和关闭 三&#xff0c;文件的顺…

《计算机体系结构量化研究方法》 B.4 虚拟存储器 笔记

B.4 虚拟存储器 一、基本概念 1、虚拟存储器把物理存储器划分成块以后分配给不同的进程&#xff1b;采用一种保护机制来限制各个进程&#xff0c;使其仅能访问属于自己的块。 2、重定位机制允许同一程序在物理存储器中的任意位置运行。 3、页和段用于块&#xff0c;缺页错误…

SSM框架整合入门案例

文章目录SSM整合案例1&#xff0c;SSM整合1.1 流程分析1.2 整合配置步骤1&#xff1a;创建Maven的web项目步骤2:添加依赖步骤3:创建项目包结构步骤4:创建SpringConfig配置类步骤5:创建JdbcConfig配置类步骤6:创建MybatisConfig配置类步骤7:创建jdbc.properties步骤8:创建Spring…

《Buildozer打包实战指南》第七节 常见的打包问题

目录 无法访问xxx网址&#xff0c;连接超时 目标路径xxx已经存在&#xff0c;并且不是一个空目录 每次打包时间都要很久 待更新 在打包过程中难免会碰到一些问题&#xff0c;在本节&#xff0c;笔者会把自己碰到的一些问题的解决方案写出来&#xff0c;好让读者节省时间。 …

KaiwuDB CTO 魏可伟:1.0 时序数据库技术解读

大家好&#xff0c;首先非常感谢大家参与本次 KaiwuDB 1.0 系列产品发布会。作为国内数据库新生品牌力量&#xff0c;KaiwuDB 是浪潮集团控股的数据库企业&#xff0c;我们聚焦在工业物联网、数字能源、交通车联网、智慧产业等快速发展的重要领域&#xff0c;希望为各大行业客户…

06技术太卷我学APEX-技术太卷我学APEX

06技术太卷我学APEX-技术太卷我学APEX 0 概述 自学APEX第7天&#xff0c;用APEX做了一个自学的笔记APP&#xff0c;名称就叫《技术太卷我学APEX》 1 登录页面 登录页面设置&#xff1a;就改了下名称和加上了测试账号。 登录页面效果&#xff1a; 这个是 APEX功能页面之一…

前端面试题合集-第一篇

前端面试题合集-第一篇 &#x1f514;每周不定时更新&#xff01; ⛄️不要让自己失去竞争力&#xff01; ☀️哪里都不是避风港&#xff0c;保持竞争力! 1. CSS选择器的优先级 !important>内联>id选择器>类选择器>标签选择器>通配符选择器>继承 在同一…

Java IO流补充 - Properties - IO流框架commons-io

文章目录IO流补充知识Properties结合IO流集合IO流框架IO流补充知识 Properties结合IO流集合 我们先来认识Properties属性集对象 Properties其实就是一个Map集合&#xff0c;但是我们一般不会当集合使用&#xff0c;因为HashMap更好用。 Properties核心作用: 属性文件&#xf…

设计模式_行为型模式 -《观察者模式》

设计模式_行为型模式 -《观察者模式》 笔记整理自 黑马程序员Java设计模式详解&#xff0c; 23种Java设计模式&#xff08;图解框架源码分析实战&#xff09; 概述 定义 观察者模式&#xff0c;又被称为发布-订阅&#xff08;Publish / Subscribe&#xff09;模式&#xff0c…

RSA与证书

这篇文章详细讲述一下RSA与证书的相关内容。内容有点多&#xff0c;但都是干货。 一、RSA算法 1.1简介 RSA算法是由美国三位科学家Rivest、Shamir和Adleman于1976年提出并在1978年正式发表的公开密码算 法&#xff0c;其命名取自三位创始人名字的首字母缩写。该算法基于数论…

CSS 计数器

CSS 计数器 CSS 计数器可让你根据内容在文档中的位置调整其显示的外观。例如&#xff0c;你可以使用计数器自动为网页中的标题编号&#xff0c;或者更改有序列表的编号。 本质上 CSS 计数器是由 CSS 维护的变量&#xff0c;这些变量可能根据 CSS 规则跟踪使用次数以递增或递减…

【Git】利用 GIT 做版本控制

目录 写在前面 备份方法 效果展示 写在前面 在做项目开发时&#xff0c;不免需要进行版本更替或者使增加新功能等&#xff0c;这时很重要的环节是对版本进行备份&#xff0c;以便在新版本开发过程中出现问题&#xff0c;而当工程文件过大时&#xff0c;在对文件备份时需要占…

Java——多线程01(创建和启动,优先级调度,守护线程,出让/礼让线程,插队/插入线程)

目录1.多线程的创建和启动方式1.线程第一种启动方式&#xff08;继承Thread类&#xff09;2.多线程的第二种启动方式实现Runnable接口3.多线程的第三种启动方式实现Callable接口2.Thread多线程中的方法1.getName(), setName(),currentThread(),sleep2.Thread优先级调度方法3.守…

【手把手教你学会51单片机】数码管的动态显示

注&#xff1a;本文章转载自《手把手教你学习51单片机》&#xff01;因转载需要原文链接&#xff0c;故无法选择转载&#xff01; 如若侵权&#xff0c;请联系我进行删除&#xff01;上传至网络博客目的为了记录自己学习的过程的同时&#xff0c;同时能够帮助其他一同学习的小伙…

类的初始化2023018

类的初始化&#xff1a; 第一次使用某个类&#xff0c;例如Person类&#xff0c;系统通常会在第一次使用Person类时加载这个类并初始化这个类。在类的准备阶段&#xff0c;系统将会为该类的类变量分配内存空间&#xff0c;并指定默认初始值。当Person类初始化完成后&#xff0c…

高并发系统设计-Feed流系统设计

有两种实现方式&#xff1a;push和pull实现&#xff0c;首先讨论push模式 概念 我们在讲如何设计Feed流系统之前&#xff0c;先来看一下Feed流中的一些概念&#xff1a; Feed&#xff1a;Feed流中的每一条状态或者消息都是Feed&#xff0c;比如朋友圈中的一个状态就是一个Fe…

布隆过滤器算法

目录布隆过滤器主要有下面的参数&#xff1a;结论举例布隆过滤器主要有下面的参数&#xff1a; 1.假设数据量为n&#xff0c;预期的失误率为p&#xff08;布隆过滤器大小和每个样本的大小无关&#xff09;。 2.根据n和p&#xff0c;算出BloomFilter一共需要多少个bit位&#x…

【年度总结 | 2022】想干什么就去干吧,少年

&#x1f935;‍♂️ 个人主页: 计算机魔术师 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 程序人生专栏 | 年度总结 &#xff08; 2022 &#xff09; 作者&#xff1a; 计算机魔术师 版本&#xff1a; 1.0 &#xff08…

关于性能测试需要知道的

随着各企业的业务发展、用户量以及数据量的不断增加&#xff0c;系统承载的压力也会随之增加&#xff0c;服务系统的性能好坏又严重影响企业的利益。因此&#xff0c;性能测试重要性与需求越来越强烈。 常见的性能测试目的 性能测试是确定系统在特定工作负载下的稳定性和响应…

JAVA 基础语法——(HelloWorld案例编写,Notepad软件的安装和使用,注释,关键字,常量,变量,计算机存储单元,数据类型,标识符,类型转换)

目录 HelloWorld案例的编写 Notepad软件的安装和使用 注释 关键字 常量 变量 计算机存储单元 数据类型概述 标识符 类型转换 HelloWorld案例的编写 首先定义一个类——–public class 类名在类定义后加上一对大括号 {}在大括号中间添加一个主(main)方法/函数——–publi…