首先我要说明:本文主要目的是帮助初级和中级水平的Oracle专业人士了解Oracle系统及更好地优化它。后面的章节里也介绍了不少专家主题,但首要的任务却是协助那些被性能问题折磨得很沮丧的专业人士,他们正寻求着改善数据库性能的简单诀窍。本文的目标很单纯:提供一个装满此类诀窍的弹药库,在各种不同的情况下您都可以运用它来使系统快起来。
如果您希望仅读一章就能得到优化数据库的方法或者一揽子方案,那么我提供具有如此特点的两章给那些没有时间通读本书的读者。头一个是介绍Statspack和AWR的第14章(Statspack是免费的,但AWR的功能更强):这是两个好得令人难以置信的工具,包含了大多数专家所最常用的脚本,专家们在使用V$视图和X$表优化系统时调用这些脚本(第12和13章中介绍了V$视图和X$表)。第14章花了我很长时间才写成,时间主要花在了更新闩(Latch)等内容和互斥(Mutex)的新内容上。另一个包罗万象的优化章节乃是介绍企业管理器(Enterprise Manager,包括数据库控制器和网格控制器)的第5章。企业管理器提供了图形化的方法来优化您的系统,包括许多用于RAC系统和大规模网格控制的特性。企业管理器为您提供了极佳的、以单一界面来查看和优化多个系统的能力。
简言之,本文讲的是Oracle 11gR1和R2中一些令人感兴趣的新特性。许多新的和改善了的特性都包含在这个版本中。Oracle 11g的目标不仅仅是创造一个更健壮的数据库管理系统,同时还要简化安装和管理的工作,以提高可用性。这种趋势从Oracle 9i就已经开始,在10g里得到延续,在11g中进一步延续下去。Oracle的战略方向就是提供一个完全集成的功能集合,来取代数据库管理员们用以管理他们环境的第三方软件。本文并不会对本章中列出的所有新特性作详细介绍(因为有些特性与优化并无直接的关系,而且本书的篇幅也有限制)。尽管如此,为了使读者对11gR2有个整体印象,我想还是需要这么一章来介绍一些好的特性,而不管它们是否与优化有关。
本章中所涉及的新功能包括:
● 轮到Exadata出场了!
● 高级压缩
● 自动诊断信息库(Automatic Diagnostic Repository,ADR)
● 自动共享内存管理(Automatic Shared Memory Management,ASMM)的改进
● ASM(Automatic StorageManagement,自动存储管理)的改进
● 自动SQL优化
● 数据卫士(Data Guard)的增强
● 数据泵的增强(压缩、加密、传统模式)
● 增强了的统计信息
● 闪回数据存档
● 健康情况监控
● 事件打包服务(IncidentPackaging Service,IPS)
● 不可视索引(invisible index)
● 分区新特性(区间分区、REF分区、系统分区、虚拟列分区、分区顾问)
● 只读表
● RAC One Node和RAC Patching
● 真正应用测试(Real Application Testing)
● SQL性能分析器(SQL Performance Analyzer,SPA)
● 结果集缓存(ResultCache)
● RMAN的新特性
● 安全文件(SecureFiles)
● 流(XStream In、XStream Out、高级压缩支持)的增强
● 临时表空间的收缩
● 透明数据加密(Transparent Data Encryption,TDE)的改进
● 11g新的后台进程
● 11g版本特性对照表
1.1 轮到Exadata出场了!
伴随着Sun 的被收购,一场范式转换的革命发生在数据库市场、硬件界和整个IT行业。虽然这场范式转变才刚刚开始,然而早期的波动预示着重大转变已经到来,未来的十年中还会有更大的转变。这里列出Exadata的一些要点,若想了解更多的细节,则可参阅Exadata那一章(第11章)。Exadata是结合了数据库威力的硬件,它利用了Oracle加在硬件层面的特性,而其他硬件供应商无法轻易地、或者根本不可能复制这些特性。第11章中的一些主题将详细讨论 Exadata的主要优点:
● 闪存(Flash Cache)
闪存是由比普通磁盘快约20-50倍(取决于不同的磁盘)的固态硬盘组成(信息存储于芯片上,满配的机架上可达5TB的容量)。闪存缓存热数据(经常需要访问的数据),这是数据访问的最后一步(它首先返回数据给用户,然后根据用户的设置为下一次的访问缓存这些数据)。
注意
闪存(硬件/芯片)不同于数据库闪存。您可以在Oracle Database 11g和Oracle RAC 11g中使用数据库闪存。如果数据库运行在Solaris或者Oracle Linux操作系统上,那么您可以在线添加可选的数据库闪存。这是一个基于文件扩展的常驻SGA缓冲区的高速缓存(类似于交换区),为数据块提供二级缓存。当数据库被换出SGA时该文件被使用。如果希望了解更多信息,请参阅初始化参数DB_FLASH_CACHE_SIZE。
● 存储索引(Storage Index)
存储索引利用最小值/最大值使查询运行得更快。使用存储索引通常可以达到10倍的性能提升。它们主要维护数据(比如metadata)的摘要信息。内存结构驻留在存储单元(cell)层面上。对于一个存储单元而言,存储索引最多可以储存8个查询表列的最小值/最大值。因此,存储索引指示数据是如何存储在存储单元上的(就像分区的最小值/最大值)。查询一个表时,数据库会检查存储索引以确定为获得所需要的数据都要访问哪些存储单元。Oracle根据不同列上的最小值/最大值搜索数据,在不匹配的情况下就消除在存储单元上的I/O,该过程对用户100%透明。它是在硬件层面上进行的,通常来说每1MB的磁盘就有一个索引条目。Oracle在内部自动完成这项工作而无需任何设置。存储索引还可以为分布极为不均的数据提供巨大的好处。存储索引提供了对高选择性值的快速访问,而对选择性不高的值则通过常规的Exadata卸载来处理。
● 智能扫描(Smart Scan)
智能扫描是Oracle在内部硬件层面执行的。通常来说,可以节省10倍的开销。Oracle基于WHERE子句(谓词)进行过滤,过滤条件包括行、列或连接(Join)。智能扫描无需设置,Oracle在内部自动完成这项工作。
● 混合列压缩(HybridColumnar Compression,HCC)
混合列压缩,也被称为Exadata混合列压缩(EHCC),是指数据由列行混合的格式组成,然后进行压缩,性能可以提高10到30倍。表是由压缩单位(Compression Unit,CU)组织起来的,其中包含约1000行数据(行的多少取决于这些行的数据量)。压缩单元跨越多个数据块。混合列压缩对于批量加载数据来说非常有好处,但它不是为OLTP或单块读操作而构建的。它主要用于数据仓库和被查询的数据,而不是频繁更新的数据。相比于Gzip/Bzip2,混合列压缩通常是其两倍的压缩比和10倍的访问效率。
● 企业管理器网格控制器
Oracle企业管理器网格控制器有个专门的Exadata插件,通过这个插件,您可以很容易地管理和查看Oracle提供给Exadata的许多特性。它还可以确保一切都正常和高效地工作(这部分在第5章以及第11章有介绍)
● 在企业管理器中模拟Exadata
可以在实施Exadata之前,让您在当前运行的系统上模拟Exadata并检查它可以带来的好处。这个特性是SQL性能分析器的一部分,SQL性能分析器是Oracle真正应用测试(Real Application Test,RAT)的一个组件。这个选件需要额外购买。
● I/O资源管理器
Oracle最新的I/O资源管理(IORM)工具可以让Exadata管理多个工作负载,并为每个真正必需的数据库、用户或任务设置资源。IORM给您通过一台机器轻松管理许多系统的能力。
● 安全性
带修改跟踪文件的安全加密备份要快得多了,存储节点还对其提供了解密的硬件加速:Exadata利用CPU在硬件层面加速AES-NI的解密过程,所以即便在使用TDE表空间或列的加密时,您也可以加密和解密(加密的数据在使用智能扫描前解密)。
● 工具
Cellcli是一个查询硬件层面的命令行接口,可用于监控单个存储单元上各种各样的健康指标;DCLI用于查询多个存储单元上的信息,ADR命令行解释工具(ADRCI Command Interpreter)用于诊断。
许多最佳实践将有助于您充分利用Exadata。我先从一个必须做的和不能做的清单开始,然后列出一些最佳实践!请注意,这些可能随时更改(检查Oracle的官方文档以获取最新的信息)。
● 必须安装Bundle Patch 5(参考MOS文献:888828.1以获取最新的补丁)。
● 必须使用ASM(自动存储管理);ASM为Exadata提供文件系统和卷管理器。
● 数据中心必须配备符合要求的制冷系统!这是非常重要的(我建议做一些这方面的研究)。
● 必须在支起的地板之上铺三层打了洞(冷却的原因)的瓷砖来承载整个机架(必须能承受2219磅/964公斤),前后端之间的通风量要在1560CFM和2200 CFM[1]之间,不这样做就可能会热到要融掉!所有这一切都可能会改变,所以请检查最新的规格需求。
● 必须有合格的电力保障。
● 必须安装Oracle Linux 5.3(x86_64)和Oracle Database 11.2(目前推荐)。
● 必须使用RMAN进行备份。
● 考虑使用StorageTek SL500磁带备份(评价很不错,但价格偏贵)。
● 不要添加任何外来的硬件……不支持!
● 不要更改BIOS/驱动……不支持!
下面是一些其他的最佳实践:
● 使用4MB大小的ASM分配单元(Allocation Unit,AU)(目前推荐)。
● 创建Celldisk和Griddisks时使用“CREATE ALL”。
● 使用DCLI一次性在所有存储服务器上执行命令(有用而且节省时间)。
● 使用IORM管理资源。
● 安装之前确定您的快速恢复区(Fast Recovery Area,FRA)和MAA需求。
● 数据库使用11.2.0.1以上版本(11.2.1.3.1)和ASM的11.2.0.1以上版本(目前最低要求)。
● 必须兼容11.2.0.1以上版本(目前最低要求)。
● 使用32GB大小的日志文件。
● 使用本地管理表空间(Locally Managed Tablespace,LMT)和4MB的统一大小区(Extent)。
● 使用数据泵移动数据(通常使用这个工具,您也可以有很多其他选择)。
● 使用默认的初始化参数启动,根据您的工作负载在需要的时候再调整。
本书写作的时候,下面提到的数据库机器已经就位,截止2011年6月Oracle已经卖出了第1 000台Exadata机器。现在的Exadata机器提供了150万闪存IOPS(每秒的I/O)。您读到这段文字的时候,这个数字一定又刷新了。正如加速了软件世界那样,Oracle正在加快它们的硬件世界。如果Oracle继续这种加速的话,广受欢迎的电影“钢铁侠”中的世界可能并不像想象的那么遥远。在影片中,钢铁侠甚至“访问Oracle网格”。不知您注意到了没有,拉里·埃利森也出现在电影中。软硬一体的工程正在改变游戏规则!
第2版(X2-2)Exadata机器由Oracle公司(Sun)独家制造,它包括:
● 8台计算服务器(型号4170 M2)
Ø 8台服务器×2 CPU/服务器×6核/CPU=96核
Ø 8台服务器×4个磁盘/服务器×300GB(1万转/分钟)/磁盘(服务器端总共9.6TB的SAS存储空间)
● 8台计算服务器×96GB内存/服务器=768GB内存
● 3台InfiniBand交换机(40 Gb /秒)×36端口/交换机=108端口
● 14台存储服务器,共有168个CPU核和闪存:
Ø 96GB闪存卡×4=384GB闪存/存储服务器
Ø 14台存储服务器×384GB/存储服务器=5.376TB闪存
Ø 12磁盘/存储服务器×14存储服务器=168磁盘
Ø 168磁盘×600GB/SAS盘=101TB SAS存储空间(15 000转/分钟)或
Ø 168磁盘×2TB/SATA盘=336TB SATA存储空间(7 200转/分钟)
● 数据加载速率12TB每小时
第2版(X2-8)Exadata机器由Oracle公司(Sun)独家制造,它包括:
● 两台计算服务器(2.26GHz的Intel 7560 CPU和总共约5TB的SAS存储空间):
Ø 两台服务器×8 CPU/服务器×8核/CPU=128核
Ø 两台服务器×8个磁盘/服务器×300GB(1万转/分钟)/磁盘(服务器端总共4.8TB的SAS存储空间)
● 两台计算服务器×1TB内存/服务器=2TB内存
● 3台InfiniBand交换机(40 Gb /秒)×36端口/交换机=108端口
● 14台存储服务器,共有168 个CPU核和闪存:
Ø 96GB闪存卡×4=384GB闪存/存储服务器
Ø 14台存储服务器×384GB/存储服务器=5.376TB闪存
Ø 12磁盘/存储服务器×14存储服务器=168磁盘
Ø 168磁盘×600GB/SAS盘=101TB的SAS存储空间(15 000转/分钟)或
Ø 168磁盘×2TB/SATA盘=336TB的SATA存储空间(7 200转/分钟)
在2011年7月,Oracle增加了Exadata存储扩展柜,它通过InfiniBand与X2-2和X2-8相连接,使其存储容量得到扩充。它具有额外的18台存储服务器与216个CPU核;6.75TB闪存(约190万IOPS的闪存);216块具有2TB容量的7200转/分钟SAS磁盘(432TB的原始磁盘空间,大约194TB镜像的非压缩可用容量)。使用这个作为磁盘备份,让您可以获得大概27TB/小时的速度。同时发布的还有Exalytics商务智能机,专为小企业设计的Oracle Data Appliance和拥有全新T4处理器(第11章中讨论)的SPARC SuperCluster。硬件世界的范式转变才刚刚开始!
以下是一些关于ExalogicElastic Cloud的简要信息,这是面向互联网上的应用程序(也包括一些其他中间件软件)并使之运行更快的机器(亚马逊、Facebook、谷歌、Twitter、雅虎、苹果、Salesforce.com、eBay和其他一些电子商务玩家如果还没有买的话,他们都应该买一两台!)。
一台ExalogicElastic Cloud(X2-2)包括了(处理每秒100万次的HTTP请求):
● EL X2-2 30台计算服务器,360个CPU核,2.9TB的内存,4TB的SSD读缓存,40TB的SAS硬盘。将使融合应用程序快到冒烟!
● 100万HTTP/每秒,我听说两台这样的设备就可以支撑整个Facebook,虽然Facebook有超过5亿的用户(参考最近关于Exalogic的广告)。
这里总结了Exadata速度快的原因: 快速的硬件、充足的CPU、快速的闪存、数据库服务器和存储上大量的内存、压缩(性能提高10到70倍)、分区剪裁(PartitionPruning,性能提高10到100倍)、存储索引(性能提高5到10倍)、智能扫描(性能提高4到10倍)以及其他没有涵盖的特性(请参阅Oracle文档以获得更多信息)。Exadata是可以将1TB的搜索转成500MB甚至50MB搜索的最好方式。我相信,Exadata是超划算的买卖,它将推动所有主流的硬件厂商加速硬件创新。它真是快到要爆了!
1.2 高级压缩
Oracle 11g中引入了名为“高级压缩”的新特性,向不同的组织机构承诺数据库表将占用更少的空间,相当于数据库变小了。较小的数据库占用较少的磁盘空间,也相当于较低的数据库磁盘存储的成本。随着数据库的规模以惊人的速度持续增长,能增加单位GB的存储容量确实非常令人振奋。除此之外,也有潜在的性能优势来自于大量的读操作,比如全表扫描。Oracle只需要更少的物理块读操作就可以完成全表扫描;利用压缩的数据块使得更多的数据可以存储在SGA中,这同样可以潜在地节省高速缓冲区内存。
Oracle在8i版本中首次引入了对索引键的压缩,然后在9i版本中加入了压缩表。Oracle 9i的表压缩是受限的,因为压缩只能通过创建操作实现,比如CREATE TABLE AS SELECT,也就是直接加载或以追加方式插入。这种压缩适合初始数据加载,但随着时间的推移,表需要重新组织然后重新压缩,这就需要维护和停机时间来维持压缩。随着数据库表高可用性压力的增加,压缩不再适合正常的OLTP系统,因为大多数数据不是直接加载。Oracle引进的高级压缩改变了这一切,允许数据在更新和插入表的时候保持压缩,比如下面的CREATE TABLE所示:
create table emp_compressed
(EMPNO NUMBER(4),
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2))
COMPRESS FOR OLTP;
请注意以下高级压缩设置:
● NOCOMPRESS:表或分区不会被压缩。这是默认动作。
● COMPRESS:适用于数据仓库。只在直接路径插入时启用压缩。
● COMPRESS FOR DIRECT_LOADOPERATIONS:同COMPRESS效果一样。
● COMPRESS FOR ALL OPERATIONS:适合OLTP系统。所有操作,包括常规的DML语句都启用压缩。兼容参数COMPATIBLE需要设置为11.1.0或更高。
● COMPRESS FOR OLTP:适合OLTP系统。所有操作,包括常规的DML语句都启用压缩。兼容参数COMPATIBLE需要设置为11.1.0或更高。在11.2中已取代COMPRESS FOR ALL OPERATIONS 语法,但COMPRESS FOR ALL OPERATIONS语法仍然存在而且有效。
1.3 自动诊断信息库(Automatic Diagnostic Repository,ADR)
Oracle 11g中引入了自动诊断信息库(ADR),它提供了一个统一而且一致的机制来存储、格式化并定位所有的数据库诊断信息(易于使用的文件结构)。ADR关联各种组件(比如Oracle RAC、Oracle Clusterware、OCI、Net、进程等)的错误,并自动为严重的错误生成事故和提供事故管理功能。ADR可以显著减少解决事故和问题的时间。
通常在使用传统的初始化参数的时候,比如BACKGROUND_DUMP_DEST、CORE_DUMP_ DEST和USER_DUMP_DEST等,如果想让清理文件的过程自动进行,就必须使用自定义过程去手动清理。用ADR和ADR的命令行界面(ADRCI),您可以设置控制这些文件保存时间的策略:
adrci> set control (SHORTP_POLICY =360 )
adrci> set control(LONGP_POLICY = 4380 )
如表1-1中所示,使用ADR时,传统的CORE_DUMP_DEST、BACKGROUND_DUMP_DEST和USER_DUMP_DEST位置改变为DIAGNOSTIC_DEST。因此,如果指定了参数DIAGNOSTIC_DEST,由原来的参数设置的位置将被忽略。
表1-1 使用ADR时的位置变化
原 始 位 置 |
新 位 置 |
CORE_DUMP_DEST |
DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/cdump |
BACKGROUND_DUMP_DEST (Alert Log text) (Alert Log XML) |
DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/trace DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/alert |
BACKGROUND_DUMP_DEST |
DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/trace |
USER_DUMP_DEST |
DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/< INSTANCENAME >/trace |
如下是ADR文件位置的缩略列表:
● DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/trace
● DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/alert
● DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/cdump
● DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/incident
● DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/hm
● DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/incpkg
● DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/ir
● DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/lck
● DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/metadata
● DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/sweep
● DIAGNOSTIC_DEST/diag/rdbms/<DBNAME>/<INSTANCENAME>/stage
● ** 默认情况下,DIAGNOSTIC_DEST 的位置是 $ORACLE_HOME/log
然而,如果在环境变量中设置了ORACLE_BASE,那么DIAGNOSTIC_DEST就会被设置为$ORACLE_BASE。请参考第4章以获得关于这个主题的更多信息和如何设置初始化参数。
1.4 自动共享内存管理(Automatic Shared Memory
Management,ASMM)的改进
Oracle 9i实现了用PGA管理SORT_AREA_SIZE、HASH_AREA_SIZE、位图合并区和创建位图区域。Oracle 10g迈出了走向自动内存管理的第一步,那就是通过SGA内存管理来管理共享池(Shared Pool)、大型池(Large Pool)、Java 池和缓冲区缓存(Buffer Cache)。Oracle11g进一步改进了自动共享内存管理,使得可以自动管理SGA和PGA。为了使用自动内存管理(Automatic Memory Management,AMM)来管理SGA和PGA,Oracle公司推出了两个新的数据库参数:MEMORY_TARGET和MEMORY_MAX_TARGET。
那么Oracle是如何处理之前的自动内存管理参数的呢?当设置了MEMORY_TARGET之后,SGA_TARGET和PGA_AGGREGATE_TARGET只会被用来表示最低内存设置。为了允许Oracle管理内存有最大的灵活性,您可以设置SGA_TARGET和PGA_AGGREGATE_TARGET为0(不建议使用,我建议给它们设置最小值)。
下面是一些重要注意事项:
● Linux Huge Pages和MEMORY_TARGET参数是不兼容的。更多细节可参见MOS文献749851.1以了解进一步的细节。
● MEMORY_TARGET的值要小于操作系统共享内存文件系统(/dev/shm)。在Oracle Linux系统中,数据库启动时,/dev/shm的空闲空间必须大于MEMORY_TARGET的设置,否则会得到“ORA-00845:MEMORY_TARGETnot support on this system”的错误。
● 如果LOCK_SGA数据库初始化参数设置为true,您就不能使用参数MEMORY_TARGET来启用自动内存管理。
请参考第4章以获取关于这个主题的更多信息和如何设置初始化参数。
1.5 ASM的改进
Oracle 11g大大改善了Oracle ASM的可扩展性、可用性、性能和文件管理功能。Oracle 11g中ASM的改进包括减少了数据库的启动时间和内存要求、允许支持更大ASM的文件和提供了在ASM上实现几百TB级或PB级(1PB=1000TB)数据库的能力。为了提高可扩展性,ASM增加了支持超大规模数据文件大小的能力。Oracle数据库限制单一的数据文件大小是128TB(当DB_BLOCK_SIZE = 32K时),这远远小于新的ASM文件大小限制。
以下是新的ASM限制:
● 在Exadata环境下支持最大40 EB存储(不在Exadata环境下最大是20 PB)。
● 在Exadata环境下每个ASM磁盘最大4PB(不在Exadata环境下最大是2TB)。
● 最大支持每个磁盘组100万个文件。
● 最大支持一万个ASM磁盘。
● 每个ASM实例最大支持63个磁盘组。
● 当设置AU_SIZE=1M和COMPATIBLE.RDBMS=> 11.1时磁盘组支持的最大文件大小:
Ø 外部冗余:140PB
Ø 正常冗余:23PB
Ø 高冗余:15PB
注意
当使用大文件(bigfile)表空间时,Oracle数据库的最大大小是65533(数据文件的最大数量)×128TB(64位操作系统上数据文件的最大大小) = 8EB(如果是小文件(small file)表空间,最大数据库大小则是8PB)。64位操作系统支持的最大内存寻址空间是16EB(大约18后面有18个0的字节)。这样将来您就可以使这8EB的数据库常驻内存,另外还有8EB的空闲内存!
其他关于大小的注意事项包括:
● 可变大小的区(Extent):可以支持更大的ASM文件,为超大规模数据库(VLDB)减少SGA内存的需求,并提高文件创建和打开的性能。
● 分配单元(AU):可以分配给文件的磁盘最小单位,分配单元的大小可以是1MB、2MB、4MB、8MB、16MB、32MB和64MB;默认是1MB大小。
● 条带化:粗的条带大小为1个分配单元(AU),细的条带大小为128KB。
● 较大的分配单位:为了支持较大的连续读和写,较大的分配单元(AU)可以带来显著的性能提升。
● 区大小:在11.1中,ASM的文件可以从1MB的区大小开始。假设用1MB大小的分配单元的话,然后随着ASM文件的增长,根据预定的区数逐步增加8倍到8MB和64MB。在11.2中,文件的扩展大小是变化的,具体如下:
Ø 在前20 000(0到19 999)个区时,区大小始终等于磁盘组的分配单元(AU)大小。
Ø 在接下来的20 000(20 000到39 999)个区时,区大小等于4倍的分配单元(AU)大小。
Ø 在接下来的20 000和更大(40000+)的区范围时,区大小等于16倍的分配单元(AU)大小。
● MAXIO缓冲区大小:增加MAXIO缓冲区大小到4MB并且创建拥有4MB分配单元(AU)大小的磁盘组有益于大量连续读I/O的性能提升。
1.5.1 从ASM首选镜像读取
在Oracle 11g中,当使用Oracle ASM来管理冗余时,一台主机上的ASM实例可以配置为从“首选镜像”上读取副本;默认是从主组中读取。当ASM的FailGroup位于不同位置的时候,这为Oracle RAC环境提供了极大的好处。假如ASM的FailGroup和主组位于不同的位置,RAC实例可以配置为从本地的镜像副本读取数据,而不是从远程的主组读取,从而消除了潜在的网络延迟。ASM的首选镜像读取通过每个ASM实例的控制初始化参数ASM_PREFERRED_READ_ FAILURE_GROUPS来控制。例如,您有两个站点分别叫做site1和site2,ASM磁盘组DATA1有两个FailGroup分别命名为SITE1和SITE2(请在使用之前阅读相应的Oracle文档):
对于site1:
ASM_PREFERRED_READ_FAILURE_GROUP=DATA1.SITE1
对于site2:
ASM_PREFERRED_READ_FAILURE_GROUP=DATA1.SITE2
1.5.2 滚动升级/打补丁
为了提高可用性,Oracle 11g在Oracle RAC环境下的ASM实例具备了滚动升级的能力,这是通过把ASM实例打开到“滚动迁移”模式来完成的。滚动迁移模式允许ASM实例暂时在多版本的ASM环境下工作。建议在开始ASM滚动升级前,先完成在集群上所有Oracle软件的安装以使滚动升级的时间最短,因为大多数的ASM操作在ASM实例滚动升级过程中都是不允许的(请在使用之前全面阅读相应的Oracle文档)。
开始滚动升级:
ALTER SYSTEM START ROLLING MIGRATION TO <ver_number>;
如果在滚动升级中遇到问题,就停止升级或降级:
ALTER SYSTEM STOP ROLLING MIGRATION;
1.5.3 更快的重新平衡
Oracle 11g改进了ASM重新平衡操作的性能,从而显著降低了磁盘由于各种瞬时故障而导致脱机的时间,这些故障的原因包括电缆松动、停电、总线适配器或磁盘控制器故障等。ASM将在停运期间跟踪被修改的盘区。一旦暂时的故障被修复,并且如果磁盘上的内容未被修改过,ASM就可以迅速重新同步停电期间没来得及修改的ASM镜像盘区。这使得磁盘可以重新联机并同步的操作比以前快几小时甚至几天。
新的DISK_REPAIR_TIME属性允许定义一个时间窗口,在该时间窗内可以进行故障维修或同步的操作,镜像磁盘也可以在该时间窗内重新上线。DISK_REPAIR_TIME默认为3.6小时,但针对磁盘组可以通过ALTERDISKGROUP命令进行修改(请在使用前阅读相应的Oracle文档):
ALTER DISKGROUP <DiskGroupName> SETATTRIBUTE 'DISK_REPAIR_TIME'= '24H';
您可以通过下面的命令重新联机全部的磁盘组(可以把ALL替换成DISK <diskname>来针对单独的磁盘组),并开始重新同步的过程:
ALTER DISKGROUP DISK ONLINE ALL;
注意
Oracle11g允许磁盘组被挂载在限制模式下,从而消除多个ASM实例之间在重新平衡操作时所需要的锁定和解锁消息。这大大提高了RAC环境下重新平衡操作的性能。这里是一系列您可能会用到命令的示例:
ALTER DISKGROUP <diskgroup> DISMOUNT ;
ALTER DISGROUP <diskgroup> MOUNT RESTRICTED ;
执行维护活动(重新平衡/添加/删除/联机/脱机磁盘等):
ALTER DISKGROUP <diskgroup> DISMOUNT ;
ALTER DISKGROUP <diskgroup> MOUNT ;
1.5.4 ASM磁盘组兼容性
Oracle11g中引入了两个新的磁盘组兼容性属性以确定可以使用特定ASM磁盘组的最低版本的ASM实例和数据库实例。新属性compatible.asm和compatible.rdbms在磁盘组级别设置,在有必要降级的时候,它们可能非常有用(见示例):- <span style="font-family:Microsoft YaHei;font-size:14px;">CREATE DISKGROUP DATA1 NORMAL REDUNDANCY DISK '/dev/raw/raw1',
- '/dev/raw/raw2' ATTRIBUTE 'compatibile.asm'='11.1' ;
- ALTER DISKGROUP DATA1 SET ATTRIBUTE 'compatible.rdbms'='11.1' ;
- select group_number GN, name, compatibility COMPAT,
- database_compatibility DCOMPAT
- from v$asm_diskgroup;
- GN NAME COMPAT DCOMPAT
- -- ---- ---------- ----------
- 1 DG1 11.1.0.0.0 11.1.0.0.0
- 2 DG2 10.1.0.0.0 10.1.0.0.0
- </span>
1.5.5 ASMCMD命令扩展
为了更好地管理ASM磁盘组,Oracle 11g在ASMCMD工具里增加了很多新的命令,下面列出了其中一部分:
● CP:在ASM磁盘组和操作系统文件系统之间复制文件。
ASMCD> cp +ASM1/system.dbf/backups/orcl/system.dbf
● MD_BACKUP:备份磁盘组元数据。
ASMCMD> md_backup –b/backups/orcl/asmbackupfile.md -g ASM1
● MD_RESTORE:恢复磁盘组元数据。
ASMCMD> md_restore –b/backups/orcl/asmbackupfile.md –tfull –g ASM1
● LSDSK:列出磁盘信息。
ASMCMD> lsdsk
● REMAP:在指定的那些数据块上进行坏块的重映射。
ASMCMD> remap <diskgroup name> <disk name> <blockrange>
● SYSASMprivileges:为ASM指定新的角色,比如SYSDBA。
SQL> GRANT SYSASM TO<username> ;
SQL> CONNECT<username> AS SYSASM ;
1.6 自动SQL优化
Oracle 11g引入了自动SQL优化。这本书的许多章节都详细涵盖了这个主题,因此本节只作概述。Oracle11g根据AWR(AutomaticWorkload Repository,自动负载信息库)的统计信息针对产生较大性能影响的SQL语句运行SQL 优化顾问(SQL Tuning Advisor)。AWR的统计信息用来生成一个SQL语句列表并根据它们过去一周对系统性能的影响进行排序,这个SQL列表会自动排除所有被断定为不太容易优化的SQL语句,比如并行查询、DML、DDL和任何由并发问题引起的性能问题。SQL优化顾问生成优化SQL的建议,这类建议中可能有SQL配置文件(Profile)(利用统计信息)。当建议使用SQL配置文件的时候,这些配置文件会进行性能测试,如果测试结果显示至少有三倍的改进,并且SQL优化任务参数ACCEPT_SQL_PROFILES设置为true,这个建议就会被接受;如果ACCEPT_SQL_PROFILES被设置为false,这个建议会被报告。您也可以针对任何查询单独执行这些步骤。
通过调用dbms_auto_task_admin程序包的enable和disable过程就可以控制自动SQL优化任务的执行。当启用时,SQL 优化顾问就在定义好的维护时间窗口里运行,默认的维护时间窗口参考下面的表1-2。
表1-2 Oracle 11g默认维护窗口
窗 口 名 称 |
描 述 |
MONDAY_WINDOW |
星期一晚上10点开始到第二天临晨2点 |
TUESDAY_WINDOW |
星期二晚上10点开始到第二天临晨2点 |
WEDNESDAY_WINDOW |
星期三晚上10点开始到第二天临晨2点 |
THURSDAY_WINDOW |
星期四晚上10点开始到第二天临晨2点 |
FRIDAY_WINDOW |
星期五晚上10点开始到第二天临晨2点 |
SATURDAY_WINDOW |
星期六晚上10点开始并持续20小时 |
SUNDAY_WINDOW |
星期日晚上10点开始并持续20小时 |
启用和禁用自动SQL优化:
- <span style="font-family:Microsoft YaHei;font-size:14px;">exec dbms_auto_task_admin.enable(client_name => 'sql tuning advisor',operation =>
- NULL, window_name => NULL);
- exec dbms_auto_task_admin.disable(client_name => 'sql tuning advisor', operation
- => NULL,window_name => NULL);
- </span>
配置自动SQL优化:
- <span style="font-family:Microsoft YaHei;font-size:14px;">exec dbms_sqltune.set_tuning_task_parameter (task_name =>
- 'SYS_AUTO_SQL_TUNING_TASK', parameter => 'ACCEPT_SQL_PROFILES', value => 'TRUE');
- </span>
以下是控制自动SQL优化任务的dbms_sqltune选项:
● INTERRUPT_TUNING_TASK:中断正在执行的任务,得到中间结果并正常退出。
● RESUME_TUNING_TASK:恢复先前被中断的任务。
● CANCEL_TUNING_TASK:取消正在执行的任务,清除任务的所有结果。
● RESET_TUNING_TASK:重置正在执行的任务,清除任务的所有结果并返回到其初始状态。
● DROP_TUNING_TASK:删除一个任务,清除所有与该任务相关的结果。
第5章将展示如何在企业管理器中通过简单的“点击运行”来使用自动SQL优化功能。
1.7 数据卫士的增强
Oracle 11g中改进了Oracle数据卫士的一些特性,以提高其能力和可用性。以下各节详细介绍了这些改进。
1.7.1 快照备用(Snapshot Standby)
通过Oracle 11g的新特性快照备用,您现在可以暂时打开一个物理备用数据库,用于做读/写活动,比如报表和负载测试。以读/写方式打开的物理备用数据库仍然接收从主数据库发来的重做数据,因此它持续地对主要故障提供保护,同时可使自身被用于其他的活动。因为可以服务于企业的其他用途,维护成本核算,物理备用数据库的价值就得到了提升。请记住,快照备用数据库从主数据库接收和归档重做数据,但并不在备用数据库上应用,直到快照备用数据库转换回物理备用数据库。
Oracle 11g也提升了主数据库和备用数据库之间角色转换的速度。
1.7.2 活动数据卫士
活动数据卫士是Oracle Database 11g版本中为物理备用数据库引入的一个可选功能。这一可选功能需要支付Oracle公司额外的授权费用;因此,在您的环境中实施这个功能之前,您必须获得许可。此功能允许物理备用数据库在只读模式的同时应用重做日志以保证物理备用数据库持续跟主数据库保持一致。主数据库和物理备用数据库都必须把数据库兼容初始化参数设置为11.0(也就是11g兼容模式)。请注意Oracle活动数据卫士需要单独的许可并且只能用于Oracle数据库企业版。您可以通过Oracle数据库企业版的活动数据卫士选件来购买它。它也包含在Oracle GoldenGate产品中。
在11gR2中,通过查询V$STANDBY_EVENT_HISTOGRAM视图可得到延迟的历史,Oracle 以此改进了活动数据卫士(见示例查询):
- <span style="font-family:Microsoft YaHei;font-size:14px;">select *
- from v$standby_event_histogram
- where name = 'APPLY LAG';
- </span>
此外,11gR2增加了一个数据库初始化参数,用来设置备用数据库可以在滞后多久后,在它上面的查询活动就需要被控制。在活动数据卫士启用的时候,对于物理备用数据库上非管理员用户执行的查询,您可以使用STANDBY_MAX_DATA_DELAY参数来指定特定会话的应用可以允许的滞后,这个参数以秒为单位。这个功能允许查询安全地把对主数据库的资源消耗卸载到物理备用数据库上,因为在查询执行之前就可以知道备用数据库是否已经过时到不可接受。STANDBY_MAX_DATA_DELAY默认值是NONE,这意味着无论是否存在应用滞后,在物理备用数据库上发出的查询都将被执行。其他有效的值是一个大于 0的整型值(表示容忍的滞后秒数)。值为0表示对物理备用数据库发出的所有查询都将返回和对主数据库查询相同的结果,而值大于0表示对物理备用数据库发出的查询只有在应用滞后小于或等于STANDBY_MAX_DATA_DELAY (否则就会返回ORA-3172错误,表示应用滞后太久)时才被执行。下面列出几个有用的查询。
要检查物理备用数据库的状态,以确保该数据库的角色是物理备用数据库并且打开模式是只读,可以运行下面的查询来确认。需要注意的是11gR2将显示打开模式为“read only with apply”。
- <span style="font-family:Microsoft YaHei;font-size:14px;">select db_unique_name, database_role, open_mode
- from v$database;
- DB_UNIQUE_NAME DATABASE_ROLE OPEN_MODE
- ------------------------------ ---------------- ----------
- TESTSB PHYSICAL STANDBY READ ONLY
- </span>
要检查物理备用数据库滞后主数据库的时间,可以运行下面的语句:
- <span style="font-family:Microsoft YaHei;font-size:14px;">SELECT name, value, unit, time_computed,
- to_char(sysdate, 'DD-MON-YY HH24:MI:ss')
- FROM V$DATAGUARD_STATS
- WHERE name like 'apply lag';
- NAME VALUE UNIT TIME_COMPUTED TO_CHAR(SYSDATE,'D
- ----------------------------------------------------------------
- apply lag +00 00:00:00
- day(2) to second(0) interval 20-MAY-2009 19:04:17 20-MAY-09 19:04:44
- </span>
1.7.3 混合平台支持
Oracle 11g增加的一个扩展功能是物理备用数据库可以跟主数据库位于不同的操作系统。Oracle11g现在允许Linux跟Windows的组合,同样也支持Solaris/IBM AIX的组合(参考bug 12702521以查看11.2.0.2版本中额外的限制)。而其他平台的组合在10g时就已经支持,所以这是第一次完整地支持异构操作系统。
注意
如果要查询所支持平台/操作系统组合的完整列表,请参阅MOS文献413484.1。如果要查看更多的限制和细节,请参考MOS文献395982.1和414043.1。
1.7.4 高级压缩支持逻辑备用数据库(11gR2)
Oracle Database11gR1引入了高级压缩,但是高级压缩不能用于流或逻辑备用数据库的对象。在11gR2中,高级压缩可以支持流和逻辑备用数据库了。
1.7.5 透明数据加密支持逻辑备用数据库
Oracle 11g中的透明数据加密支持逻辑备用数据库。SQL Apply也支持使用透明数据加密,这进一步增强了逻辑备用数据库的功能和利用率。
1.7.6 增强的数据泵压缩
Oracle 10g的数据泵可以通过设置参数COMPRESSION为METADATA_ONLY来压缩数据泵导出来的元数据(这可以使产生的Dump文件的大小最大缩小15%)。在11g中,数据泵不仅可以压缩数据泵的元数据,还可以压缩数据库中的数据。压缩通过为元数据、列数据或整个Dump文件集指定不同COMPRESSION参数值来实现,有效的参数值包括ALL、METADATA_ONLY、DATA_ONLY和NONE。
1.7.7 数据泵加密Dump文件集
Oracle 11g的数据泵可以加密Dump文件,可以对Dump文件中的元数据和数据库数据进行加密。Oracle 11g的数据泵增加了新的参数以控制加密:
● ENCRYPTION:设置Dump文件或Dump文件集的加密;有效值是ALL、DATA_ONLY、METADATA_ONLY、ENCRYPTED_COLUMNS_ONLY或NONE。
● ENCRYPTION_ALGORITHM:设置Dump文件或Dump文件集的加密算法;有效值是AES128、AES192和AES256。
● ENCRYPTION_MODE:为Dump文件或Dump文件集生成加密密钥的方法;有效值是DUAL、PASSWORD和TRANSPARENT。
我强烈建议在您的系统中考虑多层次的加密。您应该制定一个全面的安全计划,包括在每一个需要的层次加密(特别是加密您的备份)。安全性的话题超出了本书的范围,但应该是需要优先考虑的!
1.7.8 数据泵的传统模式
在11gR2中,数据泵有个传统模式。该传统模式兼容由原来的导出和导入工具创建的脚本和参数文件,使用原来的导出和导入工具的用户和进程可以借助新的数据泵导出和导入工具继续工作,而无需改变和/或更新。此增强功能简化了用户迁移到新的数据泵工具的过程。
1.8 增强了的统计信息
Oracle 11g在以下几个方面改善了统计信息:增强的I/O统计信息、分区对象的统计信息收集、待定统计信息、多列统计信息和表达式统计信息。
1.8.1 增强了的I/O统计信息
Oracle 11g从消费组(Consumer Group)、数据库文件和数据库功能三个方面收集所有I/O调用的统计信息。当资源管理器启用时,作为启动的资源计划的一部分,每个针对消费组的I/O统计信息就会被收集起来。这些统计数据可以通过视图V$IOSTAT_CONSUMER_GROUP来查看。数据库文件的统计信息在这些文件被访问的时候就已经被收集了。这些统计信息表明了大和小的读和写的请求、服务时间和小的读延迟。
它们可以通过字典视图V$IOSTAT_FILE来查看。数据库功能的I/O统计信息基于数据库的功能,比如LGWR、DBWR进程,并指示了大和小的读和写的请求、等待数量和等待时间。它们通过字典视图V$IOSTAT_FUNCTION来查看。
1.8.2 减少收集分区对象的统计信息
Oracle 11g可以配置针对分区对象的增强统计信息收集,仅收集有写活动的分区,从而去除了没有改变的分区对象上的统计信息收集。这提高了针对大的分区对象统计信息收集的速度,因为有些分区只包含静态数据。
1.8.3 待定统计信息
Oracle 11g有一个新的特性,称为待定统计信息。这个特性可以使新收集的统计数据保持在挂起状态,直到决定发布它们为止。默认条件下,统计信息在收集操作完成的时候自动发布。待定统计信息是通过dbms_stats程序包和OPTIMIZER_USE_PENDING_STATISTICS这个数据库初始化参数来控制的。
查看待定统计信息设置:
SQL> SELECT dbms_stats.GET_PREFS('PUBLISH')PUBLISH FROM DUAL;
设置自动发布全局待定统计信息(默认):
SQL> exec dbms_stats.SET_GLOBAL_PREFS('PUBLISH', 'TRUE');
设置不自动发布全局待定统计信息:
SQL> exec dbms_stats.SET_GLOBAL_PREFS('PUBLISH', 'FALSE') ;
待定统计信息的一个很大特性是未发布的统计信息可以通过设置初始化参数OPTIMIZER_USE_PENDING_STATISTICS在发布之前进行测试。此参数可以在系统级别或会话级别进行设置,当在会话级别使用时,优化器统计信息可以在发布之前在会话级别进行测试:
SQL> alter session setOPTIMIZER_USE_PENDING_STATISTICS=TRUE;
1.8.4 多列统计信息
Oracle 11g中引入了多列统计信息,当单表的多个列在一条SQL语句的WHERE子句中使用时,多列统计信息是一个强大的特性。优化器确定两列之间的关系,把它们被当作一个列组。例如,在某个特定季节出售的物品(冬季大衣和泳衣)和季节(冬天和夏天)之间有一个关系。Oracle11g会自动根据对工作负载的分析来收集多列统计信息,和收集直方图的方法类似,但也可以使用dbms_stats程序包手动创建:
exec dbms_stats.gather_table_stats('SCOTT', 'EMP', method_opt => 'for columns
(job,deptno)');
可以使用视图DBA_STAT_EXTENSIONS、ALL_STAT_EXTENSIONS或USER_STAT_EXTENSIONS来查询设置。
1.8.5 表达式统计信息
Oracle 11g的表达式统计信息帮助基于成本的优化器,基于列的选择性得知在列上应用函数的影响。优化器可以在列上使用函数时做出更好的决策,因为它能够更好地预测返回的行数。
exec dbms_stats.gather_table_stats('SCOTT', 'EMP', method_opt => 'for columns
(upper(ename))');
可以使用视图DBA_STAT_EXTENSIONS、ALL__STAT_EXTENSIONS或USER_STAT_ EXTENSIONS来查询设置。
1.9 闪回数据归档(Flashback DataArchive,FBDA)
闪回数据归档是Oracle Database 11g强大的新特性之一。它可以用安全有效的方式透明地跟踪在数据库中存储的所有数据,并且没有保留期限的限制。这个特性很容易配置,而且拥有高效的存储以及性能。闪回数据归档不依赖于UNDO,通过“AS OF”闪回SQL语句来查看之前在某个时间点的数据,防止意外的数据更新和删除(例如用户的错误操作)或恶意的数据破坏(例如黑客入侵)。
闪回数据归档需要闪回数据归档表空间来存放,它通过新的闪回数据归档后台进程来收集数据。这个进程把闪回数据归档内容写入闪回数据归档表空间。闪回数据归档针对每张表进行设置,启用了闪回数据归档的表不可以做某些修改,比如使用了UPGRADE TABLE子句的ALTER TABLE语句、移动或交换分区/子分区和删除表。虽然这听起来可能是很不错的保护功能,但是闪回数据归档不记录做更改的人,因此它不会协助追查操作。追查操作是一个需要额外付费的新特性——Oracle全面回忆(TotalRecall)——的一部分。
以下是闪回数据存档的例子(使用前请参阅Oracle文档)。
创建一个闪回数据表空间,叫做fbda1:
create tablespace fbda1 datafile'c:oracleoradatadbfbda1.dbf' size 500M;
创建一个闪回数据存档:
create flashback archive default dbda1 tablespacefbda1 retention 1 year;
创建一个使用闪回数据存档的表:
create table a (n number) flashback archive;
更改一个表以启用闪回数据存档:
alter table xyz flashback archive;
更改一个表以禁用闪回数据存档:
alter table xyz no flashback archive;
使用AS OF闪回语句查询一个表:
select * from a as of timestampto_timestamp('19-SEP-2008 11:59:32','dd-mon-yyyy
hh24:mi:ss') wheretable_name = 'EMP';
1.10 健康监控器(Health Monitor)
Oracle 11g中引入了免费的数据库健康监控器,通过dbms_hm程序包来完成。健康监控器可以手动运行并检查下列项目:
● DB结构完整性检查
● 数据块完整性检查
● 重做日志完整性检查
● UNDO段完整性检查
● 事务完整性检查
● 数据字典完整性检查
使用dbms_hm程序包执行健康检查:
- <span style="font-family:Microsoft YaHei;font-size:14px;">SQL> exec dbms_hm.run_check ('Dictionary Integrity Check', 'HM_TEST') ;
- PL/SQL procedure successfully completed.
- </span>
使用dbms_hm程序包的get_run_report函数可以获取健康检查报告,使用PL/SQL函数通过返回CLOB对象来提取报告。下面这个例子演示了如何通过SQL Plus,使用PL/SQL脚本提取报告到文件中。
执行生成报告的例子:
- <span style="font-family:Microsoft YaHei;font-size:14px;">$ sqlplus sysorcl11g as sysdba
- SQL*Plus: Release 11.1.0.6.0 - Production on Thu Oct 2 09:08:55 2008
- Copyright (c) 1982, 2007, Oracle. All rights reserved.
- Enter password:
- Connected to:
- Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
- With the Partitioning, OLAP, Data Mining and Real Application Testing options
- SET LONG 100000
- SET LONGCHUNKSIZE 1000
- SET PAGESIZE 1000
- SET LINESIZE 512
- select DBMS_HM.GET_RUN_REPORT('HM_TEST')
- from dual;
- </span>
下面是一个报告的例子:
- <span style="font-family:Microsoft YaHei;font-size:14px;">Basic Run Information
- Run Name : HM_TEST
- Run Id : 966
- Check Name : Dictionary Integrity Check
- Mode : MANUAL
- Status : COMPLETED
- Start Time : 2008-10-02 08:59:50.734000 -04:00
- End Time : 2008-10-02 08:59:57.296000 -04:00
- Error Encountered : 0
- Source Incident Id : 0
- Number of Incidents Created : 0
- Input Parameters for the Run
- TABLE_NAME=ALL_CORE_TABLES
- CHECK_MASK=ALL
- Run Findings And Recommendations
- Finding
- Finding Name : Dictionary Inconsistency
- Finding ID : 967
- Type : FAILURE
- Status : OPEN
- Priority : CRITICAL
- Message : SQL dictionary health check: dependency$.dobj# fk 126 on
- object DEPENDENCY$ failed
- Message : Damaged rowid is AAAABnAABAAAO2GAB3 - description: No further
- damage description available
- Finding
- Finding Name : Dictionary Inconsistency
- Finding ID : 970
- Type : FAILURE
- Status : OPEN
- Priority : CRITICAL
- Message : SQL dictionary health check: dependency$.dobj# fk 126 on
- object DEPENDENCY$ failed
- Message : Damaged rowid is AAAABnAABAAAQtpABQ - description: No further
- damage description available
- </span>
下面是一个脚本的例子:
- <span style="font-family:Microsoft YaHei;font-size:14px;">-------------------------------------------------------------------------------
- -- Script: run_health_check_report.sql
- -------------------------------------------------------------------------------
- -- Create a directory where we are going to write out report file to
- create directory healthcheck as '&u_name';
- -- Get Database Instance Name to build file name to be used to put report into
- column database_name noprint new_value i_name
- SELECT UPPER(name) || '_healthcheck_report.lst' database_name
- FROM v$database ;
- declare
- v_rpt CLOB ;
- buffer VARCHAR2(32767);
- buffer_size CONSTANT BINARY_INTEGER := 32767;
- amount BINARY_INTEGER;
- offset NUMBER(38);
- file_handle UTL_FILE.FILE_TYPE;
- directory_name CONSTANT VARCHAR2(80) := 'HEALTHCHECK';
- v_filename CONSTANT VARCHAR2(80) := '&i_name';
- begin
- -- Run the Report
- v_rpt := dbms_hm.GET_RUN_REPORT ('&HNAME') ;
- -- OPEN NEW FILE IN WRITE MODE
- file_handle := UTL_FILE.FOPEN(
- location => directory_name,
- filename => v_filename,
- open_mode => 'w',
- max_linesize => buffer_size);
- amount := buffer_size;
- offset := 1;
- WHILE amount >= buffer_size
- LOOP
- DBMS_LOB.READ(
- lob_loc => v_rpt,
- amount => amount,
- offset => offset,
- buffer => buffer);
- offset := offset + amount;
- UTL_FILE.PUT(file => file_handle, buffer => buffer);
- UTL_FILE.FFLUSH(file => file_handle);
- END LOOP;
- UTL_FILE.FCLOSE(file => file_handle);
- END;
- /
- </span>
1.11 事件打包服务(Incident Packaging Service,IPS)
Oracle 11g作为ADR的一部分,有能力收集事件信息并发送给Oracle Support。当事件发生时,数据库在警报日志中记录下这一条目,向Oracle企业管理器发送事件警报,以Dump文件的形式(事件Dump)收集有关事件的诊断数据,用事件ID号标记事件Dump,并存储在为这次事件创建的ADR子目录中。事件打包服务可以收集和打包有关具体问题的所有诊断文件,这可以大大减少收集所需诊断文件的时间,因此减少诊断信息发送给Oracle Support的周转时间(下面列出了一个简单的例子)。在创建好包之后,您可以往包中添加额外的文件、从包中删除选定的文件或修改包中选定的文件以删除敏感数据。
注意
更加简单和推荐的诊断数据的方法是使用Oracle企业管理器支持工作台(Oracle Enterprise Manager Support Workbench)。
$ adrci
adrci> help ips
adrci> show incident
(这个例子展示了第9817号事件,事件是关于ORA-600 [XYZ]的。)
- <span style="font-family:Microsoft YaHei;font-size:14px;">adrci> ips create package incident 9817
- Created package 4 based on incident id 9817, correlation level typical
- adrci> ips add incident 9817 package 4
- Added incident 9817 to package 4
- adrci> ips add file
- /opt/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log package 4
- Added file /opt/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log to package 4
- adrci> ips generate package 4 in /tmp
- Generated package 4 in file /tmp/ORA600kci_20100514184516_COM_1.zip, mode complete
- </span>
1.12 不可视索引(invisible index)
在我看来,Oracle现在已经朝优化第三方应用程序迈出了巨大的一步。Oracle现在允许用户对优化器隐藏索引,而不必删除它们(索引继续被维护)。这是一个新引入的特性,叫做不可视索引(第2章有详细介绍)。如果您曾经优化过含有非常大的表的查询并且在查询优化测试过程中不得不删除和重建索引,您就会意识到这个新特性的威力。不可视索引也将有助于批处理过程的优化。在很多情况下,索引确实能够帮助批处理过程,但是会影响到OLTP事务查询的性能。现在您可以在OLTP操作中隐藏这个索引,但是允许批处理进程看到它。
为了使用不可视索引(甚至在不可见时期强制使用它),您可以设置参数OPTIMIZER_USE_ INVISIBLE_INDEXES的值为true。此参数的默认值是false,您可以通过命令ALTER SESSION或ALTER SYSTEM设置它。否则即使通过提示(Hint),不可视索引也会被优化器完全忽略。另一个关于不可视索引的重要提示是,当它们在不可视状态时,优化器不会收集它们的统计信息。如果需要维护它们的统计信息,要使索引可见或设置参数OPTIMIZER_ USE_INVISIBLE_INDEXES的值为true(设置的时候要小心,参考第4章、附录A和Oracle文档以获取更多信息)。以下命令显示了不可视索引的创建和在单独的会话中修改为可见:
- <span style="font-family:Microsoft YaHei;font-size:14px;">SQL> create index my_index on my_table (ename) invisible;
- Index Created.
- SQL> alter session set optimizer_use_invisible_indexes = true;
- Session altered.
- </span>
1.13 分区新特性
Oracle 11g中增加了几个分区新特性,提高了分区表的可管理性,也大大提高了性能。以下各节包括区间分区(interval partition)、REF分区(REFpartition)、系统分区(systempartition)、虚拟列分区(virtualcolumn-based partition)和分区顾问(Partition Advisor)。
1.13.1 区间分区
在Oracle 11g中,我最喜欢的新特性之一就是区间分区。究其原因,是因为它解决了一个长期以来的问题。此前如果没有一个特定分区的值范围能匹配将要插入的值,Oracle就会报错。这个新特性扩展了范围分区的功能,可以使用区间来定义同等大小的分区(包括未来的分区)。当使用区间分区时,Oracle会在需要的时候自动创建新的分区。新的分区在这个分区的第一条记录插入时被创建出来。这大大提高了分区表的可管理性,有助于节约DBA手动创建新分区的时间,同时也预防了Oracle用户的使用错误。新的区间分区的有效组合为:区间、区间-列表、区间-哈希和区间-范围。区间分区跟范围分区配合非常好用,这个时候分区是基于日期范围进行的。请注意下面这个例子,它展示了创建表时的新功能。后面章节将对此进行详细探讨。
- <span style="font-family:Microsoft YaHei;font-size:14px;">CREATE TABLE emp
- (EMPNO NUMBER(4),
- ENAME VARCHAR2(30),
- JOB VARCHAR2(20),
- MGR NUMBER(4),
- HIREDATE DATE,
- SAL NUMBER(7,2),
- COMM NUMBER(7,2),
- DEPTNO NUMBER(2))
- PARTITION BY RANGE (hiredate)
- INTERVAL (NUMTOYMINTERVAL(1,'YEAR'))
- (PARTITION part_1999 values LESS THAN
- (TO_DATE('01-JAN-2000','DD-MON-YYYY')));
- </span>
一个相关的特性是延迟段创建分区(在11.2.0.2中引入)。有了这个特性,磁盘上的段和子分区以及依赖的对象在第一行数据插入之前都不会创建。
1.13.2 REF分区
Oracle REF分区是Oracle Database 11g分区的新特性。REF分区是在分区表外键的父-子关系基础上的分区能力。就REF分区而言,子表的分区键传承自父表,所有改变父表逻辑形态的维护操作均被复制到子表上。通过启用partition-wise连接,REF分区还改善了父表与子表连接的性能。当父表使用区间分区或者基于虚拟列的分区时,REF分区不能使用。当您尝试用REF分区这样做时,会得到下面的消息:
- <span style="font-family:Microsoft YaHei;font-size:14px;">CREATE TABLE order_items
- *
- ERROR at line 1:
- ORA-14659: Partitioning method of the parent table is not supported
- </span>
这项测试中发现的另一个古怪的问题是,如果并行地在父表上创建分区索引,就不能创建包含REF分区的子表:它会造成ORA-0600错误。如果创建索引时没用并行,包含REF分区的子表就可以成功创建。为了绕过这个问题,可以在创建REF分区的子表后,再于父表上创建分区索引。
下面的示例演示了如何做到这一点。注意在创建第二个表时用于引用第一个表的主键的PARTITION BY REFERENCE子句。
- <span style="font-family:Microsoft YaHei;font-size:14px;">CREATE TABLE orders
- ( order_id NUMBER(12) CONSTRAINT orders_order_id_nn NOT NULL,
- order_date DATE CONSTRAINT orders_order_date_nn NOT NULL,
- order_mode VARCHAR2(8),
- customer_id NUMBER(6) CONSTRAINT orders_customer_id_nn NOT NULL,
- order_status VARCHAR2(2),
- order_total NUMBER(8,2),
- sales_rep_id NUMBER(6),
- promotion_id NUMBER(6),
- CONSTRAINT orders_order_id_pk PRIMARY KEY (order_id))
- PARTITION BY RANGE (order_date)
- ( PARTITION p_pre_1999 VALUES LESS THAN
- (TO_DATE('01-JAN-1999','dd-MON-yyyy')),
- PARTITION p_JAN_1999 VALUES LESS THAN
- (TO_DATE('01-FEB-1999','dd-MON-yyyy')),
- PARTITION p_FEB_1999 VALUES LESS THAN
- (TO_DATE('01-MAR-1999','dd-MON-yyyy')),
- PARTITION p_MAR_1999 VALUES LESS THAN
- (TO_DATE('01-APR-1999','dd-MON-yyyy')),
- PARTITION p_APR_1999 VALUES LESS THAN
- (TO_DATE('01-MAY-1999','dd-MON-yyyy')),
- PARTITION p_MAY_1999 VALUES LESS THAN
- (TO_DATE('01-JUN-1999','dd-MON-yyyy')),
- PARTITION p_JUN_1999 VALUES LESS THAN
- (TO_DATE('01-JUL-1999','dd-MON-yyyy')),
- PARTITION p_JUL_1999 VALUES LESS THAN
- (TO_DATE('01-AUG-1999','dd-MON-yyyy')),
- PARTITION p_AUG_1999 VALUES LESS THAN
- (TO_DATE('01-SEP-1999','dd-MON-yyyy')),
- PARTITION p_SEP_1999 VALUES LESS THAN
- (TO_DATE('01-OCT-1999','dd-MON-yyyy')),
- PARTITION p_OCT_1999 VALUES LESS THAN
- (TO_DATE('01-NOV-1999','dd-MON-yyyy')),
- PARTITION p_NOV_1999 VALUES LESS THAN
- (TO_DATE('01-DEC-1999','dd-MON-yyyy')),
- PARTITION p_DEC_1999 VALUES LESS THAN
- (TO_DATE('01-JAN-2000','dd-MON-yyyy')),
- PARTITION p_JAN_2000 VALUES LESS THAN
- (TO_DATE('01-FEB-2000','dd-MON-yyyy')),
- PARTITION p_FEB_2000 VALUES LESS THAN
- (TO_DATE('01-MAR-2000','dd-MON-yyyy')),
- PARTITION p_MAR_2000 VALUES LESS THAN
- (TO_DATE('01-APR-2000','dd-MON-yyyy')),
- PARTITION p_APR_2000 VALUES LESS THAN
- (TO_DATE('01-MAY-2000','dd-MON-yyyy')),
- PARTITION p_MAY_2000 VALUES LESS THAN
- (TO_DATE('01-JUN-2000','dd-MON-yyyy')),
- PARTITION p_JUN_2000 VALUES LESS THAN
- (TO_DATE('01-JUL-2000','dd-MON-yyyy')),
- PARTITION p_JUL_2000 VALUES LESS THAN
- (TO_DATE('01-AUG-2000','dd-MON-yyyy')),
- PARTITION p_AUG_2000 VALUES LESS THAN
- (TO_DATE('01-SEP-2000','dd-MON-yyyy')),
- PARTITION p_SEP_2000 VALUES LESS THAN
- (TO_DATE('01-OCT-2000','dd-MON-yyyy')),
- PARTITION p_OCT_2000 VALUES LESS THAN
- (TO_DATE('01-NOV-2000','dd-MON-yyyy')),
- PARTITION p_NOV_2000 VALUES LESS THAN
- (TO_DATE('01-DEC-2000','dd-MON-yyyy')),
- PARTITION p_DEC_2000 VALUES LESS THAN
- (TO_DATE('01-JAN-2001','dd-MON-yyyy')))
- PARALLEL ;
- CREATE TABLE order_items
- ( order_id NUMBER(12) CONSTRAINT oitems_order_id_nn NOT NULL,
- line_item_id NUMBER(3) CONSTRAINT oitems_line_item_id_nn NOT NULL,
- product_id NUMBER(6) CONSTRAINT oitems_product_id_nn NOT NULL,
- unit_price NUMBER(8) CONSTRAINT oitems_unit_price_nn NOT NULL,
- quantity NUMBER(8,2) CONSTRAINT oitems_quantity_nn NOT NULL,
- sales_amount NUMBER(12,2) CONSTRAINT oitems_sales_amount_nn NOT NULL,
- CONSTRAINT order_items_orders_fk
- FOREIGN KEY (order_id) REFERENCES orders(order_id))
- PARTITION BY REFERENCE (order_items_orders_fk)
- PARALLEL ;
- </span>
1.13.3 系统分区
Oracle引入了系统分区选项以手工控制表中的行驻留在哪些分区。这提供了一个额外的选项使得用户可以完全控制数据存放的分区。创建本地索引会自动根据表的分区对索引进行分区。当插入数据时,您必须告诉Oracle要具体存放到哪个分区。如果不指定一个分区,就会收到一个错误(ORA-14701:partition-extended name or bind variable must be used for DMLs ontables partitioned by the System method)。
当更新或删除分区中存储的数据时,语句中不必提供指明具体的分区。但要记住,系统分区没有分区边界的概念,所以当执行一条语句时,除非显式指定了分区,否则Oracle不得不扫描所有分区以查看操作的数据位于哪个分区。如果不小心,就会出现一团糟!下面是创建一个系统分区表,插入、删除数据并在上面创建一个索引的例子。
- <span style="font-family:Microsoft YaHei;font-size:14px;">create table sales
- (sales_id number,
- product_code number,
- state_code number)
- partition by system
- (partition p1 tablespace users,
- partition p2 tablespace users);
- create index in_sales_state on sales (state_code) local;
- insert into sales partition (p1) values (1,101,1);
- delete sales partition (p1) where state_code = 1;
- </span>
1.13.4 虚拟列分区
Oracle Database 11g引入了虚拟列分区。这个功能非常强大,因为它扩展了分区表中存在的物理列。虚拟列看起来像一个普通列,允许在分区键上使用一个或多个物理列的表达式。因此,存储新的虚拟列信息作为元数据并组合成了“虚拟列”。举例来说,如果表中有一个列MONTHLY_SALARY,您可以添加一个虚拟列,使该列乘以12(代表年薪);虚拟列实际不存储数据(虽然在虚拟列上创建物理索引,但是它实际是一个基于函数的索引)。此外,虚拟列分区支持所有基本的分区策略。因此,虚拟列可以使用范围、列表和哈希方式进行分区。
在下面的例子中,所有账户号码的前两个数字代表银行的分行。比方说,我想根据分行进行分区,使用虚拟列分区,这很容易就做到。
- <span style="font-family:Microsoft YaHei;font-size:14px;">CREATE TABLE accounts
- (acc_no number(10) not null,
- acc_name varchar2(50) not null,
- acc_branch number(2) generated always as
- (to_number(substr(to_char(acc_no),1,2))))
- partition by list (acc_branch)
- (partition main_branch values (1),
- partition NY_branch values(2),
- partition chicago_branch values (4),
- partition miami_branch values (11));
- </span>
1.13.5 分区顾问
Oracle Database11g推出了分区顾问,它作为SQL访问顾问的一部分。Oracle 11g的分区顾问生成关于分区的建议。分区顾问协助生成分区建议,这些建议可以显示在实施后的预期性能收益。它还生成一个实施分区建议的脚本,这个脚本可以使用SQL*Plus手动执行或者使用Oracle企业管理器来执行(Oracle企业管理器在第5章介绍)。