Oracle Database 12c已经发布好几年了,12.2版本也即将发布。与之前版本相比,12c引入了很多新特性,对原有的功能进行了很多改进。而与其名称后缀c,也就是cloud相对应,Oracle Database 12c引入了最为亮眼的多租户架构。
由于最近工作环境中已经开始用12c,所以将一些知识总结一下。本文内容是有关12c的多租户架构的一些概念,来自Oracle Database 12cR1 concepts文档。
一、多租户架构介绍
什么是多租户架构呢?
多租户架构使得oracle 数据库成为了一个多租户的容器数据库,也就是container database,也就是CDB。而一个CDB可以包含0个、一个或者多个用户创建的可插入的数据库,也就是pluggable database,也就是PDB,也就是所谓的“租户”。这就像合租房一样,每个租户可以获得其所需的各种资源。也可以说CDB就是各PDB的母体。
每个PDB对于外界用户来讲,跟传统的数据库是没什么区别的,也就是说这些底层的架构对于前端来讲是透明的。
多租户架构有什么好处?
一切改进都要从需求出发。多租户架构也是基于愈发复杂的数据库环境而产生的,它最直接的好处就是可以集中管理。而这里的前提就是环境比较复杂,或者说数据库比较多,如果只有一个数据库需要管理,那用不用多租户也就没意义了。
另外,多租户架构使得数据库可以作为一种服务来提供,而且非常便捷,非常有弹性,这正契合云的特性。
更具体的好处,Oracle的官方文档列了很多,可自行查看。
另外补充一点,在12c版本,你可以将数据库创建为多租户架构或者非多租户架构(CDB or non-CDB),后者跟以前版本的架构是一样的,而如果选择前者,要进一步使用的话还要在其中创建PDB。特别注意的是CDB和非CDB是不能互相转换的。
二、多租户架构概览
大致包括以下方面内容:
CDB中的容器
CDB中的服务
CDB中的用户和角色
CDB中的数据库文件
1. CDB中的容器
多租户架构,也即容器数据库,其内部是有许多租户的,这些租户也可以称之为容器,从逻辑上讲,这些容器都可以被看作独立的数据库。。在一个CDB内部,每个容器有一个唯一的ID和名字。
CDB中的容器又有三类:
1)有且只有一个ROOT容器
Root容器用来存储整个CDB的元数据和一些通用信息,名称为CDB$ROOT。不言而喻,它就是整个CDB的根容器。
Root容器是系统提供的,不要向其中添加应用数据,也不要随意修改其中的内容。
2)有且只有一个种子PDB(seed PDB)
种子PDB其实就是系统提供的建库模板,是只读的,名称为PDB$SEED。
3)零个或多个用户定义的PDB
这些PDB就是用户根据需要创建的,来为不同的应用提供服务。CDB刚创建时是没有它们的,需要后期自行创建。
且看下图:
图中上半部分很清楚地说明了CDB的架构。
PDB之间有很好的隔离性,对于使用者(或者说应用用户)来讲,跟普通数据库没什么区别。而对于管理员来讲,自然还要搞清楚一些细节。如上图的下班部分,从物理层面(也即文件层面),PDB之间是否是完全隔离的呢?这可以参考之后有关数据库文件的说明。
需要补充说明的是,在多租户架构下,数据库实例结构是怎样的呢?当我们安装好数据库软件,首次创建数据库时,不管选择CDB模式还是非CDB模式,都会生成与数据库对应的实例。实例就是一组内存结构和一组进程,用来访问和操作数据库。在多租户架构下,实例是CDB级别的,也就是说在一个CDB内部,所有的PDB都共享这个实例。在实例运行中很重要的SGA、UNDO、REDO等等机制和组件,也是在CDB级别统一管理的。这也很容易理解,因为如果不是这样,所谓整合也就无从谈起了。
讲到这里,很容易联想到其他数据库产品。过去其他数据库是类似于单实例多库的结构,而Oracle非常完美地实现了表空间结构,再加上用户,在一个库内就可以进行很好的数据分割。而后Oracle实现了RAC,即单库多实例,在实例级别Oracle数据库有了更好的性能扩展和高可用性,这是其他产品没有的。如今,多租户架构加上RAC,则是多实例多库了(其实还是单库,单个CDB),那么这个所谓“多库”何以取代多表空间呢?不就是噱头而已么?我个人理解,PDB较之表空间隔离性和完整性肯定更高。
2. CDB中的数据库文件
从物理的角度来讲,CDB和非CDB有着基本相同的结构,除了CDB中的PDB有其自己的表空间集合(包括它自己的SYSTEM和SYSAUX表空间)和数据文件。
如下图:
如上所示,一个CDB包含如下文件:
1) 一份控制文件
2) 一份在线redo日志
3) 一组或多组临时文件
默认情况下,一个CDB有一个叫做TEMP的临时表空间,为每个PDB所用。你可以选择创建不同的默认临时表空间。只有当你连接到root时创建的临时表空间才能作为整个CDB的默认临时表空间。而对于一个PDB,你可以创建一个本地的临时表空间(叫做TEMP),来覆盖CDB范围的临时表空间设置,并将其设为默认临时表空间。
4) 一组undo数据文件
在一个单实例的CDB中,只存在一个活动的undo表空间。对于一个RAC CDB,每个实例拥有一个活动的undo表空间。只有拥有适当权限的通用用户,并且当期当前容器是root时才能创建undo表空间。所有的undo表空间对于所有容器的数据字典和相关视图都是可见的。
5) 每个容器一组系统数据文件
CDB与非CDB数据库在物理上首要的不同之处就是system数据文件。非CDB只有一组system数据文件。相反地,一个CDB中的root容器和每个PDB都有其自己的SYSTEM和SYSAUX表空间,以及其自己完整的描述自身中对象的数据字典表。
6) 0组或多组用户创建的数据文件
在一个典型案例中,每个PDB有其自己的非系统数据文件集。这些数据文件包含了用户在PDB中定义的模式和对象的数据。
PDB中数据字典的存储方式使它可以是便携的。你可以轻易地从CDB拔出或者插入PDB到CDB中。
3. CDB中的服务
该命题与客户端对数据库的访问有关。客户端必须使用服务连接到PDB。客户端要访问一个数据库,无非需要四要素:IP、端口、协议和服务名。而这些信息,在服务端,都要体现在监听上。在一个有CDB的服务器上,可能运行着一个或几个监听程序,而属于各个PDB的服务,需要注册到这些监听上以供外界访问。如下图:
1)CDB中的服务创建
当你创建一个PDB,在CDB内部数据库会自动创建并启动一个服务。该服务会有一个属性展示在在DBA_SERVICES.PDB列中,标识相应的PDB为该服务的初始当前容器。服务与PDB 名称相同。PDB的名字必须是一个合法的服务名,并且在CDB内是唯一的。例如,在上图中名字为hrpdb的PDB有一个默认的服务名hrpdb。默认服务不能被drop掉。
你可以为每个PDB创建更多的服务。每个后加的服务指定其PDB为初始当前容器。上图中,erppdb和hrpdb都存在非默认的服务。
注意:
当同一台计算机上的两个或者更多个CDB使用相同的监听,而且这些CDB中的两个或者多个PDB使用相同的服务名,一个使用该服务名的连接将会随机连接到带有该服务名的PDB。为了避免错误的连接,请确保每个PDB的服务名是唯一的,或者为每个CDB创建不同的监听。
2)连接到CDB中的容器
一个拥有适当权限的CDB管理员可以连接到CDB中的任意容器。可以使用以下任一方法:
第一,使用ALTER SESSION SET CONTAINER语句来在容器之间切换。例如,一个CDB管理员可以通过一个会话连接到root,然后再在这个会话中切换到一个PDB。在这种情况 下,用户需要在这个容器中有SET CONTAINER系统权限。
第二,直接连接到一个PDB 这种情况下,用户需要在这个容器拥有CREATE SESSION权限。
通常作为管理员来讲,可以先以dba身份连接到root容器,然后再去管理各PDB,而对于应用程序来说,直接配置连接到对应PDB即可。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26696047/viewspace-2131917/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26696047/viewspace-2131917/