Oracle 19c 之 RPM 包安装初体验 CDB(二)

2020-06-28 16:19:23 浏览数 (1)

作者 | JiekeXu

来源 | JiekeXu之路(ID: JiekeXu_IT)

转载请联系授权 | (微信ID:xxq1426321293)

大家好,我是 JiekeXu,很高兴又和大家见面了,今天分享下 Oracle 19c 初体验之多租户是个啥。本文首发于微信公众号【JiekeXu之路】,欢迎点击上方蓝字关注我吧!

容器(container)是多租户体系结构中的数据或元数据的逻辑集合。CDB(containerdatabase)容器数据库在图形化创建实例时若勾选了“创建为容器数据库(C)”则会出现容器数据库称之为CDB,否则称之为 Non-CDB,如之前的 11g 数据库就称之为非容器数据库 Non-CDB,那么 PDB(Pluggable Database )在 CDB 下被称作可插拔数据库。19c 还可以选择创建为非容器数据库 Non-CDB,但 20c 以后则强制使用 CDB,不在支持非容器数据库了。

当然也可以使用 SQLplus连接到数据库查看是否为容器数据库,当 V$DATABASE.CDB 列为 YES 也可以说明为容器数据库,也可以使用 show pdbs 查看,如果出现多行则说明为容器数据库。

代码语言:javascript复制
SYS@JiekeXu>SELECT NAME, CDB, CON_ID FROM V$DATABASE;

NAME            CDB           CON_ID
------------------------ ----------
JIEKEXU         YES                0
SYS@JiekeXu> sho pdbs

    CON_ID CON_NAME                       OPEN MODE RESTRICTED
---------------------------------------- ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 JIEKEXUPDB                     READ WRITE NO
         4 JIEKEXUPDB1                    READ WRITE NO

从Oracle 19c 开始,Oracle 的许可也发生了改变,用户可以创建 3 个 PDB 而不需要购物多租户的许可,3 个以上才需要购买多租户的许可,所以鼓励大家升级到 19c ,免费而且长期支持这里就不在多说了,下图中给出关于 CDB 容器数据库的官方结构图。

每个 CDB 包含如下内容:

1)有一个 CDB$ROOT (也简称为根容器):CDB$ROOT 是所有 PDB 所属的模式、模式对象和非模式对象的集合。根存储 oracle 提供的元数据和普通用户。元数据的一个例子是 oracle 提供的 PL/SQL 包的源代码。公共用户是每个容器中都知道的数据库用户。根容器命名为CDB$ROOT.

2) 只有一个系统容器:系统容器包括 CDB$ROOT 和 CDB 中的所有 PDB。因此,系统容器是CDB 本身的逻辑容器。

3)零个或多个应用程序容器:应用程序容器仅由一个 application root 和插入到这个根的 PDB 组成。系统容器包含 CDB 根目录和CDB中的所有 PDB,而应用程序容器只包含插入到应用程序根目录中的PDB。application root 属于 CDB 根,不属于其他容器。

4)零个或多个用户创建的 PDB:PDB 包含特定功能集所需的数据和代码。例如,PDB 可以支持特定的应用程序,例如人力资源或销售应用程序。在创建 CDB 时不存在 PDB。您可以根据业务需求添加 PDB 。一个 PDB 确切地属于零个或一个应用程序容器。如果一个 PDB 属于一个应用程序容器,那么它就是一个应用程序 PDB。例如,cust1_pdb 和 cust2_pdb 应用程序 PDB 可能属于 saas_sales_ac 应用程序容器,在这种情况下,它们不属于任何其他应用程序容器。application seed 应用程序种子是一个可选的应用程序 PDB,充当用户创建的 PDB 模板,使您能够快速创建新的应用程序 PDB。

5)一个种子 PDB

种子 PDB 是系统提供的模板,CDB 可以使用它创建新的 PDB。种子 PDB 被命名为 PDB$SEED。不能在 PDB$SEED 中添加或修改对象,PDB$SEED 默认情况下是只读模式的 PDB。

下面我们类比 11g 经典的体系结构图看一下多租户容器数据库体系结构:

数据库服务器 = 实例 多租户容器数据库

实例(instance) = 内存 后台进程

数据库(database) = 数据文件 控制文件 重做日志文件

如上图所示,在多租户架构下,单个 DB 共享后台进程,内存,以及重做日志文件,控制文件以及位于根容器的元数据,undo 表空间在 12.2 以后的版本中实现本地管理,位于各自的 PDB 中。那么,对于像参数文件,密码文件,告警日志等均有一份,因为实例只有一个,PDB位于数据库中可以是多个,12.2 以后的版本中可以有 4096 个。

在多租户架构中,每个 PDB 使用很少的内存,控制文件和日志文件公用的,那么只有数据文件是位于 PDB 自己特定的目录下。如下图,在新装的 19.6 的 RAC 结构下,只有一个 PDB,通过 v$containers 视图查看到每个 PDB 的名字以及单独的 DBID,还有 CON_ID、CON_UID、GUID。多租户架构西安通过 CON_ID 来识别 PDB,根容器为 1,种子 PDB 为 2,其他PDB 依次往后排,那么 CON_UID是干嘛的呢?CON_ID 不能够唯一标识一个 PDB,当 PDB 迁移,移动时是不会改变的,故需要 CON_UID 来唯一标识一个 PDB。另外这里的 GUID 是一组 32 字节的 hash 值,PDB 建成是便会生成,而且不会随着迁移而改变。

这里通过查询 cdb_data_files 视图查询数据文件所在位置,如下图,发现出现了一串字母数字组成的目录结构,这个是由于 Oracle 使用 OMF 管理,使用 GUID 来作为目录结构唯一标识一个 PDB 。而当使用 dba_data_files 视图来查看数据文件时只查看到当前容器即CDB$ROOT 中的数据文件,使用 cdb_data_files 时才看到了所有的数据文件。为啥呢?

数据字典视图:在原来的数据字典视图基础上,最外层又添加了一个 CDB_XXX 类的视图,即 CDB_XXX > DBA_XXX > ALL_XXX > USERS_XXX。CDB_XXX 可以查看数据库中所有的对象,而 DBA_XXX 可查看 PDB 内的所有对象。

select view_name from dba_views where view_name like 'CDB%';

select table_name from dict where table_name like 'DBA%';

最后说一下公共用户和本地用户,顾名思义在 CDB中的用户便可以称为公共用户,以 C## 或者 c## 开头,所有PDB 均可查看到;本地用户只能是单独 PDB 可查看。

好了,今天就到先这里了,那么,对于容器数据库的切换,连接以及通过多种方式创建 PDB 我们后面再说吧,小伙伴们再见了。写作不易,此文如果对你有帮助,请支持“在看”与转发,您的支持便是我不断写作的最大的动力,让我们一起努力做更好的自己!

参考链接:

https://docs.oracle.com/en/database/oracle/oracle-database/19/multi/introduction-to-the-multitenant-architecture.html#GUID-FC2EB562-ED31-49EF-8707-C766B6FE66B8

0 人点赞