ORACLE数据备份与数据恢复方案

2024-08-15

ORACLE数据备份与数据恢复方案(共7篇)

ORACLE数据备份与数据恢复方案 篇1

摘 要

结合金华电信IT系统目前正在实施的备份与恢复策略,重点介绍电信业务计算机管理系统(简称97系统)和营销支撑系统的ORALCE数据库备份和恢复方案。

Oracle数据库有三种标准的备份方法,它们分别是导出/导入(EXP/IMP)、热备份和冷备份。要实现简单导出数据(Export)和导入数据(Import),增量导出/导入的按设定日期自动备份,可考虑,将该部分功能开发成可执行程序,然后结合操作系统整合的任务计划,实现特定时间符合备份规划的备份应用程序的运行,实现数据库的本级备份,结合ftp简单开发,实现多服务器的数据更新同步,实现数据备份的异地自动备份。

关键字:数据库 远程异地 集中备份

I

ORACLE数据备份与数据恢复方案

目 录

一、前 言 ··························· 1

二、金华电信ORACLE数据库的备份与恢复方案 ······· 2

2.1 备份系统数据库备份策略································································································· 3 2.2 备份系统数据库恢复策略···················· 3 2.3 金华电信97系统及营销支撑系统的系统状况 ··········· 3 2.4 金华电信97系统、营销支撑系统及备份系统总体结构图 ······ 4 2.5 备份系统结构图说明······················ 4

三、金华电信97系统的数据库备份和恢复 ········ 6

3.1 备份方法··························· 6 3.2 备份策略··························· 6 3.3 恢复策略··························· 6 3.4 性能影响··························· 6

四、金华电信营销支撑系统的备份与恢复········· 7

4.1 备份方法··························· 7 4.2 备份策略··························· 7 4.4 性能影响··························· 7

五、RMAN CATALOG 数据库的备份 ············ 8

II

ORACLE数据备份与数据恢复方案

六、结 语 ······················ 9

III

ORACLE数据备份与数据恢复方案

一、前 言

目前,数据已成为信息系统的基础核心和重要资源,同时也是各单位的宝贵财富,数据的丢失将导致直接经济损失和用户数据的丢失,严重影响对社会提供正常的服务。另一方面,随着信息技术的迅猛发展和广泛应用,业务数据还将会随业务的开展而快速增加。但由于系统故障,数据库有时可能遭到破坏,这时如何尽快恢复数据就成为当务之急。如做了备份,恢复数据就显得很容易。由此可见,做好数据库的备份至关重要。因此,建立一个满足当前和将来的数据备份需求的备份系统是必不可少的。传统的数据备份方式主要采用主机内置或外置的磁带机对数据进行冷备份,这种方式在数据量不大、操作系统种类单

一、服务器数量有限的情况下,不失为一种既经济又简明的备份手段。但随着计算机规模的扩大,数据量几何级的增长以及分布式网络环境的兴起,将越来越多的业务分布在不同的机器、不同的操作平台上,这种单机的人工冷备份方式越来越不适应当今分布式网络环境。

因此迫切需要建立一个集中的、自动在线的企业级备份系统。备份的内容应当包括基于业务的业务数据,又包括IT系统中重要的日志文件、参数文件、配置文件、控制文件等。本文以ORACLE数据库为例,结合金华电信的几个相关业务系统目前正在实施的备份方案,介绍ORACLE数据库的备份与恢复。

ORACLE数据备份与数据恢复方案

二、金华电信ORACLE数据库的备份与恢复方案

由于金华电信IT系统以前只采用逻辑备份方式进行数据库备份,速度较慢并且数据存储管理都很分散,甚至出现备份数据不完整的现象。为了提高备份数据的效率,提供可靠的数据备份,完善备份系统,保证备份数据的完整性,降低数据备份对网络和服务器的影响,对每个IT系统的备份数据进行集中管理,我们对备份工作进行了改进,将逻辑备份与物理备份相结合,在远程建立了一个异地集中、自动在线的备份系统即网络存储管理系统。(这里用到的物理备份指热备份)其具备的主要功能如下:(1)集中式管理 :网络存储备份管理系统对整个网络的数据进行管理。利用集中式管理工具的帮助,系统管理员可对全网的备份策略进行统一管理,备份服务器可以监控所有机器的备份作业,也可以修改备份策略,并可即时浏览所有目录。所有数据可以备份到同备份服务器或应用服务器相连的任意一台磁带库内。(2)全自动的备份: 对于大多数机房管理人员来说,备份是一项繁重的任务。每天都要小心翼翼,不敢有半点闪失,生怕一失足成千古恨。网络备份能够实现定时自动备份,大大减轻管理员的压力。备份系统能根据用户的实际需求,定义需要备份的数据,然后以图形界面方式根据需要设置备份时间表,备份系统将自动启动备份作业,无需人工干预。这个自动备份作业是可自定的,包括一次备份作业、每周的某几日、每月的第几天等项目。设定好计划后,备份作业就会按计划自动进行。(3)数据库备份和恢复: 数据库系统已经相当复杂和庞大,不能用文件的备份方式来备份数据库。企业级的备份系统能够对数据库在不中断业务、不停顿数据库的情况下对数据进行联机的自动备份,包括可以进行数据库备份、日志备份、完全备份、增量备份等。(4)归档管理: 用户可以按项目、时间定期对所有数据进行有效的归档处理。提供统一的数据存储格式从而保证所有的应用数据由一个统一的数据格式来作永久的保存,保证数据的永久可利用性。(5)有效的媒体管理: 备份系统对每一个用于作备份的磁带自动加入一个电子标签,同时在软件中提供了识别标签的功能,如果磁带外面的标签脱落,只需执行这一功能,就会迅速知道该磁带的内容。(6)满足系统不断增加的需求:备份软件必须能支持多平台系统,当网络连接其它的应用服务器时,对于网络存储管理系统来说,只需在其上安装支持这种服务器的客户端软件即可将数据备份到磁带库或光盘库中。

ORACLE数据备份与数据恢复方案

2.1 备份系统数据库备份策略

数据库运行在归档模式下,利用Veritas软件模块调用数据库的备份接口进行在线的热备份,可以在备份时,对备份数据保存在不同的存储对象中,以满足客户容灾的要求,可以利用Veritas的多线程的数据迁移、利用多个磁带驱动器同时读写提高其数据备份的效率。

针对数据库的总数据量和增量数据量大小,我们可以利用数据库的多级的增量备份机制,结合Veritas 强大的备份数据追踪寻址能力和介质管理功能,制定灵活的备份策略,实现全自动的备份数据的全生命周期管理。

2.2 备份系统数据库恢复策略

通过本地的Veritas Server结合Veritas for Databases利用备份数据进行数据恢复。恢复时,Veritas 可以实现多线程的数据恢复,利用Veritas 独特的磁带分类集中存放技术,减少磁带的就位时间,提高数据恢复的效率。

先用最近一次的全备份恢复+恢复最近一次的增量备份+增量备份到断点的ARCHIVE LOG来恢复(要求数据库在ARCHIVE LOG模式下工作)。这种恢复方式比全部用ARCHIVE LOG恢复要快。

如果两份冗余的最近一次增量备份都不可用,可以追溯再上次的增量备份来恢复,然后用增量备份到断点的ARCHIVE LOG恢复。

如果最近一次的全备份恢复都不可用,则利用上个周期的全备份+上个周期的最后一次增量备份+本周期的最近一次增量备份+增量备份到断点的ARCHIVE LOG来恢复。

如果增量备份都不可用,那么用全备份+ARCHIVE LOG来恢复。

2.3 金华电信97系统及营销支撑系统的系统状况

金华电信经过这么多年的信息系统建设,目前已经运行着多个系统,除计费系统有较为完善的备份系统外,其他系统的备份系统都需要完善。其中97系统的机器型号IBM 7040-61R,操作系统 AIX5.2,数据库类型ORALCE8.1.7.4,数据量120G;营销支撑系统机器型号IBM xseries440,操作系统Red Flag Linux Server 4.0,数据库类型ORACLE9.2.0.1,数据量150G。以前,这两个系统的数据备份都是通过逻辑备份(exp)实现并且备份数据管理是分散的,然而一个完善的备份系统必须包含物理备份和逻辑备份两种方式。因此,我们正在实施一个远程

ORACLE数据备份与数据恢复方案

异地在线集中的高效的备份系统,将逻辑备份和物理备份(热备份)相结合,设置了专门的备份服务器。由于97、营销支撑操作系统采用AIX及Red Flag,我们在备份服务器上安装了第三方备份软件Veritias NBU。

2.4 金华电信97系统、营销支撑系统及备份系统总体结构图

对于具体的备份环境和结构,我们结合了Oracle备份技术和LAN环境的SAN备份结构.该系统的结构如下图所示(以97系统与营销支撑系统为例)

备份系统总体结构图

2.5 备份系统结构图说明

此在线存储系统采用了基于SAN(存储区域网络)的结构,SAN是一种高速

ORACLE数据备份与数据恢复方案

网络或子网络,提供在计算机与存储系统之间的数据传输。存储设备是指一张或多张用以存储计算机数据的磁盘设备。一个 SAN 网络由负责网络连接的通信结构如光交换机、负责组织连接的管理层、存储部件以及计算机系统构成,从而保证数据传输的安全性和力度。由于整个SAN系统的数据量比较大,所以备份系统采用SAN结构,将磁盘阵列直接连接到SAN的交换机上,和备份服务器、多台服务器均通过SAN相互连接,利用SAN的高性能来提高备份速度、降低数据备份对网络和服务器的影响。备份系统结构图说明如下:(1)Veritas 服务器(即备份服务器):备份系统是数据安全的关键系统,而备份服务器是备份系统的核心,因此从安全可靠的角度,采用专用的备份服务器,在这台服务器上安装VERTIAS Server端软件,集中管理控制磁带库、定制备份策略、管理备份作业、管理磁带等,同时安装oracle catalog库。(2)备份方案:对97系统购买IBM VERTIAS 备份软件,将数据备份至磁盘阵列上面,备份数据走光纤通道。对营销支撑系统,我们从SAN存储的FATA盘上划部分空间直接挂到系统中,然后直接采用RMAN做备份,以降低成本。之所以采用FATA盘的目的是为了避免和FC盘有IO冲突。(3)M300磁盘阵列:在我们的方案当中,我们采用磁盘阵列来代替一贯采用的磁带库。磁盘阵列具有性能高,可靠性高,维护方便等优点。本方案中采用专业存储厂商富士通的中高端存储ETERNUS3000 M300,作为一种面向开放系统的存储系统,ETERNUS3000在性能、容量及连通性等方面将世界标准提高到一个新层次。M300的容量为6T的FC盘,10T的FATA盘。在FC盘上保留所有系统的一份全备,其他的备份在白天定期转移到FATA盘。在FATA盘上保留1-2份全备,其他的定期转移到3583磁带库中。(3)光纤交换机:为了使整个系统具有良好的扩展性,我们在数据中心采用了被评为最优秀的网络存储产品博科的16口的光纤交换机,在新大楼备份中心采用博科的8口的光纤交换机。(4)磁带库:本方案中的磁带库采用的是原先计费系统所用的3583磁带库。我们定期将FATA盘上的备份自动转移到该磁带库上,做更久的保留。(5)逻辑备份服务器:为了充份利用旧有的设备来提高异地集中备份系统的稳定性,安全性,我们利用旧有设备IBM 7044-170小型机和IBM 3542阵列来搭建一个逻辑备份系统。所有的逻辑备份都放到该机器上面来,使得逻辑备份和物理备份在物理上开离。这样一来避免了IO冲突,二来提高了备份系统的可靠性。

ORACLE数据备份与数据恢复方案

三、金华电信97系统的数据库备份和恢复

3.1 备份方法

采用Veritas NBU物理备份加EXP逻辑备份。Exp逻辑备份在服务器上直接备份,定期转移到逻辑备份服务器。

3.2 备份策略

备份策略:(1)每周进行一次数据库全备份操作,并定期将FC盘上面的物理备份定期转移到FATA盘上,同时将FATA盘阵上面的物理备份定期转移到磁带库上,至少保存 3 个全备份;全备份时间选择在每周星期六凌晨12:00 开始。(2)数据库采用Archive Log 模式,每天晚上12:00 开始进行增量备份。(3)与数据库的逻辑备份相配合,我们每天进行一次数据的exp备份,即每天做一个完整的数据库EXPORT 备份;备份时间选择在每天凌晨1:00 开始。Exp备份还是备到本机,定期将其ftp到逻辑备份服务器上。

3.3 恢复策略

恢复策略:(1)数据文件损坏或磁盘阵列损坏:针对这种情况可以采用Veritas NBU从FC磁盘阵列中恢复。(2)误操作或对象级逻辑上的损坏:针对这种情况可以从exp备份中采用imp恢复。

3.4 性能影响

数据库采用归档模式对97数据库性能将产生一定的影响。因为在归档模式下,oracle需要将归档日志归档到归档目录(也就是copy)。在IO资源不成为瓶颈的情况下,对系统影响将可以不予考虑。97系统目前的瓶颈在于内存这一块。所以对97系统的性能影响可以不加以考虑。

ORACLE数据备份与数据恢复方案

四、金华电信营销支撑系统的备份与恢复

4.1 备份方法

采用物理备份加EXP逻辑备份。物理备份考虑到VERTIAS 的成本,及该系统的重要程度,我们从SAN存储上划一部分空间挂接至该系统OS上面,然后直接采用RMAN备份。这样备份的好处是成本低,缺点是不便于管理和维护,消耗主机的资源,在主机无法启动的情况下,备份文件无法访问,但备份数据还是完好如初的。

4.2 备份策略

备份策略:(1)每周进行一次数据库全备份操作,采用循环覆盖的方式,共保存 2个全备份;备份时间可以选择在周日晚上11:00进行(由于其采用的是FATA盘,与其他的物理备份不会造成IO冲突)。(2)数据库采用Archive Log 模式,每天晚上12:00 增量备份。(3)与数据库的逻辑备份相配合,我们每周进行一次数据的exp备份,即每天做一个完整的数据库EXPORT 备份;备份时间选择在每天凌晨1:00 开始。

4.3 恢复策略

恢复策略:(1)数据文件损坏或磁盘阵列损坏:针对这种情况可以采用RMAN从磁盘中恢复。(2)误操作或对象级逻辑上的损坏:针对这种情况可以从exp备份中采用imp恢复。

4.4 性能影响

数据库采用归档模式对营销支撑系统数据库性能产生的影响也是由于归档进程需要对归档日志进行归档。同时改成归档模式还需要注意的一个问题就是归档目录空间的问题,该系统空间足够。如果该系统的IO资源较为充裕的话,则不会对性能产生很大的影响。

ORACLE数据备份与数据恢复方案

五、RMAN Catalog 数据库的备份

RMAN Catalog库是整个备份系统当中最重要的信息之一。是在物理备份(Veritas)服务器上建立的一个ORACLE数据库,记录了所有备份的数据库数据文件。如果丢失了Catalog信息的话,恢复将非常麻烦,因此我们也需要对RMAN Catalog库做定期备份。RMAN Catalog库采用逻辑备份,每天直接备份到逻辑备份服务器上。

ORACLE数据备份与数据恢复方案

六、结 语

ORACLE数据备份与数据恢复方案 篇2

“军队疗养院信息系统”由总后卫生部与大连疗养院共同研制,于2006年正式配发到全军所有疗养院推广使用。该系统集成了军队疗养员在院的所有医疗信息,各疗养院通过该系统向上级卫生部门上报病案首页、医技信息等数据并领取卫生经费。为了保证疗养系统数据库数据的安全运行,笔者在系统的维护过程中对服务器的配置、备份方案进行了多次论证、调整,并进行了一系列的数据恢复试验,最终采用了适用于我院实际情况的手工实现的Oracle数据自动备份与恢复方案。

2 手工管理的数据备份与恢复

手工管理的Oracle数据备份有2种类型:逻辑备份和物理备份,其中物理备份又分为离线备份(冷备份)和在线备份(热备份)。逻辑备份的代表性方法就是导出(export),即通过导出数据文件内的数据与对象的定义并整合成为一个dmp文件实现备份。冷备份是指将数据库关闭后利用操作系统指令将数据库的物理文件全部复制一份。热备份则不需要将数据库关闭即可利用操作系统指令将数据库的物理文件进行复制。这3种备份方式各有特点,适用于不同的备份要求和环境。导出备份主要针对小型数据库、单一表空间或重要表内的数据备份,是相当不错且有弹性的备份方式,但对于大型数据库或性能较低的服务器会耗费相当长的时间和较多的系统资源,因此建议作为辅助备份[1]。冷备份能够保证备份时间点数据库的完整性,但对于数据操作实时性极高的大型数据库来说,冷备份因为需要关闭数据库,一周内的执行频率不能过高,且应选择在数据访问量小的时间进行。热备份因为无需关闭数据库成为一种被广泛采用的主要备份方式,但这种备份方式要求数据库必须在归档模式下运行,恢复操作也相对复杂。

恢复是指在数据库损坏的情况下,使用备份将受损的数据恢复回来的过程[2]。针对导出备份的恢复方法就是导入,一般应用于在线服务器出现硬件故障之后的数据库重建。对于物理备份的恢复分为完全恢复和不完全恢复。在归档日志与控制文件没有丢失的情况下,应用最多的是由于用户误操作后需要恢复误操作的数据以及数据库恢复到误操作之前的时间点的不完全恢复。

3 备份方案

对于一个7×24 h的数据库系统,备份尤为重要,因为如果出现故障,完善可靠的备份策略能使数据库得到更快而安全的恢复[3]。笔者认为,一个完善的数据备份方案应该是硬件、软件与各种备份方式的有机组合。

3.1 硬件配置

主服务器:IBM X3650 7979R01服务器。

异地导出备份服务器:DELL PowerEdge SC430服务器。

存储方式:主服务器4块SAS硬盘采用RAID5存储方式,保证任何一块硬盘损坏时数据不会丢失。

3.2 软件环境

服务器操作系统:Windows Server 2003(SP2)。

数据库管理系统:Oracle 8.1.6,工作于自动归档模式,实例名为aspsrv(正常情况下关闭异地备份服务器Oracle服务)。

3.3 数据备份计划

添加任务计划,定期定时运行备份批处理命令,实现自动备份。

本地热备:1次/d,时间:每日00:00,保留最近1周的备份数据。

本地冷备:1次/周,时间:周日01:00,保留最近4周的备份数据。

异地导出备份:1次/d,时间:每日12:00,保留最近1周的备份数据。

3.4 数据自动备份实现方法

通过编写备份批处理命令与sql脚本来完成3种方式的数据自动备份。批处理命令与sql脚本应在同一文件夹目录下。如执行热备的批处理命令与sql脚本主要内容为:

4 恢复实例

数据库系统一旦出现故障,DBA要能迅速使其恢复正常[4]。以用户使用drop table命令误删除一个表为例,进行数据恢复。

4.1 恢复方案

(1)异地重建数据库后使用PowerBuilder导出被删除表(save rows as),然后在主服务器上导入(import)该表。在异地重建数据库有2种方法:一种是使用导出备份数据,另一种是使用最近热备数据库。选择哪种方式取决于哪种备份的时间与当前时间更接近,这样损失会更少。

(2)使用基于时间点/撤销或SCN号的不完全恢复,即使用备份的冷备数据库或热备数据库结合归档日志将数据库恢复到误操作之间的最近时间点。

方法(1)损失的是备份数据库到误操作这段时间被删除表的数据,最长为12 h,即热备与异地导出备份的时间间隔;方法(2)损失的是最近归档到误操作这段时间数据库的数据,一般为几秒钟时间,且能够保证整个数据库在恢复时间点的数据同步。

4.2 实现步骤

以方法(2)为例,进行不完全恢复必须具有2个前提:一是具有所有数据文件的备份,并且该备份是在要恢复到的时间点之前做的;二是具有从备份完成的时间点开始到要恢复到的时间点之间的所有归档日志文件。进行基于时间点的不完全恢复步骤为:

(1)关闭数据库。

SQL>shutdown immediate;

(2)执行一次冷备批处理命令(安全角度考虑,即使不完全恢复或失败也可以恢复至当前状态)。

(3)从上次热备中还原所有的数据文件。

(4)将数据库启动至mount阶段。

SQL>startup mount;

(5)进行基于时间点的不完全恢复。

SQL>recover database until time‘2009-06-08 09:50:10’;

(6)以resetlogs打开数据库。

SQL>alter database open resetlogs;

(7)再执行一次冷备批处理命令。

5 小结

本备份方案投入经费较低,没有设置专门的备用服务器。异地导出服务器实际上相当于一台性能较高的PC机,平时作为数据库维护计算机使用,在需要时又能承担备用服务器的功能。主服务器的性能与数据备份计划的组合配置合理,进行一次冷备份或热备份的时间在30 s以内,异地导出备份的时间在4 min以内。通过手工方式实现了数据备份的自动化管理,提高了工作效率和工作质量,有利于避免人为错误,提高数据备份的安全性和可靠性[5]。总之,该备份与恢复方案不仅保证了数据安全,也达到了系统运行畅通的目标,对于中小型医院数据库系统的建设具有一定的参考价值。

参考文献

[1]张天慧.专家精讲:Oracle数据库管理与维护[M].北京:电子工业出版社,2009:258.

[2]韩思捷.Oracle数据库技术实用详解:教你成为10Gocp[M].北京:电子工业出版社,2008:191.

[3]李佩铎.Oracle数据库备份和恢复优化[J].医疗设备信息,2007,22(3):47-85.

[4]朱有存,罗丹,王梅,等.基于RMAN的“军卫一号”数据库备份恢复方法[J].医疗卫生装备,2007,28(1):50.

ORACLE数据备份与数据恢复方案 篇3

关键词:ORACLE数据库;环境调整;优化设计;方案

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)12-21518-02

Large Oracle Database Design Optimization Program

JIANg Cheng-yan1,WU Si-yuan2

(1.Chongqing Electric Power College,Chongqing 400053,China;2.Chongqing University of Posts and Telecommunications,Chongqing 400065,China)

Abstract:This paper mainly from large Oracle database environment four different levels of the adjusted analysis. Analysis of the ORACLE system structure and working mechanism, from nine different aspects of a more comprehensive summary of the ORACLE database optimization adjustment programs.

Key words:ORACLE data; Environmental adjustments; Optimal design; Program

對于ORACLE数据库的数据存取,主要有四个不同的调整级别,第一级调整是操作系统级包括硬件平台,第二级调整是ORACLE RDBMS级的调整,第三级是数据库设计级的调整,最后一个调整级是SQL级。通常依此四级调整级别对数据库进行调整、优化,数据库的整体性能会得到很大的改善。下面从九个不同方面介绍ORACLE数据库优化设计方案。

1 数据库优化自由结构OFA(Optimal flexible Architecture)

数据库的逻辑配置对数据库性能有很大的影响,为此,ORACLE公司对表空间设计提出了一种优化结构OFA。使用这种结构进行设计会大大简化物理设计中的数据管理。优化自由结构OFA,简单地讲就是在数据库中可以高效自由地分布逻辑数据对象,因此首先要对数据库中的逻辑对象根据他们的使用方式和物理结构对数据库的影响来进行分类,这种分类包括将系统数据和用户数据分开、一般数据和索引数据分开、低活动表和高活动表分开等等。数据库逻辑设计的结果应当符合下面的准则:(1)把以同样方式使用的段类型存储在一起;(2)按照标准使用来设计系统;(3)存在用于例外的分离区域;(4)最小化表空间冲突;(5)将数据字典分离。

2 充分利用系统全局区域SGA(SYSTEM GLOBAL AREA)

SGA是oracle数据库的心脏。用户的进程对这个内存区发送事务,并且以这里作为高速缓存读取命中的数据,以实现加速的目的。正确的SGA大小对数据库的性能至关重要。SGA包括以下几个部分:

(1)数据块缓冲区(data block buffer cache)是SGA中的一块高速缓存,占整个数据库大小的1%-2%,用来存储从数据库重读取的数据块(表、索引、簇等),因此采用least recently used (LRU,最近最少使用)的方法进行空间管理。

(2)字典缓冲区。该缓冲区内的信息包括用户账号数据、数据文件名、段名、盘区位置、表说明和权限,它也采用LRU方式管理。

(3)重做日志缓冲区。该缓冲区保存为数据库恢复过程中用于前滚操作。

(4)SQL共享池。保存执行计划和运行数据库的SQL语句的语法分析树。也采用LRU算法管理。如果设置过小,语句将被连续不断地再装入到库缓存,影响系统性能。

另外,SGA还包括大池、JAVA池、多缓冲池。但是主要是由上面4种缓冲区构成。对这些内存缓冲区的合理设置,可以大大加快数据查询速度,一个足够大的内存区可以把绝大多数数据存储在内存中,只有那些不怎么频繁使用的数据,才从磁盘读取,这样就可以大大提高内存区的命中率。

3 规范与反规范设计数据库

3.1规范化

范式是符合某一级别的关系模式的集合,根据约束条件的不同,一般有1NF、2NF、3NF三种范式。规范化理论是围绕这些范式而建立的。规范化的基本思想是逐步消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的“分离”,即采用“一事一地”的模式设计原则,因此,所谓规范化实质上就是概念的单一化。数据库中数据规范化的优点是减少了数据冗余,节约了存储空间,相应逻辑和物理的I/O次数减少,同时加快了增、删、改的速度。但是一个完全规范化的设计并不总能生成最优的性能,因为对数据库查询通常需要更多的连接操作,从而影响到查询的速度。故有时为了提高某些查询或应用的性能而有意破坏规范规则,即反规范化。

3.2反规范化

(1)反规范的必要性

是否规范化的程度越高越好呢?答案是否定的,应根据实际需要来决定,因为“分离”越深,产生的关系越多,结构越复杂。关系越多,连接操作越频繁,而连接操作是最费时间的,在数据库设计中特别对以查询为主的数据库设计来说,频繁的连接会严重影响查询速度。所以,在数据库的设计过程中有时故意保留非规范化约束,或者规范化以后又反规范,这样做通常是为了改进数据库的查询性能,加快数据库系统的响应速度。

(2)反规范技术

在进行反规范设计之前,要充分考虑数据的存取需求,常用表的大小、特殊的计算、数据的物理存储等。常用的反规范技术有合理增加冗余列、派生列,或重新组表几种。反规范化的好处是降低连接操作的需求、降低外码和索引数目,减少表的个数,从而提高查询速度,这对于性能要求相对较高的数据库系统来说,能有效地改善系统的性能,但相应的问题是可能影响数据的完整性,加快查询速度的同时降低修改速度。

3.3数据库设计中的优化策略

数据应当按两种类别进行组织:频繁访问的数据和频繁修改的数据。对于频繁访问但是不频繁修改的数据,内部设计应当物理不规范化。对于频繁修改但并不频繁访问的数据,内部设计应当物理规范化。比较复杂的方法是将规范化的表作为逻辑数据库设计的基础,然后再根据整个应用系统的需要,物理地非规范化数据。规范与反规范都是建立在实际的操作基础之上的约束,脱离了实际两者都没有意义。只有把两者合理地结合在一起,才能相互补充,发挥各自的优点。

4 合理设计和管理表

4.1利用表分区

分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行FTS(Full Table Scan,全表扫描),明显缩短了查询时间,另外处于不同磁盘的分区也将对这个表的数据传输分散在不同的磁盘I/O,一个精心设置的分区可以将数据传输对磁盘I/O竞争均匀地分散开。

4.2避免出现行连接和行迁移

在建立表时,由于参数pctfree和pctused不正确的设置,数据块中的数据会出现行链接和行迁移,也就是同一行的数据不保存在同一的数据块中。如果在进行数据查询时遇到了这些数据,那么为了读出这些数据,磁头必须重新定位,这样势必会大大降低数据库执行的速度。因此,在创建表时,就应该充分估计到将来可能出现的数据变化,正确地设置这两个参数,尽量减少数据库中出现行链接和行迁移。

4.3控制碎片

碎片(fragmentation)是對一组非邻接的数据库对象的描述。碎片意味着在执行数据库的功能时要耗费额外的资源(磁盘I/O,磁盘驱动的循环延迟,动态扩展,链接的块等),并浪费大量磁盘空间。当两个或多个数据对象在相同的表空间中,会发生区间交叉。在动态增长中,对象的区间之间不再相互邻接。为了消除区间交叉将静态的或只有小增长的表放置在一个表空间中,而把动态增长的对象分别放在各自的表空间中。在create table、、create index、create tablespace、create cluster时,在storage子句中的参数的合理设置,可以减少碎片的产生。

4.4别名的使用

别名是大型数据库的应用技巧,就是表名、列名在查询中以一个字母为别名,查询速度要比建连接表快1.5倍。

4.5回滚段的交替使用

由于数据库配置对应用表具有相对静止的数据字典和极高的事务率特点。而且数据库的系统索引段、数据段也具有相对静止,并发现在应用中最高的负荷是回滚段表空间。把回滚段定义为交替引用,这样就达到了循环分配事务对应的回滚段,可以使磁盘负荷很均匀地分布。

5 索引Index的优化设计

5.1管理组织索引

索引可以大大加快数据库的查询速度,索引把表中的逻辑值映射到安全的RowID,因此索引能进行快速定位数据的物理地址。但是有些DBA发现,对一个大型表建立的索引,并不能改善数据查询速度,反而会影响整个数据库的性能。这主要是和SGA的数据管理方式有关。ORACLE在进行数据块高速缓存管理时,索引数据比普通数据具有更高的驻留权限,在进行空间竞争时,ORACLE会先移出普通数据。对一个建有索引的大型表的查询时,索引数据可能会用完所有的数据块缓存空间,ORACLE不得不频繁地进行磁盘读写来获取数据,因此在对一个大型表进行分区之后,可以根据相应的分区建立分区索引。如果对这样大型表的数据查询比较频繁,或者干脆不建索引。另外,DBA创建索引时,应尽量保证该索引最可能地被用于where子句中,如果对查询只简单地制定一个索引,并不一定会加快速度,因为索引必须指定一个适合所需的访问路径。

5.2聚簇的使用

Oracle提供了另一种方法来提高查询速度,就是聚簇(Cluster)。所谓聚簇,简单地说就是把几个表放在一起,按一定公共属性混合存放。聚簇根据共同码值将多个表的数据存储在同一个Oracle块中,这时检索一组Oracle块就同时得到两个表的数据,这样就可以减少需要存储的Oracle块,从而提高应用程序的性能。

5.3优化设置的索引,就必须充分利用才能加快数据库访问速度。ORACLE要使用一个索引,有一些最基本的条件:1)、where子名中的这个字段,必须是复合索引的第一个字段;2)、where子名中的这个字段,不应该参与任何形式的计算。

6 多CPU和并行查询PQO(Parallel Query Option)方式的利用

6.1尽量利用多个CPU处理器来执行事务处理和查询

CPU的快速发展使得ORACLE越来越重视对多CPU的并行技术的应用,一个数据库的访问工作可以用多个CPU相互配合来完成,加上分布式计算已经相当普遍,只要可能,应该将数据库服务器和应用程序的CPU请求分开,或将CPU请求从一个服务器移到另一个服务器。对于多CPU系统尽量采用Parallel Query Option(PQO,并行查询选项)方式进行数据库操作。

6.2使用Parallel Query Option(PQO,并行查询选择)方式进行数据查询

使用PQO方式不仅可以在多个CPU间分配SQL语句的请求处理,当所查询的数据处于不同的磁盘时,一个个独立的进程可以同时进行数据读取。

6.3使用SQL*Loader Direct Path选项进行大量数据装载

使用该方法进行数据装载时,程序创建格式化数据块直接写入数据文件中,不要求数据库内核的其他I/O。

7 实施系统资源管理分配计划

ORACLE提供了Database Resource Manager(DRM,数据库资源管理器)来控制用户的资源分配,DBA可以用它分配用户类和作业类的系统资源百分比。在一个OLDP系统中,可给联机用户分配75%的CPU资源,剩下的25%留给批用户。另外,还可以进行CPU的多级分配。除了进行CPU资源分配外,DRM还可以对资源用户组执行并行操作的限制。

8 使用最优的数据库连接和SQL优化方案

8.1使用直接的OLE DB数据库连接方式。

通过ADO可以使用两种方式连接数据库,一种是传统的ODBC方式,一种是OLE DB方式。ADO是建立在OLE DB技术上的,为了支持ODBC,必须建立相应的OLE DB到ODBC的调用转换,而使用直接的OLE DB方式则不需转换,从而提高处理速度。

8.2使用Connection Pool机制

在数据库处理中,资源花销最大的是建立数据库连接,而且用户还会有一个较长的连接等待时间。解决的办法就是复用现有的Connection,也就是使用Connection Pool对象机制。Connection Pool的原理是:IIS+ASP体系中维持了一个连接缓冲池,这样,当下一个用户访问时,直接在连接缓冲池中取得一个数据库连接,而不需重新连接数据库,因此可以大大地提高系统的响应速度。

8.3高效地进行SQL语句设计

通常情况下,可以采用下面的方法优化SQL对数据操作的表现:

(1)减少对数据库的查询次数,即减少对系统资源的请求,使用快照和显形图等分布式数据库对象可以减少对数据库的查询次数。

(2)尽量使用相同的或非常类似的SQL语句进行查询,这样不仅充分利用SQL共享池中的已经分析的语法树,要查询的数据在SGA中命中的可能性也会大大增加。

(3)限制动态SQL的使用,虽然动态SQL很好用,但是即使在SQL共享池中有一个完全相同的查询值,动态SQL也会重新进行语法分析。

(4)避免不带任何条件的SQL语句的执行。没有任何条件的SQL语句在执行时,通常要进行FTS,数据库先定位一个数据块,然后按顺序依次查找其它数据,对于大型表这将是一个漫长的过程。

(5)如果对有些表中的数据有约束,最好在建表的SQL语句用描述完整性来实现,而不是用SQL程序中实现。

(6)可以通过取消自动提交模式,将SQL语句汇集一组执行后集中提交,程序还可以通过显式地用COMMIT和ROLLBACL进行提交和回滚该事务。

(7)检索大量数据时费时很长,设置行预取数则能改善系统的工作表现,设置一个最大值,当SQL语句返回行超过该值,数值库暂时停止执行,除非用户发出新的指令,开始组织并显示数据,而不是让用户继续等待。

9 充分利用数据的后台处理方案减少网络流量

9.1合理创建临时表或视图

所谓创建临时表或视图,就是根据需要在数据库基础上创建新表或视图,对于多表关联后再查询信息的可建新表,对于单表查询的可创建视图,这样可充分利用数据库的容量大、可扩充性强等特点,所有条件的判断、数值计算统计均可在数据库服务器后台统一处理后追加到临时表中,形成数据结果的过程可用数据库的过程或函数来实现。

9.2数据库打包技术的充分利用

利用数据库描述语言编写数据库的过程或函数,然后把过程或函数打成包在数据库后台统一运行包即可。

9.3数据复制、快照、视图,远程过程调用技术的运用

数据复制,即将数据一次复制到本地,这样以后的查询就使用本地数据,但是只适合那些变化不大的数据。使用快照也可以在分布式数据库之间动态复制数据,定义快照的自动刷新时间或手工刷新,以保证数据的引用参照完整性。调用远程过程也会大大减少因频繁的SQL语句调用而带来的网络拥挤。

总之,对所有的性能问题,没有一个统一的解决方法,但ORACLE提供了丰富的选择环境,可以从ORACLE数据库的体系结构、软件结构、模式对象以及具体的业务和技术实现出发,进行统筹考虑。提高系统性能需要一种系统的整体的方法,在对数据库进行优化时,应对应用程序、I/O子系统和操作系统(OS)进行相应的优化。优化是有目的地更改系统的一个或多个组件,使其满足一个或多个目标的过程。对Oracle来说,优化是进行有目的的调整组件级以改善性能,即增加吞吐量,减少响应时间。如果DBA能从上述九个方面综合考虑优化方案,相信多数ORACLE应用可以做到按最优的方式来存取数据。

參考文献:

[1][美]Joe Greene,Advanced Information Systems,Inc.et al. Oracle 8 服务器技术精粹[M].清华大学出版社,1999.

[2]瓮正科,王新英.Oracle 8.X For Windows NT 实用教程[M].清华大学出版社,1999.

[3]Kevin Loney. Oracle8i 数据库管理员手册[M].机械工业出版社,2000.

[4]周渝斌.基于ORACLE8i的大型数据库技术讲座之一数据库优化篇[J].电脑编程技巧与维护,2002,(4):5-9.

oracle优化缓存对象与数据 篇4

可以稳定的运行,

oracle数据库优化的根本是

1.尽量减少资源消耗,例如优化sql,减少sql本身的资源消耗

2.如果无法进一步减少资源的消耗,那就让数据尽量靠近cpu,也就是把数据从硬盘转移到内存(内存的读写速度快)

或者换更快的磁盘

本文就简单总结下如何缓存数据和数据库对象(也就是把数据移向内存,提高内存的命中率,以提高整体io速度)

1.缓存数据

2.缓存数据对象的定义,例如package,procedure,pl/sql和sql(也就是cursor)等

上面说的这两种数据就存在oracle最重要的两个部件中share pool和buffer pool中,提高这两个pool的命中率也提高了

io速度,而io又是当今技术发展最慢,系统的最大的瓶颈。

1. 缓存数据

这里说的oracle数据是占大量存储空间的,不是存在数据库字典里的数据;oracle的数据的类型一般为:

SQL>select se.segment_type from dba_segments se group by se.segment_type;

SEGMENT_TYPE

------------------

LOBINDEX

INDEX PARTITION

TABLE PARTITION

NESTED TABLE

ROLLBACK

LOB PARTITION

LOBSEGMENT

INDEX

TABLE

CLUSTER

TYPE2 UNDO

11 rows selected

SQL>

在大部分时候,把这些数据放到内存里,会很大的提升系统的性能

buffer pool分为三个子pool,这三个pool都主要使用LRU算法管理的

default buffer pool:默认所有的数据块都存在这,并遵循本pool的LRU算法

keep buffer pool:如果指定数据块缓存到keep区的,数据块就不太可能因为执行其他一些操作被其他数据块交换出,即使较长时间没使用了,只遵循本pool的LRU

recycle buffer pool:设置recycle是因为有时会有一些大的又教少使用的表的操作,如果不设置单独的缓存区,那么缺省的缓存区中的数据块就被这些偶尔使用的数据换出,它的空间比较小,所以说一般使用完就释放掉了,它也只遵守本pool的LRU算法

以table为例:

修改table的缓存空间

alter table a_user storage(buffer_pool keep) cache/nocache;  ---把表a_user缓存到keep buffer pool中最热端/把表a_user从keep buffer pool立刻释放出去

alter table a_user cache/nocache  ---把表a_user缓存到default buffer pool中最热端/把表a_user从default buffer pool立刻释放出去

eg:

1)

SQL>alter table a_user storage(buffer_pool keep) cache;

Table altered

2)

SQL>select t.table_name,t.cache,t.buffer_pool from user_tables t where t.table_name=upper(a_user);

TABLE_NAME                    CACHE               BUFFER_POOL

------------------------------ -------------------- -----------

a_user                         Y               KEEP

说明:

user_tables.cache:这个表一旦被读入buffer cache,就会放在链表的热端~ 尽量不被挤出buffer cache

user_tables.buffer_pool:把这个表放入特殊的buffer cache中,这些特殊的buffer cache是独立的

而视图v$db_object_cache.kept:告知是否对象常驻shared pool(yes/no),有赖于这个对象是否已经利用PL/SQL 过程

DBMS_SHARED_POOL.KEEP“保持”(永久固定在内存中)

eg:

SQL>Select oc.NAME,oc.TYPE,oc.KEPT from v$db_object_cache oc where oc.TYPE=TABLE AND OC.OWNER=HPO;

NAME                                                                            TYPE                        KEPT

-------------------------------------------------------------------------------- ---------------------------- ----

A_USER                                                                           TABLE                      YES

这个v$db_object_cache视图提供对象在library cache(shared pool)中对象统计,提供比v$librarycache更多的细节,并且常用于找出shared pool中的活动对象。

所以你没有使用过对象时,是不存在这个视图里的,使用时用了,才会在这个视图里出现

可以参看三思的动态性能视图介绍: space.itpub.net/7607759/viewspace-22241

例如修改索引的buffer pool

alter index IDX_ORG_TYPE storage(buffer_pool keep) cache;

分区表和分区索引好像不能把每个分区放在不同的buffer pool中,反正我测试通过

2.缓存数据对象的定义,例如package,procedure,pl/sql和sql(也就是cursor)等

上面介绍了把数据尽量缓存在buffer pool中,提高数据在内存的命中率,避免从磁盘读写数据,间接提高系统io能力;

buffer pool缓存的数据是用户最终的目标数据,而把这些用户最终目标数据要传达给用户,就需要oracle用另外一些

动作来完成,而这些动作主要是在share pool中完成的,大概功能有:缓存语句文本,分析代码,执行计划,数据字典

中的表和列的权限定义等;share pool主要也用LRU算法,所以怎样尽量缓存这些数据就是下面要说的

oracle分为sql引擎和pl/sql引擎,分别完成sql和pl/sql的解析等工作,而这里解析又是很耗资源的,所以就要想办法

尽量少解析,使代码重用以提高效率

A。代码的重用

确定是否需要对语句进行(硬)解析时,是先比较语句的哈希值,下面的两种方法有助于获得相同的哈希值,从而可以实现重用代码,提高命中率:

1)开发组的所有成员都使用相同的编码规范(包括大小写,空格,换行等);

2)使用绑定变量(提高命中率的同时可能会产生不够好的执行计划,因为优化器不知道变量的确定值,在有栏位的柱状图统计数据时也不能够利用)。

调整相关初始化参数:

OPEN_CURSOR

这个参数指定每个用户会话能打开的游标最大数量;增大这个值可以减少重新解析会话曾打开的语句的机会,提高命中率,但需要更大的共享池空间。要确保该值足够,增加该值不会对内存造成太大的影响

cursor_space_for_time

缺省是FALSE,如果设置为TRUE,那么SHARED SQL AREA当CURSOR打开的时候,是PIN在共享池里的,不允许被换出(AGEOUT),这样提高了SQL的执行效率,另外PGA中的CURSOR的私有内存部分,执行完SQL后也不关闭,下次执行的时候可以直接使用,节省了内存分配和释放的时间。对于同一个SQL反复被执行的情况,这种设置有助于提高 SQL执行的效率。但是这个参数设置会增加共享池的使用。如果共享池出现不足,或者碎片很严重的情况,使用这个参数会加剧问题, 所以,一般在共享池足够大的情况下才能考虑设为true,设为true时可以减少重解析,提高命中率,加快游标的执行(空间换时间)。

这个参数一般情况不需要打开,一般情况下打开对于系统性能的提升不会很大,对于parse很频繁,而且SQL执行很频繁,共享池碎片较为严重的情况,建议不要使用。当然特殊情况有特殊的用途,否则这个参数也没必要存在了。

session_cached_cursors

缺省是0,也就是不CACHE CURSOR,如果设置了SESSION_CACHED_CURSORS,某个CURSOR被频繁调用,那么当第三次被调用的时候会被CACHE,一个被 CACHE的CURSOR下次再被调用的时候,可以省去PARSE的过程,提高SQL执行的效率,这些缓存也是用LRU算法来管理的。应该注意 SESSION_CACHED_CURSORS的值不能超过OPEN_CURSORS的值。在设置SESSION_CACHED_CURSORS参数之前,首先要确定共享池的大小是否足以支持缓冲这些SQL。因为SESSION_CACHED_CURSORS是针对每个SESSION的,对于拥有几百,甚至上千个SESSION的OLTP系统,设置SESSION_CACHED_CURSORS的时候要十分注意,设置大的 SESSION_CACHED_CURSORS参数,需要比较大的共享池来支持,如果调整了这个参数后出现共享池空间不足的情况,调整共享池的大小或者减少SESSION_CACHED_CURSORS参数就是DBA应该进行的操作

cursor_sharing

定义CURSOR共享的模式,EXCAT(精确),FORCE(强制),SIMILAR(类似),如果采用缺省的(精确),那么系统不自动合并和共享CURSOR,只有书写完全一致的CURSOR才能共享。如果设置为SIMILAR,那么SQL PARSE的时候会做PEEKING,如果觉得是可以共享的,那么就共享这个SQL,Oracle自动会将非绑定变量转换为绑定变量。要注意的是,如果某个WHERE条件里的字段存在柱状图,那么PEEKING过程会认为这个SQL的共享是不安全的,那么将不共享这个SQL,此时这个CURSOR会产生一个子CURSOR,形成一个新的版本。这种情况下,只有非绑定变量的值是相同的,PARSER才认为共享是安全的,不产生新的VERSION。如果设置为 FORCE,和SIMILAR类似,会将非绑定变量转为绑定变量,和SIMILAR不同的是,PARSER强行认为共享是安全的,因此不会理会柱状图的信息,直接共享该CURSOR。

CURSOR_SHARING的设置,最佳建议是用精确,在开发过程中,该用绑定变量的地方用绑定变量,不该用的地方不用(什么时候不该用呢?),实在不行,用SIMILAR,但是使用非缺省值的情况,需要查找是否存在BUG,尽早打补丁,另外要测试应用,某些SQL在某些版本使用绑定变量的情况下会出错(不是BUG),FORCE的BUG比较多,更要做好测试。

SQL语句分析分为软分析和硬分析两种。减少软分析和硬分析,特别是减少硬分析,对于降低CPU的使用率有着十分关键的作用

SQL执行的时候,如果某个语句已经被缓冲了,那么这个SQL就不需要进行分析,可以直接执行,因此保证SQL能够在缓冲区中长

时间存在将可以减少SQL分析的发生。有2个参数可以控制SQL在SESSION缓冲池中的时间长短:OPEN_CURSORS和SESSION_CACHED_CURSORS。

那怎样来调整这两个参数呢?检查目前SESSION_CACHED_CURSORS和OPEN_CURSORS的使用率情况

select session_cached_cursors parameter,

lpad(value, 5) value,

decode(value, 0, n/a, to_char(100 * used / value, 990) || %) usage

from (select max(s.value) used

from v$statname n, v$sesstat s

where n.name = session cursor cache count

and s.statistic# = n.statistic#),

(select value from v$parameter where name = session_cached_cursors)

union all

select open_cursors parameter,

lpad(value, 5) value,

to_char(100 * used / value, 990) || % usage

from (select max(sum(s.value)) used

from v$statname n, v$sesstat s

where n.name in

(opened cursors current, session cursor cache count)

and s.statistic# = n.statistic#

group by s.sid),

(select value from v$parameter where name = open_cursors);

查看系统级cursor的命中率,软分析和硬分析的比率

select

to_char(100 * sess / calls, 9999990.00) || % cursor_cache_hits,

to_char(100 * (calls - sess - hard) / calls, 999990.00) || % soft_parses,

to_char(100 * hard / calls, 999990.00) || % hard_parses

from

( select value calls from v$sysstat where name = parse count (total) ),

( select value hard from v$sysstat where name = parse count (hard) ),

( select value sess from v$sysstat where name = session cursor cache hits );

如果返回SESSION_CACHED_CURSORS缓冲区的使用率是100%,那么说明SESSION_CACHED_CURSORS参数还不够大,如果共享池的大小足够,可以调整该参数,直到使用率低于100%为止,

对于没有使用绑定变量的系统,如果CURSOR_SHARING设置为EXACT的时候,如果设置SESSION_CACHED_CURSORS的时候要十分注意,由于应用原因,CURSOR的重用率十分低,如果设置过高的SESSION_CACHED_CURSORS,会导致共享池空间被大量占用,在系统负载较高的时候会出现共享池的性能问题。

B。保留大型对象

加载大型对象是造成共享池碎片的主要原因;由于大量的小型对象需要从共享池释放以腾出空间,会影响响应时间

为了避免这样情况发生,我们就把大型的,经常使用的对象keep在共享池中,哪些对象需要keep呢?

1)经常用到的大型对象,如standard等程序包,使用共享内存超过阀值的对象

2)经常在常用表中执行的触发器

3)序列,因为当序列从共享池中释放时,序列号就丢失了

使用命令 alter system flush shared_pool命令刷新共享池,但不刷新保留对象

例如用下面的sql查出长度大于500个字符,共享内存大于10000个字节的对象

select *

from v$db_object_cache oc

where length(oc.NAME) >500

and oc.TYPE in (PACKAGE, PROCEDURE, FUNCTION, PACKAGE BODY)

and oc.KEPT=NO

and oc.SHARABLE_MEM>10000

查看长度超过500字符,共享内存大于0个字节的匿名pl/sql

select *

from v$sqlarea sq

where sq.COMMAND_TYPE = 47

and length(sq.SQL_TEXT) >500

and sq.SHARABLE_MEM>20000

把这些对象要keep在共享池中要用dbms_shared_pool.keep,系统默认是没有安装这个包的,需要运行dbmspool.sql这个脚本

@/home/oracle/10.2.0/db_1/rdbms/admin/dbmspool.sql“>SYS@skatedb>@/home/oracle/10.2.0/db_1/rdbms/admin/dbmspool.sql

Package created.

Grant succeeded.

View created.

Package body created.

SYS@skatedb >

SQL>desc dbms_shared_pool

Element                  Type

------------------------- ---------

SIZES                    PROCEDURE

KEEP                     PROCEDURE

UNKEEP                   PROCEDURE

ABORTED_REQUEST_THRESHOLD PROCEDURE

SQL>desc dbms_shared_pool.keep

Parameter Type    Mode Default?

--------- -------- ---- --------

NAME     VARCHAR2 IN

FLAG     CHAR    IN  Y

SQL>desc dbms_shared_pool.unkeep

Parameter Type    Mode Default?

--------- -------- ---- --------

NAME     VARCHAR2 IN

FLAG     CHAR    IN  Y

ABORTED_REQUEST_THRESHOLD(threshold_size NUMBER): 这个方法可以设定一个界限,保证如果要进入SHARED POOL的对象太大,那么可以设置一个阀值,超过这个阀值的直接报错,而不是经过LRU查找和内存交换之后发现SHARED POOL不够了再报错,可以防

止超大对象过度占用SHARED POOL空间。

UNKEEP 就是KEEP 的反操作

SIZES (minsize NUMBER): 这个是列出SHARED POOL中所有大于minsize的对象,对于查找SHARED POOL中大对象并设置合理

的ABORTED_REQUEST_THRESHOLD很有用。

说明 flag:

Value       Kind of Object to keep

--       -----       ----------------------

--       P         package/procedure/function

--       Q         sequence

--       R         trigger

--       T         type

--       JS        java source

--       JC        java class

--       JR        java resource

--       JD        java shared data

--       C         cursor

如果这个flag是空,那么他的默认值是P

保留package

sql>exec dbms_shared_pool.keep(package_name,P);

保留squence(避免sequence跳号)

sql>exec dbms_shared_pool.keep(sequence_name,Q);

保留匿名块

SQL>select address,hash_value

2   from v$sqlarea sq

3  where sq.COMMAND_TYPE = 47

4    and length(sq.SQL_TEXT) >500

5    and sq.SHARABLE_MEM>20000

6 ;

ADDRESS         HASH_VALUE

---------------- ----------

00000000A78655E8 1599878706

sql>exec dbms_shared_pool.keep(address,hash_value,C);

注意:查看47是什么命令

SQL>select * from audit_actions where action=47;

ACTION NAME

---------- ----------------------------

47 PL/SQL EXECUTE

eg:

查看需要keep的匿名块

SQL>select address,hash_value

2   from v$sqlarea sq

3  where sq.COMMAND_TYPE = 47

4    and length(sq.SQL_TEXT) >500

5    and sq.SHARABLE_MEM>20000

6 ;

ADDRESS         HASH_VALUE

---------------- ----------

000000008E8532A8  97348712

1 rows selected

确认当前匿名块是否被keep

SQL>select oc.KEPT,sq.ADDRESS,sq.HASH_VALUE

2   from v$db_object_cache oc,

3        v$sqlarea sq

4  where sq.SQL_TEXT=oc.NAME

5  and  sq.HASH_VALUE=97348712

6 ;

KEPT ADDRESS         HASH_VALUE

---- ---------------- ----------

NO 000000008E8532A8  97348712

SQL>

keep住匿名块

SQL>exec dbms_shared_pool.keep(000000008E8532A8,97348712);

begin dbms_shared_pool.keep(000000008E8532A8,97348712); end;

ORA-01426: 数字溢出

ORA-06512: 在 ”SYS.DBMS_UTILITY“, line 114

ORA-06512: 在 ”SYS.DBMS_SHARED_POOL“, line 45

ORA-06512: 在 ”SYS.DBMS_SHARED_POOL", line 53

ORA-06512: 在 line 1

SQL>exec dbms_shared_pool.keep(000000008E8532A8,97348712,C);

PL/SQL procedure successfully completed

SQL>

检查是否被keep住

SQL>select oc.KEPT,sq.ADDRESS,sq.HASH_VALUE

2   from v$db_object_cache oc,

3        v$sqlarea sq

4  where sq.SQL_TEXT=oc.NAME

5  and  sq.HASH_VALUE=97348712

6 ;

KEPT ADDRESS         HASH_VALUE

---- ---------------- ----------

YES 000000008E8532A8  97348712

SQL>

取消对象的keep

SQL>exec dbms_shared_pool.unkeep(000000008E8532A8,97348712,C);

PL/SQL procedure successfully completed

SQL>

确认当前匿名块是否被取消keep

SQL>select oc.KEPT,sq.ADDRESS,sq.HASH_VALUE

2   from v$db_object_cache oc,

3        v$sqlarea sq

4  where sq.SQL_TEXT=oc.NAME

5  and  sq.HASH_VALUE=97348712

6 ;

KEPT ADDRESS         HASH_VALUE

---- ---------------- ----------

NO  000000008E8532A8  97348712

SQL>

剩下keep住package和sequnce就都类似了

共享池碎片问题

绑定变量问题

-----end-----

ORACLE数据备份与数据恢复方案 篇5

相信为数不少的系统管理员每天都在做着同一样的工作――对数据进行备份。一旦哪一天疏忽了,而这一天系统又恰恰发生了故障,需要进行数据恢复,那么此时就无能为力了。假如每天设定一个固定的时间,系统自动进行备份,那该多好啊!下面笔者结合实践经验,谈一谈UNIX环境下Oracle数据库的自动备份,以起到抛砖引玉的作用。

我们计划让数据库在晚上23点做export导出备份,在凌晨2点将备份文件拷贝到磁带上,在凌晨4点将备份文件拷贝到另一台UNIX机器上,为此我们可进行如下操作:

一、导出数据库

export命令将数据库中的数据备份成一个二进制文件,它通常有三种模式:用户模式、表模式和整个数据库模式。本文拟采用用户模式,备份之前,应先建立一个备份目录,以容纳备份文件,比如可建一个/backup目录。接着我们可在UNIX的Oracle目录下(也可以是其它目录)分别建立两个文件ora―backup,tar―backup。需要说明的是,前一个文件需要对Oracle的参数进行初始化,为了方便起见,我们不妨将初始化命令放到一个文件中(文件名姑且定为ora―env),再由第一个文件调用它。

1. ora―env文件对Oracle的参数进行初始化,其内容如下:

ORACLE―HOME=$ORACLE―HOME;export ORACLE―HOMEORACLE―SID=ora73;export ORACLE―SIDORACLE―TERM=sun;export ORACLE―TERMLD―LIBRARY―PATH=$ORACLE―HOME/lib;export LD―LIBRARY―PATHORA―NLS32=$ORACLE―HOME/ocommon/nls/admin/data;export ORA―NLSPATH=.:/usr/clearcase/“ target=”_blank“ >ccs/bin:/usr/ucb:$ORACLE―HOME/bin:$PATH;export PATHDISPLAY=host1:0;export DISPLAYNLS―LANG=american―america.zhs16cgb231280;export NLS―LANG

2. ora―backup文件对数据库做export导出,导出的文件名可以任意定,本文定为字母“xx”加当天日期,即假如当天日期是12月10号,则导出的文件名为“xx1210.dmp ”,以区别于其它日期的备份文件。

 

ora―backup文件内容:

./oracle/ora―env#初始化Oracle数据库rq=′date +″%m%d″ ′#把当天日期赋予变量rqrm /backup/?# 清空 /backup目录exp test/test file=/backup/xx$rq.dmplog=/backup/xx$rq.log

本命令用于在$提示符下,导出test用户的数据(其口令亦为test),导出文件及日志均放在/backup目录下。

 

二、磁带备份

tar―backup文件将用export命令导出的数据文件拷贝到磁带上。tar―backup文件内容:

tar rvf /dev/rmt/0n/backup/?

本命令可将/backup目录下当天产生的文件备份到磁带上。本文件中,tar命令使用了三个参数,其中r选项表示向磁带上拷入文件而不破坏磁带原来内容,v选项表示在拷贝过程中显示文件信息,f选项后面加上磁带设备名,指定文件向何处拷贝,n选项表示磁带机不倒带,

/dev/rmt/0表示UNIX主机第一个磁带驱动器,同理,/dev/rmt/1则表示 UNIX主机第二个磁带驱动器,依此类推。

ora―env、ora―backup、tar―backup文件编写完成后,分别使用下述命令:

chmod 755 ora―envchmod 755 ora―backupchmod 755 tar―backup

这样,三个文件就都变成了可执行文件。

 

三、异地备份

我们知道,通常可用FTP命令在两台主机间传输数据,但一般是通过交互方式实现的,即需要手工输入目标主机的IP地址、用户名、口令等。显然,这不符合自动备份的要求。所幸的是,我们可以通过编写一个.netrc的文件来达到目标。这一文件必须命名为 .netrc,且必须存放在启动FTP命令的机器上的用户注册目录中,该文件的权限应禁止组内或其它用户进行读访问。这样,当用户使用FTP命令的时候,系统将会在该用户的注册目录中寻找.netrc文件,如果能够寻找到,将会首先执行该文件,否则,会交互式地提示用户输入用户名、口令等。

在使用FTP命令之前,应先在另一台作备份用的UNIX机器上建一目录,以容纳备份文件,本文建的目录是/pub 。需要指出的是,为了加快备份速度,两台主机之间的传输速率应尽可能的高,最好位于同一局域网上。

.netrc文件内容如下:machine host2# host2为作备份用的主机名login oracle#oracle为备份主机上的一个用户password oracle#oracle用户的口令为oraclemacdef init#定义一个名为init的宏,它将在自动注册进程的最后被执行bin#文件的传输方式设为二进制lcd /backup# 进入本地工作目录/backupcd /pub# 进入备份主机目录/pubmput ?# 将/backup目录下的所有文件传输至备份主机bye#退出FTP会话进程.netrc文件编写完成后,使用下述命令:chmod 600 .netrc这样,.netrc文件就只能被该用户所访问。

四、启动备份进程

 

Cron是一个永久进程,它由/etc/rc.local启动执行。Cron检查/var/spool/cron/c rontabs/?目录中的文件,找到所要执行的任务和执行任务的时间。Crontab文件的每一行由六个域(minutes、hours、day of month、month、day of week、command)组成,域之间用空格或Tab分开,其中:

minutes:分钟域,值的范围是0到59 hours:小时域,值的范围是0到23 day of month:日期,值的范围是1到31 month:月份,值的范围是1到12 day of week:星期,值的范围是0到6,星期日值为0 command:所要运行的命令

如果一个域是?,表明命令可以在该域所有可能的取值范围内执行。如果一个域是由连字符隔开的两个数字,表明命令可以在两个数字之间的范围内执行(包括两个数字本身)。如果一个域是由逗号隔开的一系列值组成的,表明命令可以在这些值组成的范围内执行。如果日期域和星期域都有值,则这两个域都有效。

 

现在,我们编写一个文件,用以启动自动备份进程。值得注意的是,该文件只能在 Oracle用户名下用crontab -e 命令来编辑,否则将不会被定时执行,文件名定为Orac le,文件将放在/var/spool/cron/crontabs 目录下。编辑完成后,可以在Oracle的$提示符下,用crontab -l命令来查看。

Oracle文件内容:

0 23 ? ? ? /oracle/ora―backup# 每天23点对数据库执行备份0 2 ? ? ? /oracle/tar―backup# 每天2点将文件备份到磁带上0 4 ? ? ? ftp -i host2# 每天4点将文件备份到另一台主机上

经过以上的操作后,系统每天晚上将自动产生一个备份,并且自动将备份文件分别拷贝到磁带上和另一台主机上。系统管理员需要做的是,隔几天换一盘磁带(更换磁带的周期取决于备份文件的大小和磁带的容量)和清理备份目录。这样,他们就可以从备份数据的繁琐中解脱出来,去做其它更有意义的工作。而数据库既实现了磁带备份,又实现了异地备份,相应的安全性也大大提高了。 (完)

 

ORACLE数据备份与数据恢复方案 篇6

关键词:Oracle数据仓库,解决方案,应用技术

数据仓库解决方案涉及到多种技术,开展对Oracle数据仓库解决方案应用技术的研究具有非常重要的意义。应用Oracl数据仓库时,会涉及到多方面的因素,执行操作比较繁琐,其建立在全部数据库的基础上。数据库管理及维护、数据管理及存储、数据展示及分析、数据集中及转换、数据库构建及设计等内容都归属为实现Oracle数据仓库解决方案的范畴。

1 体系结构概述

要想充分的了解Oracle数据仓库解决方案所应用的关键技术,首先要明确该数据仓库的体系结构。从整体上来看,其由数据获取层、数据存储层和数据展现层构成。(1)体系结构中的数据获取层对系统运行效率有直接的影响,可以接收到用户提交的申请要求,能够采取规范、科学的措施进行进一步的操作和管理,例如:转化数据的格式、实现数据信息的重新设置和组成等,最终存储于数据库;(2)数据存储层中包含大量的数据信息,这些数据均被存储在多维数据库或者关系型数据库中。该数据系统的关键构成即为数据信息的存储部分,这些数据信息虽然在来源和种类方面各不相同,但形成了完善的库[1]。在此结构层中存放着海量的数据信息,可能发挥深入挖掘数据、联机分析处理的作用,能够在高效、快速地完成处理大量数据信息的任务,删去了迁移信息的操作过程,使得服务功能得到明显的改善,保障了系统功能的拓展及延伸;(3)在数据展现层的作用下,系统能够将大量的数据提供给用户,该层具有分析数据、汇总数据表的功能,在这个过程中会应用到许多先进的技术和数据处理工具,便于用户在统一的界面中对数据进行实时性访问。

2 应用技术

2.1 ETL过程设计

企业在处理相关业务的过程中,数据信息的来源为外部和内部两个方面,在制定解决方案时会应用到这些数据,这就必须要依靠Extract-Transform-Load(ETL)设计技术来实现[2]。ETL过程设计技术能够发挥转换数据及提取数据的功能,并将处理、加工后的数据信心进行存储设置,在Oracle数据仓库中利用数据仓库技术能够使得解决方案的设计和制定更加具体、全面,扩大方案的应用范围,在不同的条件和环境下均发挥作用。同时,还能够结合用户的个性化要求,应用针对性的方法和措施,实现资源的优化配置和高效利用。在数据仓库技术下的数据采集工作能够通过两种途径来实现,即被动和主动,为加载数据任务的完成提供了技术保障。

2.2 建模

企业在应用Oracle数据仓库解决方案的过程中,都是建立在企业实际发展状况和未来规划目标的基础上形成的,因此在一定程度上,可以反映企业数据库的应用和基本业务等状况[3]。基于业务需求上的动力是构建数据仓库的根本原因,这就要求相关研发工作人员同企业业务员进行有效的沟通和交流,加强两个部分之间的联系,从而开发出同企业发展相适应发的数据仓库解决方案[1]。

2.3 数据管理

同传统的技术相比,集维护、组织、存储、分类等功能于一体的数据管理技术具有显著的优势,能够使用户的数据处理工作更加快捷,简化了操作步骤,具体可以划分为3个不同的阶段。Oracle数据库中存储着庞大的数据信息,为业务的实现提供了坚实的数据保障,但对数据管理工作的要求相对较高。在Oracle数据仓库解决方案的设计过程中,数据管理技术的应用将数据的高效管理变为现实。

2.4 元数据管理

Oracle数据库中的Oracle Warehouse Builder(OWB)拥有管理、设计元数据的功能,可以将大量的数据信息统一进行存储,为后期数据库的管理及维护工作奠定基础。作为一种综合性的应用工具,元数据管理技术能够站在一个整体性的角度,对全部数据进行查看,形成生动、直接的Oracle metadata view,映射信息与数据库二者的关系,将更加真实、可靠的信息提供给研发设计和业务工作人员[4]。在该技术的作用下,用户能够获取数据服务整个过程的运行情况,清晰地查看和分析业务操作结果,对企业工作效率的提升大有裨益。

3 ODM(Oracle Data Mining)应用

具有挖掘数据作用的数据仓库,在对数据分析的过程中,无需对数据进行迁移,将少了操作处理环节,提高了处理和响应效率,使用户对其进行分析,获取具有价值的信息,满足自身的需求。应用Oracle数据仓库的解决方案处理企业业务问题时,构建数据模型、数据信息的汇总和整理、评价分析数据模型等工作都需要良好的数据库环境,并依托挖掘数据价值来实现。作为Oracle Advanced Analytics的一个组件,ODM Oracle数据挖掘技术能够构建多种模型,同应用程序相结合,可以发挥极大的作用,也可以用于查询结构化查询语言方面,对企业未来发展的状况进行预测和分析,使得数据能够在短时间内进行高效的传递和共享,可靠性较强。研发设计人员在此技术的支持下,能够提供更具商业价值的服务和产品,使Oracle数据仓库解决方案的制定更加智能化[5]。

4 OLAP多维分析

根据查看操作繁琐性的不同,可以将数据仓库中的访问技术划分成两大类,其中一种是进行多维式数据分析的联机分析处理技术,该技术的应用需要借助一些工具,操作步骤相对繁琐;而另一种技术的操作相对简单,可以对数据库服务器进行直接的访问。将OLAP多维分析技术应用在制定和设计Oracle数据仓库解决方案领域中,虽然保障了系统的数据查找功能,便于用户进行系统、规范性的分析和研究,但对数据仓库的维护和管理工作提出了更高的要求,增大了后期管理难度。应用于数据仓库系统的联机分析处理技术(Online Analytical Processing)针对的是大量数据信息的处理,可以完善解决方案,前期是必须要确保数据库具有强大的空间容量,从而发挥数据分析作用。

数据库中的联机分析处理结果建立在数据仓库的基础上形成的,可以对企业的日常业务进行处理和操作,尤其在复杂的业务操作中发挥着重要作用,使得数据分析结果更加生动、直观,便于用户理解和分析,为企业的发展做出了巨大的贡献。该技术下的多维关系是保障数据信息管理高效性的关键,一方面可以减少数据仓库后期维护和管理所需的成本费用,另一方面还能够对企业发展策略的制定提供支持。

Oracle数据仓库解决方案中的OLAP多维分析技术具有明显的优势,其特点主要表现在以下几个方面:(1)由于用户角色的不同,在系统中所拥有的权利也各不相同,数据仓库中数据的访问操作同用户的权限有直接的关系,只能允许全县范围内的用户使用。联机分析处理数据信息安全性较高,系统会根据用户的权利对相应的操作进行管理,用户管理要求较高[6];(2)Oracle数据仓库中涵盖了大量的数据管理操作要求,能够对大量的数据进行统一、规范的管理,系统性能大大提高;(3)OLAP应用程序接口访问、结构化查询语言的实现都建立在数据仓库中的特定关系基础上,研发工作人员应用OLAP多维分析技术可以对多项数据信息进行查看、分析。

此外,OLAP多维分析技术还可以提供AVM分析工作区管理,用于对数据模型的构建,完成业务操作,明确数据信息在数据库中的关系,并形成一个整体性的数据表,计算能力较强,能够对海量的数据信息进行处理。该技术下的数据运算种类较多,提升了业务能力。OLAP操作编程语言能够对数据仓库中的数据的运算进行表达,通过相应的函数运算,完成加在数据的操作,还可以结合实际需求,对数据库中的信息进行修改、添加或删除等更新操作,为企业业务处理时所需的运算和统计提供了有利的保障。

5 结语

近年来,Oracle数据仓库解决方案获得了广泛的应用,促进了各个行业的发展,提升了企业的管理和服务水平,成为社会各界研究的重点课题。结合以往对Oracle数据仓库解决方案应用技术的研究成果,可以发现实施过程中的关键技术包括建模技术、ETL过程设计技术、元数据管理技术、数据管理技术等。此外,联机分析处理多维分析技术及ODM应用技术的应用,也使得数据仓库解决方案更加完善,提高了系统性能。

参考文献

[1]唐宏,聂能,熊思民,赵明伟.数据仓库实现技术[J].数字通信,2000,(08).

[2]陆剑峰,张浩.数据仓库数据更新的研究及基于Oracle数据库的开发与应用[J].计算机工程与应用,2004,(26).

[3]侯筱婷.基于数据仓库、OLAP和数据挖掘技术的数据分析、展现与预测[D].西安电子科技大学,2007.

[4]张腾飞.基于数据仓库的信用信息系统的分析与设计[D].武汉理工大学,2009.

[5]马洪江.浅论数据仓库在企业管理决策支持系统中的应用[J].成都大学学报(自然科学版),2000,(03).

ORACLE数据备份与数据恢复方案 篇7

关键词:SQL;Oracle;优化

中图分类号:TP311 文献标识码:A文章编号:1007-9599 (2011) 08-0000-02

SQL Optimization&Analyze in Oracle Database

Wang Yue

(CNOOC Gas&Power Group,Beijing100027,China)

Abstract:Executing each SQL statement,Oracle have to implement many steps.Each stepmay be physically retrieve data from the database row or rows of data in some way prepared.The statement where the Oracle used to execute those statements of combination of these steps is called an execution plan.execution plan is the most complex and most critical part in optimization of SQL,only know how Oracleinternally execute SQL statement,we can confirm that the execution plan where the optimizationr selected as suitable or not.

Keywords:SQL;Oracle;Optimization

一、引言

执行每个SQL语句,Oracle需要实现很多步骤。Oracle用来执行语句的这些步骤的组合被称之为执行计划。执行计划是SQL优化中最为复杂也是最为关键的部分,只有知道了Oracle在内部到底是如何执行该SQL语句后,我们才能知道优化器选择的执行计划是否为最优的。如何分析执行计划,从而找出影响性能的主要问题。下面先从分析SQL语句执行步骤开始介绍,再介绍如何分析执行计划。优化器有时也被称为查询优化器,这是因为查询是影响数据库性能最主要的部分,优化器是所有关系数据库引擎中的最神秘、最富挑战性的部件之一,从性能的角度看也是最重要的部分,它性能的高低直接关系到数据库性能的好坏。

二、Oracle的优化规则

(一)什么是优化

优化是选择最有效的执行计划来执行SQL语句的过程,这是在处理任何数据的语句(SELECT,INSERT,UPDATE或DELETE)中的一个重要步骤。对Oracle来说,执行这样的语句有许多不同的方法,譬如说,将随着以什么顺序访问哪些表或索引的不同而不同。所使用的执行计划可以决定语句能执行得有多快。Oracle中称之为优化器(Optimizer)的组件用来选择这种它认为最有效的执行计划。由于一系列因素都会影响语句的执行,优化器综合权衡各个因素,在众多的执行计划中选择认为是最佳的执行计划。然而,应用设计人员通常比优化器更知道关于特定应用的数据特点。这是需要人工干预数据库优化的主要原因。

看下面这个SQL(pro*c):

EXEC SQL UPDATE employees

SET salary=1.10*salary

WHERE department-id=var-department-i

Oracle把它分成下列步骤来执行:

第1步:Create a Cursor

第2步:Parse the Statement

第3步:Describe Results of a Query

第4步:Define Output of a Query

第5步:Bind Any Variables

第6步:Parallelize the Statement

第7步:Run the Statement

第8步:Fetch Rows of a Query

第9步:Close the Cursor

下面来详细分析这些步骤:

第1步:Create a Cursor

由程序接口调用创建一个游标。任何SQL语句都会创建它,特别在运行DML语句时,都是自动创建游标的,不需要开发人员干预。多数应用中,游标的创建是自动的。而在预编译程序(pro*c)中游标的创建,可能是隐含的,也可能显式的创建。在存储过程中也是这样的。

第2步:Parse the Statement

语法分析分别执行下列操作:翻译SQL语句,验证它是合法的语句,即书写正确。实现数据字典的查找,以验证是否符合表和列的定义,在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变这些对象的定义,验证为存取所涉及的模式对象所需的权限是否满足。

第3步:Describe Results of a Query

描述阶段只有在查询结果的各个列是未知时才需要;例如,当查询由用户交互地输入需要输出的列名。在这种情况要用描述阶段来决定查询结果的特征(数据类型,长度和名字)。

第4步:Define Output of a Query

在查询的定义阶段,你指定与查询出的列值对应的接收变量的位置、大小和数据类型,这样我们通过接收变量就可以得到查询结果。如果必要的话,Oracle会自动实现数据类型的转换。这是将接收变量的类型与对应的列类型相比较决定的。

第5步:Bind Any Variables

在该例中,Oracle需要得到对department-id列进行限定的值。得到这个值的过程就叫绑定变量(binding variables)决定此语句最佳的执行计划将它装入共享SQL区对分布的语句来说,把语句的全部或部分路由到包含所涉及数据的远程节点

第6步:并行执行语句(Parallelize the Statement)

并行化可以导致多个服务器进程(oracle server processes)为同一个SQL语句工作,使该SQL语句可以快速完成,但是会耗费更多的资源,所以除非很有必要,否则不要使用并行查询。

第7步:Run the Statement

Oracle拥有所有需要的信息与资源,因此可以真正运行SQL语句了。如果该语句为SELECT查询或INSERT语句,则不需要锁定任何行,因为没有数据需要被改变。

第8步:Fetch Rows of a Query

在fetch阶段,行数据被取出来,每个后续的存取操作检索结果集中的下一行数据,直到最后一行被取出来。上面提到过,批量的fetch是优化的技巧之一。

第9步:Close the Cursor

SQL语句处理的最后一个阶段就是关闭游标

(二)Oracle的优化器

优化器有时也被称为查询优化器,这是因为查询是影响数据库性能最主要的部分,不要以为只有SELECT语句是查询。实际上,带有任何WHERE条件的DML语句中都包含查询要求。在ORACLE的发展过程中,一共开发过2种类型的优化器:基于规则的优化器和基于代价的优化器。这2种优化器的不同之处关键在于:取得代价的方法与衡量代价的大小不同。现对每种优化器做一下简单的介绍:RBO(rule base optimization)基于规则和CBO(cost base optimization)基于成本。

三、SQL执行计划

(一)分析执行计划

假定A、B、C都是不是小表,且在A表上一个组合索引:A(a.col1,a.col2),注意a.col1列为索引的引导列。考虑下面的查询:

select A.col4

from A,B,C

where B.col3=10 and A.col1=B.col1 and A.col2=C.col2 and C.col3=5

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimization=CHOOSE

1 0 MERGE JOIN

2 1 SORT(JOIN)

3 2 NESTED LOOPS

4 3 TABLE ACCESS(FULL)OF'B'

5 3 TABLE ACCESS(BY INDEX ROWID)OF'A'

6 5 INDEX(RANGE SCAN)OF'INX_COL12A'(NON-UNIQUE)

7 1 SORT(JOIN)

8 7 TABLE ACCESS(FULL)OF'C'

Statistics

----------------------------------------------------------

0 recursive calls

8 db block gets

6 consistent gets

0 physical reads

0 redo size

551 bytes sent via SQL*Net to client

430 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

2 sorts(memory)

0 sorts(disk)

6 rows processed

执行计划:

Execution Plan

----------------------------------------------------------

0 SELECT STATEMENT Optimization=CHOOSE

1 0 MERGE JOIN

2 1 SORT(JOIN)

3 2 NESTED LOOPS

4 3 TABLE ACCESS(FULL)OF'B'

5 3 TABLE ACCESS(BY INDEX ROWID)OF'A'

7 1 SORT(JOIN)

8 7 TABLE ACCESS(FULL)OF'C'

看执行计划时,我们的关键不是看哪个操作先执行,哪个操作后执行,而是关键看表之间连接的顺序(如得知哪个为驱动表,这需要从操作的顺序进行判断)、使用了何种类型的关联及具体的存取路径(如判断是否利用了索引)在从执行计划中判断出哪个表为驱动表后,根据我们的知识判断该表作为驱动表(就像上面判断ABC表那样)是否合适,如果不合适,对SQL语句进行更改,使优化器可以选择正确的驱动表。

(二)干预执行计划

基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担。但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比。此时就需要进行人为的干预,告诉优化器使用我们指定的存取路径或连接类型生成执行计划,从而使语句高效的运行。例如,如果我们认为对于一个特定的语句,执行全表扫描要比执行索引扫描更有效,则我们就可以指示优化器使用全表扫描。在ORACLE中,是通过为语句添加hints(提示)来实现干预优化器优化的目的。

hints是Oracle提供的一种机制,用来告诉优化器按照我们的告诉它的方式生成执行计划。我们可以用hints来实现:

1.使用的优化器的类型。

2.基于代价的优化器的优化目标,是all-rows还是first-rows。

3.表的访问路径,是全表扫描,还是索引扫描,还是直接利用rowid。

4.表之间的连接类型

5.表之间的连接顺序

6.语句的并行程度

除了“RULE”提示外,一旦使用别的提示,语句就会自动的改为使用CBO优化器,此时如果你的数据字典中没有统计数据,就会使用缺省的统计数据。所以建议大家如果使用CBO或HINTS提示,则最好对表和索引进行定期的分析。

Hints只应用在它们所在sql语句块(statement block,由select、update、delete关键字标识)上,对其它SQL语句或语句的其它部分没有影响。如:对于使用union操作的2个sql语句,如果只在一个sql语句上有hints,则该hints不会影响另一个sql语句。我们可以使用注释(comment)来为一个语句添加hints,一个语句块只能有一个注释,而且注释只能放在SELECT,UPDATE,DELETE关键字的后面,如果你没有正确的指定hints,Oracle将忽略该hints,并且不会给出任何错误。

参考文献:

[1]盖国强,冯春培,叶梁等.Oracle数据库性能优化(第4版)[M].北京:人民邮电出版社,2005

[2]阿弗尤尼,吴越胜,张耀辉等.Oracle 9i数据库性能调整与优化[M].北京:清华大学出版社,2005

上一篇:夜之杂感作文下一篇:培智五年级数学试卷