手把手教你19c新特性:SQL隔离_Java

今天向大家介绍Oracle Database 19c的新特性,SQL隔离。他的作用是防止消耗资源过多的SQL语句拖慢系统或者导致系统无法访问的情况发生。也许大家会说,这项功能早在10g就可以通过资源计划来实现啊。但19c当中的SQL隔离与之前的资源计划是不同的,比如在之前的资源计划当中,我们设定了一个规则,如果SQL执行时间超过20秒,那么就取消这个SQL的执行。在实际的运行中,这个SQL必须执行到了特定的时间或者已经消耗了特定的资源才能够停止或者做其他的转换动作,比如换到其他的资源组。如果是这样的话,资源和时间都已经消耗完毕了。如果使用19c的SQL隔离功能,那么就可以直接阻止SQL的执行,避免资源被消耗。关于SQL隔离的创建与配置,可以通过如下方式:

SQL隔离实现

  • 通过EM

  • 通过SQL命令

SQL隔离配置的工作方式

  • 自动:自动从资源计划捕获并继承参数设定

  • 手动:使用DBMS_SQLQ包中的存储过程

在今天的例子中,我们先通过EM创建资源计划,让系统自动生成SQL隔离,然后我们再向大家介绍手工创建SQL隔离的方式。

手把手教你19c新特性:SQL隔离_Java_02

资源计划在很早的数据库版本中就向大家提供了,所以关于资源计划的细节,这里就不再赘述了,大家可以在网路上找到好多相关的中文文档和使用案例。

在本实验中,我们创建一个资源计划,然后限制那些执行超过5秒的SQL语句,我们是出于实验目的才将这个值设定为比较小,您在工作中可以根据具体情况来设定这个值。

创建资源计划的方式有很多种,常见的有使用DBMS包中的存储过程来创建,也有使用Enterprise Manager Cloud Control来创建。最简单的方法就是通过Enterprise Manager Cloud Control来创建,只需动动鼠标即可轻松创建。但有些朋友会抱怨说,Enterprise Manager Cloud Control虽然好用,但是安装非常麻烦,首先要安装数据库软件,然后使用特定模板创建符合EM要求的数据库,之后再部署EM。在部署的过程中,如果执行脚本出现错误,只能重新安装。一般需要几个小时的时间才能安装完成。现在Oracle MarketPlace当中直接向大家提供了创建好的EM13c镜像,您只需要创建一个OCI instance,然后让系统自己执行安装,大概最多20分钟就完成了EM的创建,本次我使用的是2C 30GB的OCI环境,从开始创建instance,到出现下面的管理界面,使用15分钟的时间(该时间仅供参考)。

手把手教你19c新特性:SQL隔离_Java_03

接下来我们就使用EM13c来创建用户组及资源计划。

第一步:我们先创建一个用于测试的用户user001

手把手教你19c新特性:SQL隔离_Java_04

第二步:进入EM13c来到ORCLPDB1这个PDB

手把手教你19c新特性:SQL隔离_Java_05

第三步:在管理菜单中,找到资源计划

手把手教你19c新特性:SQL隔离_Java_06

手把手教你19c新特性:SQL隔离_Java_07

第四步:创建Consumer Groups

我们刚才创建了一个用户user001,现在将这个用户放入CG001这个Consumer Groups当中。您在工作中,可以将多个用户按照业务类型或者功能类型进行划分,将他们放入相同的资源组当中。

手把手教你19c新特性:SQL隔离_Java_08

手把手教你19c新特性:SQL隔离_Java_09

通过按添加按钮,将user001添加进来

手把手教你19c新特性:SQL隔离_Java_10

第五步:创建资源组映射

我们将刚才创建的CG001组与user001这个用户映射起来。

手把手教你19c新特性:SQL隔离_Java_11


手把手教你19c新特性:SQL隔离_Java_12

手把手教你19c新特性:SQL隔离_Java_13

完成之后的样子如下图:

手把手教你19c新特性:SQL隔离_Java_14

第六步:创建资源计划

我们今天创建一个资源计划,限制SQL语句执行的时间,如果超过5秒钟就取消SQL的执行。

手把手教你19c新特性:SQL隔离_Java_15

将CG001添加进来

手把手教你19c新特性:SQL隔离_Java_16

设定运行时间限制及到达时间限制之后的动作。您可以根据自己的情况修改相应的资源限制。

手把手教你19c新特性:SQL隔离_Java_17

接下来激活资源计划

手把手教你19c新特性:SQL隔离_Java_18

第七步:在ORCLPDB1当中创建两个比较大的table并执行运行较长时间的SQL

手把手教你19c新特性:SQL隔离_Java_19

我们第一次执行这个大SQL的时候,会收到资源计划的阻止信息,说这个语句执行时间超过限制。

手把手教你19c新特性:SQL隔离_Java_20

稍后再次执行相同的语句,就会发现SQL隔离也生效了。这可以认为是SQL隔离的自动设定方式,所用参数来自资源计划。

手把手教你19c新特性:SQL隔离_Java_21

如果大家不想通过资源计划捕获并自动生成SQL隔离,那么可以使用DBMS手动生成隔离,接下来就为您介绍手动方式设定SQL隔离。

手把手教你19c新特性:SQL隔离_Java_22

通过DBMS package进行设定,大致有如下几个步骤:

1、创建资源计划

2、创建SQL隔离策略:可以根据已知的SQL_ID或者SQL_TEXT来创建。

3、修改SQL隔离参数:比如CPU_TIME等。

4、启动和关闭SQL隔离策略:SQL隔离策略在创建之后,默认情况下是直接被启用的。

第一步:创建SQL隔离策略

因为刚才我们 已经创建并生效了资源计划,所以这里就不再创建了。

如我们刚才所说,您可以根据SQL_ID或者SQL_TEXT进行设定,我们今天就使用SQL_TEXT进行设定。请以sys身份登录ORCLPDB1

手把手教你19c新特性:SQL隔离_Java_23

第二步:设定隔离参数

关于隔离参数的设定,大家可以点击“阅读原文”获取更多参数说明。

手把手教你19c新特性:SQL隔离_Java_24

我们今天就只设定CPU time和Elapsed time,刚才创建了SQL隔离计划,先查出这个计划的名字,然后再设定相应的参数。

手把手教你19c新特性:SQL隔离_Java_25

通过观察,您可以看到CPU time和Elapsed time目前都是ALWAYS,表明还没有设定。

接下来,我们将这两个参数都设定为5秒。

手把手教你19c新特性:SQL隔离_Java_26

我们去检查一下我们的设定。

手把手教你19c新特性:SQL隔离_Java_27

第三步:尝试执行一个大的查询

我们刚才是通过SQL_TEXT进行设定的,那么我们现在就执行刚才设定的SQL语句。首先要换到user001这个用户。

手把手教你19c新特性:SQL隔离_Java_28

大家通过观察发现,第一次执行这个SQL语句,还是资源计划在阻止它,也就是说,先执行一会儿,达到资源计划的设定值的时候,再阻止运行。再次执行这个语句的时候,就会看到下方的结果。这个语句没有被数据库执行,而是直接终止掉。并且提示的信息变成ORA-56955: quarantined plan used

手把手教你19c新特性:SQL隔离_Java_29

最后的小贴士:

1、目前这个功能在Exadata和ExaCS上为大家提供,如果您使用的其他版本的数据库,可以继续使用资源计划来进行资源管理。

2、建议大家使用EM13c创建资源计划,然后让系统自动生成SQL隔离,您可以通过DBMS包对SQL隔离中的参数进行调整。

3、SQL隔离生成之后,可能会出现没有及时刷新到SMB当中,请稍等片刻再查询。

今天的内容就到这里,感谢您的点阅,谢谢。

手把手系列文章:

手把手教你升级到Database 19c(1)

手把手教你升级到Database 19c(2)

手把手教你升级到Database 19c(3)

手把手教你19c新特性:自动索引

手把手教你19c新特性:实时统计信息收集

手把手教你19c新特性:混合分区表