Oracle Database 18.3已经发布有一段时间了,我们在之前的公众号文章当中,向大家介绍了Oracle Database 18.3在Linux上的安装,如果您已经安装了该版本的数据库,那么就请和我一起来探索在18c数据库当中有哪些新特性吧。

  

  按照大家的要求,我们会推出一系类教程,期待您与我们一起一边操作一边学习,体验Oracle Database 18c为我们带来的乐趣。


本期学习目标

1、管理CDB fleet

2、管理PDB快照

3、使用动态容器映射

4、了解lockdown profile inheritance

5、了解refreshable copy PDB switchover

6、了解在Standby数据库上实例化PDB所使用的参数

7、开启PDB级并行语句查询

8、使用DBCA克隆PDB

Oracle Database 18c新特性系列(1)--多租户功能增强_Java

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_02


什么是CDB Fleet?

  这是18c的新特性,我们知道在CDB当中,最多可以有4096个PDB,如果真的有一个application需要的PDB数量超过4096怎么办?在之前的版本中,您必须创建多个CDB。但是在18c当中,我们可以创建CDB Fleet,如上面图中所示,CDB Fleet是将多个CDB整合在一起,形成一个新的逻辑结构。在一个CDB Fleet当中PDB的数量就可以轻松突破4096了。这种逻辑结构是不是很熟悉?大家想想在Oracle的逻辑存储结构当中,还有什么也是这种做法?为了突破某种限制,引入了一项技术?请在留言区留下您的答案。

  CDB Fleet的用途不只是突破4096 PDB的限制,我们还可以根据硬件配置,将PDB部署在不同性能的硬件设备上。如上图所示,我们根据硬件配置不同,划分出两个硬件集群,在左侧的CDB Fleet当中,有三台高性能的硬件,每台服务器上创建一个CDB,三台服务器组成一个高性能的CDB Fleet,在上面创建高资源消耗的PDB。而在右侧,我们使用低性能的廉价硬件组成低性能CDB Fleet,在上面创建对性能要求不高的PDB。常见的场景是,左侧由Oracle Exadata组成CDB Fleet,右侧可以使用用户淘汰下来的硬件来建立低性能的CDB Fleet。

  CDB Fleet的使用,可以集中管理大量的CDB。

  在CDB Fleet当中可以使用Oracle常用的高可用技术,比如RAC,DG、PITR和Flashback等。

  使用CDB Fleet的时候需要注意的是,在一个CDB Fleet当中,PDB的名字是不能重复的,即使他们属于同一个CDB Fleet当中不同的CDB也是不可以的。


Oracle Database 18c新特性系列(1)--多租户功能增强_Java_03

CDB lead和CDB Member

  在一个CDB Fleet当中,有一个CDB Lead和多个CDB memeber,每个CDB当中PDB的信息,都会同步到CDB Lead当中。通过CDB Lead可以监控CDB Fleet当中所有的PDB情况,可以查询CDB Fleet中所有PDB的诊断信息和统计信息。

  如何创建一个CDB Fleet呢?首先您要有多个CDB,然后选择一个CDB作为CDB Lead,然后通过dblink将CDB member与CDB Lead相连。

  在下面的实验当中,我有两个CDB,dbname分别为CDB1和CDB2,他们带有的PDB分别为PDB1和PDB2.  我们将CDB1作为CDB lead,将CDB2作为CDB member。

  首先登录CDB1,执行如下语句,将CDB1转换的CDB lead。


Oracle Database 18c新特性系列(1)--多租户功能增强_Java_04


为system用户授予sysoper权限 

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_05

后登录CDB2,将CDB2作为CDB Fleet的member。下面马赛克部分为system用户的密码。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_06


在CDB lead上查看全局统计信息

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_07

刚才我们说到在CDB lead上面可以查看全局PDB信息,我们通过观察下面的语句,发现在常规的语句当中多加入了CONTAINERS关键字,并使用括号将我们以前使用的数据字典或者动态性能视图括起来了。从下面的结果来看,确实查询出所有PDB的数据文件信息。


Oracle Database 18c新特性系列(1)--多租户功能增强_Java_08

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_09


PDB快照应用

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_10

  说到基于时间点的数据库恢复,您能想到什么?比如RMAN的基于时间点或者SCN的不完全恢复,还有数据库闪回,表的闪回等等。在18c当中,我们可以为PDB创建快照,然后基于快照将PDB调整到特定时间点。我们也可以从PDB的快照创建出新的PDB。

  您可能有疑问,PDB的快照有什么用呢?比如现在是月中旬,您想针对上个月末的数据库中的数据出一份报表。如果将数据库全部恢复到上个月月末,这未必动作过大了,现在可以通过PDB快照技术,轻松实现您的历史数据查询需求。

  PDB的快照个数是无限制的吗?不是,我们通过下面的查询看看默认情况下,PDB的快照是多少。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_11

  通过查询,我们可以看到该值默认是8(这个值也是该参数的最大值。原文为:The default is for the property is 8, which is also the maximum value.),如果我们生成的快照超过8会怎样呢?那么最早的快照将被删除。但如果要被删除的快照正在被使用或者被打开,那么您将收到一条报错信息。

 如何修改这个值?要来到特定的PDB进行修改,并且给出的值不能超过8.

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_12

  如何删除PDB的快照?也是通过这个参数,只要来到特定的PDB,将这个参数值设定为0即可。这里我就不做操作了。

  接下来我们尝试创建PDB快照。创建PDB快照的方法有两种,一种是手动创建,一种是设定一个时间表,让系统自动创建。

  在下面的例子中,我们首先手动创建了一个PDB的快照,请注意,请先登录到特定的PDB,比如当前例子中的PDB1.在下面的例子中,我们可以设定每24小时自动创建PDB快照,也可以将PDB快照的功能关闭。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_13


如何查询已经创建的快照,并将他们删除呢?请参考如下语句。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_14


大家也许会问,创建PDB的快照有什么应用呢?如我们刚才所说,我们可以用PDB快照创建出新的PDB,从而对历史数据进行查询。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_15

  在下图当中显示的利用PDB快照闪回PDB很有趣,与其说“闪回”,莫不如说是将错误的PDB删除,然后从快照当中创建PDB,再将之前有问题的PDB删除,将从快照中创建的PDB改名为原来的名字。

具体操作如下:

1、关闭PDB1.

2、利用PDB快照创建新的PDB

3、将原有的PDB删除。

4、将刚创建的PDB改名为之前的名字,比如PDB1.

5、将PDB1打开,并创建新的快照。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_16


容器映射

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_17

  

  分区技术,大家都很熟悉了,在Oracle当中提供各种分区方式,可以根据您的需要,将数据存储在不同的表空间当中,而不同的表空间,可以对应不同等级的存储设备。在12c当中,引入了容器映射技术,可以将一个表中的数据存储在不同的PDB当中,而不只是表空间。有些朋友认为这项技术并没能从本质上带来性能提升和管理上的便捷,但这是个见仁见智的问题,也许您可以通过精心的配置,达到您所期待的效果,这也是没有问题的呀。

  接下来我们看看这项技术如何实现。

  首先我们设定一下场景:假设我们有一个非常大的表叫做emp,我希望洛杉矶的员工数据进入LosAngeles这个PDB,而“埃尔赛贡多”的员工数据进入ElSEgundo这个PDB。

1、来到CDB1这个容器数据库,创建application container PDB,这个PDB可以认为是数据访问的总入口,这里并不存储具体数据。我们将这个PDB命名为CA,请注意创建数据库时使用的语句。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_18

2、接下来创建保存具体数据的PDB,分为叫做LosAngeles和ElSegundo。请注意,这两个PDB的创建不是在CDB1下完成的,而是要进入CA这个 application container PDB中完成。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_19

3、创建映射关系,也就是告诉数据库查询数据的时候要去哪个PDB。这里请大家注意的是,这个表看起来和之前我们使用的分区表没什么区别,但是仔细观察会发现,分区的名字和我们刚才创建的用来保存具体数据的PDB是同名的。然后在当前的application container当中启动这个映射关系。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_20

4、创建保存数据的表emp,请注意,这个操作是在CA这个application container当中完成的,而不是LosAngeles或者ElSegundo当中。创建emp之后,需要启动映射关系,具体操作步骤参考下面操作。

可以通过下图中的SQL语句,检查emp表是否已经启动了映射关系。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_21

5、插入数据。数据的插入可以来到特定的PDB插入。但是小伙伴们会有疑惑,在LosAngeles和ElSegundo这两个PDB当中,并没有emp这个表呀?如何插入数据呢?

  我们首先要做的是信息同步。具体操作见下图。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_22

6、查询数据,我们来到application container,CA,在这里进行数据查询。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_23

7、关于更新问题,我们查询数据是在application container当中进行的,在当前的例子是CA这个PDB,但是更新数据,大家自己看看下面的操作。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_24

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_25

  刚才介绍的技术在12c就已经提供了,在18c当中,您可以动态设定映射关系。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_26


锁定概要文件

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_27


  为了控制连接到PDB上的用户所做的操作,在12c当中引入了锁定概要文件的特性,具体锁定内容可以参考我们的官方文档。但在12c当中,锁定是在CDB级别设定的,而且没有继承关系。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_28

  在18c当中,可以在多个级别设定锁定概要文件,并且概要文件之间可以存在继承关系。下面是使用lockdown profile的一个例子。在这个例子当中,我们禁止登录PDB之后使用alter system语句。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_29

  如何清除lockdown profile呢?请参考如下操作。这个操作是在CDB上完成的。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_30

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_31

  刚才我们说到在18c的lockdown prifile当中是可以提供继承关系的,这种继承关系体现为静态继承和动态继承。差别在于创建新的lockdown profile的时候,使用的语句不同。如果使用的是from,表示静态继承,比如lockdown profile B 是 from A创建的,在创建之后,我们修改A的内容,不会影响到B。如果使用的是including,表示动态继承。如果lockdown profile B是从A include过来的,日后对A的修改,也会影响到B。

可刷新的克隆PDB

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_32

  这是12c的技术,我们可以创建类似之前Active Data Guard这样的数据保护模式。在下面的例子当中,我们在cdb2上创建一个pdb,这个pdb是从cdb1的pdb1克隆过来的,请注意这里我们使用了dblink,这个dblink是在之前操作中使用过的。我们设定新创建的可刷新pdb的刷新周期是1分钟。我们创建的可刷新克隆pdb要以read only的方式打开。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_33


在cdb1上的pdb1当中创建数据表hr.emp1并插入数据。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_34

稍等片刻,回到pdb1_on_cdb2。我们就可以看到刚才在cdb1中的pdb1插入的记录了。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_35


Oracle Database 18c新特性系列(1)--多租户功能增强_Java_36

  在18c当中可刷新的克隆PDB可以实现类似Active DataGuard的switchover功能,可以在主库和备库之间进行切换。如果想实现该功能,记得提前创建dblink,如上图中的语句进行操作即可。


PDB级的并行语句队列

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_37

  在12c时,我们设定的并行度是在CDB级别的,在18c当中PDB的DBA可以在PDB级别设定SQL的并行度。还有一个值得一提的功能是,在18c当中DBA可以在CDB或者PDB级别通过ALTER SYSTEM CANCEL SQL来kill掉一个消耗资源过多的SQL语句。另外,在12c当中,如果一个并行SQL在队列中等待时间过长,DBA可以手动进行干预,或者使用资源计划进行调整。在18c当中,可以使用PQ_TIMEOUT_ACTION 资源计划来调整并行SQL等待执行超时后的动作。


  关于CPU_COUNT,如果CPU_COUNT设置为PDB级别,则AutoDOP查询生成的最大DOP是PDB的CPU_COUNT。 同样,PARALLEL_MAX_SERVERS和PARALLEL_SERVERS_TARGET的默认值是根据PDB的CPU_COUNT计算的。

使用DBCA创建PDB

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_38

  在12c当中,使用DBCA创建PDB是从SEED数据库创建来的,在18c当中,可以从一个现有的PDB来创建出新的PDB。其实,大家回顾本章中的例子,我们已经使用了将现有PDB作为数据源创建新的PDB。因为本次安装Linux没有安装图形界面,所以就不给大家演示了。就像在北方的一句玩笑话“能动手就少吵吵”一样,能使用命令行的,就少用图形界面。这也是为什么好多参加过OCM考试的同学都要练习手动建库一样。

Oracle Database 18c新特性系列(1)--多租户功能增强_Java_39

  今天的内容就到这里了,在本系列的下一个文档当中,将向大家介绍《18c当中的RMAN增强》,期待您继续支持我们的公众号。

  在本文当中存在的错误和不足,也恳请大家在留言区指出,感谢各位的支持与帮助,谢谢!

往期文章:

Oracle Database 18.3 for Linux安装简介

干货!  一步步教你从Oracle 11gR2 RAC 升级至18c