本文中作者将对c集群ASM以及RAC数据库新增和改进方面广泛介绍同时列举一些对开发者而言非常有用的新特性
文章导读
ASM中的增强
网格基础架构的增强
Oracle RAC的增强
如何在子表包含数据的情况下截断一个主表
限制TopN查询结果的记录
SQL*Plus的各种增强
会话级序列
WITH语句的改善
扩展数据类型 自动存储管理(ASM)中的增强Flex ASM在一个典型的网格基础架构安装环境中每个节点都运行自身的ASM实例并将其作为运行于此节点上数据库的存储容器但这种设置会存在相应的单点故障危险例如如果此节点上的ASM实例发生故障则运行于此节点上的所有数据库和实例都会受到影响为了避免ASM实例的单点故障Oracle c提供了一个名为Flex ASM的功能Flex ASM是一个不同的概念和架构只有很少数量的ASM实例需要运行在集群中的一些服务器上当某节点上的一个ASM实例发生故障Oracle集群就会在另一个不同的节点上自动启动替代ASM实例以加强可用性另外这一设置还为运行在此节点上的实例提供了ASM实例负载均衡能力Flex ASM的另一个优势就是可以在单独节点上加以配置
当选择Flex Cluster选项作为集群安装环境的第一部分时鑒于Flex Cluster的要求Flex ASM配置就会被自动选择传统集群同样也适用于Flex ASM当你决定使用Flex ASM时你必须保证所需的网络是可用的你可以选择Flex ASM存储选项作为集群安装环境的一部分或是使用ASMCA在一个标准集群环境下启用Flex ASM以下命令显示了当前的ASM模式$ /asmcmd showclustermode $ /srvctl config asm或是连接到ASM实例并查询INSTANCE_TYPE参数如果输出值为ASMPROX那么就说明Flex ASM已经配置好了
ASM存储限制放宽ASM存储硬性限额在最大ASM 磁盘群组和磁盘大小上已经大幅提升在 c R中ASM支持个ASM磁盘群组而在g R中只支持个同样相比起在g R中 PB的磁盘大小现在已经将这一数字提高到 PB对ASM均衡操作的优化c 中新的EXPLAIN WORK FOR 语句用于衡量一个给定ASM均衡操作所需的工作量并在V$ASM_ESTIMATE动态视图中输入结果使用此动态视图你可以调整POWER LIMIT 语句对重新平衡操作工作进行改善例如如果你想衡量添加一个新ASM磁盘所需的工作量在实际执行手动均衡操作之前你可以使用以下命令SQL> EXPLAIN WORK FOR ALTER DISKGROUP DG_DATA ADD DISK data_SQL> SELECT est_work FROM V$ASM_ESTIMATESQL> EXPLAIN WORK SET STATEMENT_ID=ADD_DISK FOR ALTER DISKGROUP DG_DATA AD DISK data_SQL> SELECT est_work FROM V$ASM_ESTIMATE WHERE STATEMENT_ID = ADD_DISK你可以根据从动态视图中获取的输出来调整POWER的限制以改善均衡操作
ASM 磁盘清理在一个ASM磁盘群组中新的ASM磁盘清理操作分为正常或高冗余两个级别它可以检验ASM磁盘群组中所有磁盘的逻辑数据破坏并且可以自动对逻辑破坏进行修复如果检测到有逻辑数据破坏就会使用ASM镜像磁盘磁盘清理可以在磁盘群组特定磁盘或是某个文件上执行这样其影响可降到最小程度以下演示了磁盘清理场景SQL> ALTER DISKGROUP dg_data SCRUB POWER LOWHIGHAUTOMAXSQL> ALTER DISKGROUP dg_data SCRUB FILE +DG_DATA/MYDB/DATAFILE/filenamexxxxxxxx REPAIR POWER AUTOASM的活动会话历史(ASH)
V$ACTIVE_SESSION_HISOTRY 动态视图现在还可以提供ASM实例的活动会话抽样然而诊断包的使用是受到许可限制的
网格(Grid)基础架构的增强Flex 集群Oracle c 在集群安装时支持两类配置传统标准集群和Flex集群在一个传统标准集群中所有集群中的节点都彼此紧密地整合在一起并通过私有网络进行互动而且可以直接访问存储另一方面Flex集群在Hub和Leaf节点结构间引入了两类节点分配在Hub中的节点类似于传统标准集群它们通过私有网络彼此互连在一起并对存储可以进行直接读写访问而Leaf节点不同于Hub节点它们不需要直接访问底层存储相反的是它们通过Hub节点对存储和数据进行访问
你可以配置多达个Hub节点而Leaf节点则可以更多在Oracle Flex集群中无需配置Leaf节点就可以拥有Hub节点而如果没有Hub节点的话Leaf节点是不会存在的对于一个单独Hub节点你可以配置多个Leaf节点在Oracle Flex集群中只有Hub节点会直接访问OCR和Voting磁盘当你规划大规模的集群环境时这将是一个非常不错的功能这一系列设置会大大降低互连拥堵并为传统标准集群提供空间以扩大集群
部署Flex 集群的两种途径 在配置一个全新集群的时候部署 升级一个标准集群模式到Flex集群如果你正在配置一个全新的集群你需要在步骤中选择集群配置的类型选择配置一个Flex集群选项然后你需要在步骤中对Hub和Leaf节点进行分类对于每个节点选择相应角色是Hub或是Leaf而虚拟主机名也是可选的
将一个标准集群模式转换为Flex 集群模式需要以下步骤 用以下命令获取集群的当前状态$ /crsctl get cluster mode status 以root用户执行以下命令$ /crsctl set cluster mode flex $ /crsctl stop crs $ /crsctl start crs –wait 根据设计改变节点角色$ /crsctl get node role config $ /crsctl set node role hub|leaf $ /crsctl stop crs $ /crsctl start crs wait注意?你无法从Flex恢复回标准集群模式?改变集群节点模式需要集群栈停止?确保以一个固定的VIP配置GNS ASM磁盘群组中的OCR备份对于cOCR现在可以在ASM磁盘群组中得以备份这简化了通过所有节点对OCR备份文件的访问为了防止OCR的恢复你不必担心OCR最新的备份是在哪个节点上可以从任何节点轻易识别存储在ASM中的最新备份并能很容易地执行恢复
以下演示了如何将ASM磁盘群组设置为OCR备份位置$ /ocrconfig backuploc +DG_OCR支持IPv协议对于cOracle是支持IPv网络协议配置的你现在可以在IPv或IPv上配置共有或私有网络接口尽管如此你需要确保在所有集群中的节点上使用相同的IP协议
RAC数据库的增强Whatif命令评估通过srvctl使用新的Whatif命令评估选项现在可以确定运行此命令所造成的影响这一新添加到srvctl的命令可以在没有实际执行或是不对当前系统做任何改变的情况下模拟此命令这在想要对一个已存在的系统进行更改却对结果不确定的时候特别有用这样此命令就会提供进行变更的效果而–eval 选项也可以通过crsctl 命令来使用
例如如果你想要知道停止一个特定数据库会发生什么那么你就可以使用以下示例$ /srvctl stop database –d MYDB –eval $ /crsctl eval modify resource attr value
srvctl的改进对于srvctl命令还有一些新增功能以下演示了如何用这些新增功能停止或启动集群上的数据库或实例资源
srvctl start database|instance –startoption NOMOUNT|MOUNT|OPEN srvctl stop database|instance –stopoption NOMOUNT|MOUNT|OPEN 截断表CASCADE在之前的版本中在子表引用一个主表以及子表存在记录的情况下是不提供截断此主表操作的而在c中的带有CASCADE操作的TRUNCATE TABLE可以截断主表中的记录并自动对子表进行递归截断并作为DELETE ON CASCADE服从外键引用由于这是应用到所有子表的所以对递归层级的数量是没有CAP的可以是孙子表或是重孙子表等等
这一增强摈弃了要在截断一个主表之前先截断所有子表记录的前提新的CASCADE语句同样也可以应用到表分区和子表分区等
SQL> TRUNCATE TABLE CASCADESQL> TRUNCATE TABLE PARTITION CASCADE如果对于子表的外键没有定义ON DELETE CASCADE 选项便会抛出一个ORA错误
对TopN查询结果限制记录在之前的版本中有多种间接手段来对顶部或底部记录获取TopN查询结果而在c中通过新的FETCH FIRST|NEXT|PERCENT语句简化了这一过程并使其变得更为直接为了从EMP表检索排名前的工资记录可以用以下新的SQL语句SQL> SELECT enoenamesal FROM emp ORDER BY SAL DESC FETCH FIRST ROWS ONLY以下示例获取排名前N的所有相似的记录例如如果第十行的工资值是并且还有其他员工的工资符合排名前N的标准那么它们也同样会由WITH TIES语句获取
SQL> SELECT enoenamesal FROM emp ORDER BY SAL DESC FETCH FIRST ROWS ONLY WITH TIES以下示例限制从EMP表中获取排名前%的记录SQL> SELECT enoenamesal FROM emp ORDER BY SAL DESC FETCH FIRST PERCENT ROWS ONLY以下示例忽略前条记录并会显示表的下条记录SQL> SELECT enoenamesal FROM emp ORDER BY SAL DESC OFFSET ROWS FETCH NEXT ROWS ONLY所有这些限制同样可以很好的应用于PL/SQL块
BEGIN SELECT sal BULK COLLECT INTO sal_v FROM EMP FETCH FIRST ROWS ONLYEND 对SQL*Plus的各种增强SQL*Plus的隐式结果c中在没有实际绑定某个RefCursor的情况下SQL*Plus从一个PL/SQL块的一个隐式游标返回结果这一新的dbms_sqlreturn_result过程将会对PL/SQL 块中由SELECT 语句查询所指定的结果加以返回并进行格式化以下代码对此用法进行了描述SQL> CREATE PROCEDURE mp res sys_refcursorBEGIN open res for SELECT enoenamesal FROM empdbms_sqlreturn_result(res)ENDSQL> execute mp当此过程得以执行会在SQL*Plus上返回格式化的记录
显示不可见字段在本系列文章的第一部分我已经对不可见字段的新特性做了相关阐述当字段定义为不可见时在描述表结构时它们将不会显示然而你可以通过在SQL*Plus提示符下进行以下设置来显示不可见字段的相关信息SQL> SET COLINVISIBLE ON|OFF以上设置仅对DESCRIBE 命令有效目前它还无法对不可见字段上的SELECT 语句结果产生效果
会话级序列在c中现在可以创建新的会话级数据库序列来支持会话级序列值这些序列的类型在有会话级的全局临时表上最为适用
会话级序列会产生一个独特范围的值这些值是限制在此会话内的而非超越此会话一旦会话终止会话序列的状态也会消失以下示例解释了创建一个会话级序列SQL> CREATE SEQUENCE my_seq START WITH INCREMENT BY SESSIONSQL> ALTER SEQUENCE my_seq GLOBAL|SESSION对于会话级序列CACHE NOCACHE ORDER 或 NOORDER 语句会予以忽略
WITH语句的改善在c中你可以用SQL更快的运行PL/SQL函数或过程这些是由SQL语句的WITH语句加以定义和声明的以下示例演示了如何在WITH语句中定义和声明一个过程或函数WITH PROCEDURE|FUNCTION test (…)
BEGIN ENDSELECT FROM table_name/尽管你不能在PL/SQL单元直接使用WITH语句但其可以在PL/SQL单元中通过一个动态SQL加以引用
扩展数据类型在c中与早期版本相比诸如VARCHAR NAVARCHAR以及 RAW这些数据类型的大小会从K以及K字节扩展至K字节只要可能扩展字符的大小会降低对LOB数据类型的使用为了启用扩展字符大小你必须将MAX_STRING_SIZE的初始数据库参数设置为EXTENDED要使用扩展字符类型需要执行以下过程 关闭数据库 以升级模式重启数据库 更改参数 ALTER SYSTEM SET MAX_STRING_SIZE=EXTENDED 执行 utlksql as sysdba SQL> @?/rdbms/admin/utlksql 关闭数据库 以读写模式重启数据库对比LOB数据类型在ASSM表空间管理中扩展数据类型的字段以SecureFiles LOB加以存储而在非ASSM表空间管理中它们则是以BasciFiles LOB进行存储的
注意一旦更改你就不能再将设置改回STANDARD