Oracle数据库碎片

2024-12-22 版权声明 我要投稿

Oracle数据库碎片(精选10篇)

Oracle数据库碎片 篇1

我们知道, Oracle 作为一种大型数据库,广泛应用于金融、邮电、电力、民航等数据吞吐量巨大,计算机网络广泛普及的重要部门。对于系统管理员来讲,如何保证网络稳定运行,如何提高数据库性能,使其更加安全高效,就显得尤为重要。作为影响数据库性能的一大因素 -- 数据库碎片,应当引起 DBA 的足够重视,及时发现并整理碎片乃是 DBA 一项基本维护内容。

1 、碎片是如何产生的

---- 当生成一个数据库时,它会分成称为表空间( Tablespace )的多个逻辑段( Segment ),如系统( System )表空间 , 临时( Temporary )表空间等。一个表空间可以包含多个数据范围( Extent )和一个或多个自由范围块,即自由空间( Free Space )。

---- 表空间、段、范围、自由空间的逻辑关系如下:

---- 当表空间中生成一个段时,将从表空间有效自由空间中为这个段的初始范围分配空间。在这些初始范围充满数据时,段会请求增加另一个范围。这样的扩展过程会一直继续下去,直到达到最大的范围值,或者在表空间中已经没有自由空间用于下一个范围。最理想的状态就是一个段的数据可被存在单一的一个范围中。这样,所有的数据存储时靠近段内其它数据,并且寻找数据可少用一些指针。但是一个段包含多个范围的情况是大量存在的,没有任何措施可以保证这些范围是相邻存储的,如图〈 1 〉。当要满足一个空间要求时,数据库不再合并相邻的自由范围(除非别无选择),而是寻找表空间中最大的自由范围来使用。这样将逐渐形成越来越多的离散的、分隔的、较小的自由空间,即碎片。例如:

2 、碎片对系统的影响

---- 随着时间推移,基于数据库的应用系统的广泛使用,产生的碎片会越来越多,将对数据库有以下两点主要影响:

---- ( 1 )导致系统性能减弱

---- 如上所述,当要满足一个空间要求时,数据库将首先查找当前最大的自由范围,而 “ 最大 ” 自由范围逐渐变小,要找到一个足够大的自由范围已变得越来越困难,从而导致表空间中的速度障碍,使数据库的空间分配愈发远离理想状态;

---- ( 2 )浪费大量的表空间

---- 尽管有一部分自由范围(如表空间的 pctincrease 为非 0 )将会被 SMON (系统监控)后台进程周期性地合并,但始终有一部分自由范围无法得以自动合并,浪费了大量的表空间。

3 、自由范围的碎片计算

---- 由于自由空间碎片是由几部分组成,如范围数量、最大范围尺寸等,我们可用 FSFI--Free Space Fragmentation Index (自由空间碎片索引)值来直观体现:

FSFI=100*SQRT(max(extent)/sum(extents))*1/SQRT(SQRT(count(extents)))

---- 可以看出, FSFI 的最大可能值为 100 (一个理想的单文件表空间)。随着范围的增加, FSFI 值缓慢下降,而随着最大范围尺寸的减少, FSFI 值会迅速下降。

---- 下面的脚本可以用来计算 FSFI 值:

rem FSFI Value Compute

rem fsfi.sql

column FSFI format 999,99

select tablespace_name,sqrt(max(blocks)/sum(blocks))*

(100/sqrt(sqrt(count(blocks)))) FSFI

from dba_free_space

group by tablespace_name order by 1;

spool fsfi.rep;

/

spool off;

---- 比如,在某数据库运行脚本 fsfi.sql, 得到以下 FSFI 值:

TABLESPACE_NAME FSFI

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

RBS 74.06

SYSTEM 100.00

TEMP 22.82

TOOLS 75.79

USERS 100.00

USER_TOOLS 100.00

YDCX_DATA 47.34

YDCX_IDX 57.19

YDJF_DATA 33.80

YDJF_IDX 75.55

---- 统计出了数据库的 FSFI 值,就可以把它作为一个可比参数,

在一个有着足够有效自由空间,且 FSFI 值超过 30 的表空间中,很少会遇见有效自由空间的问题。当一个空间将要接近可比参数时,就需要做碎片整理了。

4 、自由范围的碎片整理

---- ( 1 )表空间的 pctincrease 值为非 0

---- 可以将表空间的缺省存储参数 pctincrease 改为非 0 。一般将其设为 1 ,如:

alter tablespace temp

default storage(pctincrease 1);

---- 这样 SMON 便会将自由范围自动合并。也可以手工合并自由范围:

alter tablespace temp coalesce;

5 、段的碎片整理

---- 我们知道,段由范围组成。在有些情况下,有必要对段的碎片进行整理。要查看段的有关信息,可查看数据字典 dba_segments ,范围的信息可查看数据字典 dba_extents 。如果段的碎片过多,将其数据压缩到一个范围的最简单方法便是用正确的存储参数将这个段重建,然后将旧表中的数据插入到新表,同时删除旧表。这个过程可以用 Import/Export (输入 / 输出)工具来完成。

---- Export 命令有一个(压缩)标志,这个标志在读表时会引发 Export 确定该表所分配的物理空间量,它会向输出转储文件写入一个新的初始化存储参数 -- 等于全部所分配空间。若这个表关闭, 则使用 Import ()工具重新生成。这样,它的数据会放入一个新的、较大的初始段中。例如:

exp user/password file=exp.dmp compress=Y grants=Y indexes=Y

tables=(table1,table2);

---- 若输出成功,则从库中删除已输出的表,然后从输出转储文件中输入表:

imp user/password file=exp.dmp commit=Y buffer=64000 full=Y

---- 这种方法可用于整个数据库。

---- 以上简单分析了 Oracle 数据库碎片的产生、计算方法及整理,仅供参考。数据库的性能优化是一项技术含量高,同时又需要有足够耐心、认真细致的工作。

Oracle数据库碎片 篇2

随着信息化程度的不断提高, 现有的信息系统的用户数量急速增长, 作为用于存储和处理数据的系统后台数据库, 其中的数据存储量也随着这些因素成几何级数的增长。在实际使用中, 数据库系统最初的设置不能满足运行一段时间以后系统对性能的要求, 如果不能及时对系统进行优化处理, 数据库的性能会越来越差, 严重影响人们对信息的使用效率, 同时这些系统的隐患如果不及时解决, 最后必将导致系统的崩溃。由于Oracle数据库先进的、完整的、集成的电子商务解决方案, Oracle数据库占据了绝大多数的市场份额。因此, 对Oracle的优化技术的研究对信息系统有非常重要的意义。

正因为Oracle数据库的优化非常重要, Oracle的优化工作应当贯穿整个系统的设计, 运行的整个过程。Oracle数据库的优化主要包括以下几个方面, 数据库参数调整, SQL语句优化, 服务器操作系统参数调整以及网络性能调优。本文主要从数据库服务器内存参数调整和SQL语句优化两个方面论述如何对Oracle数据库进行性能调优。

1 对数据库服务器内存分配的调整

由于对服务器内存参数的调整对oracle的性能影响显著, 它成为Oracle数据库性能调优的首选对象。服务器内存参数的调整主要是对数据库系统全局区的调整, 系统全局区包括共享池、数据缓冲区、日志缓冲区。其中最主要的是对数据缓冲区和共享池的参数调整。

数据库缓冲区的作用主要是将从磁盘中读取的数据块存放在内存缓存中, 从这个意义上说数据库缓冲区越大, 存放的共享数据就越多, 减少了对磁盘数据的物理读操作, 也就提高了系统的响应速度。

共享池的作用主要是用来存放最近使用过的sql语句的, 它由一个最近最少使用的算法来管理, 由库高速缓存和数据字典缓冲区两部分组成。修改这一参数的设置, 能提高系统性能, 是由Oracle数据库系统处理用户提交的SQL语句的步骤决定的。Oracle处理SQL语句, PL/SQL程序之前会先对其进行语法分析, 权限确认, 在确认语法正确, 权限合理的之后, 会对SQL进行优化, 最终生成执行计划。这个过程花费了大量的时间, 如果在执行这些语句的时候可以将这些内容保存下来, 在下次执行相同的SQL语句或者PL/SQL, 就可以跳过这个步骤, 进而提高系统的响应速度。如果这一区域比较大, 在内存中找到相同数据的概率越大, 可以减少对SQL语句的重复解析的时间, 能明显的改进数据库的性能。但是共享池也并非越大越好, 如果共享池太大, Oracle为了维护这一共享结构, 需要付出更大的管理开销, 反而对数据库系统的性能维护不利。一般来说, 系统内存为1G, 共享池可设为150M~200M, 内存增压1G, 该值增加100M, 但共享池的最大值不应当超过500M。

综上所述, 系统全局区的参数设置应当随着系统的运行进行适当的调整, 使之在合理的范围内尽量大, 但是不能超过一个限度, 如果这一区域过大, 反而会占用操作系统使用的内存, 引起虚拟内存的页面交换, 降低了系统效率。

2 Sql优化

由于应用程序的执行最终归结为后台数据库中SQL语句的执行, SQL语句本身的执行效率就成为了影响oracle数据库执行效率的一个重要因素, 当我们对Oracle处理SQL语句的机制有所了解, 通过对SQL语句进行适当的调整, 就能提高Oracle数据库系统的性能。

1) 在基于规则的优化器中, Oracle对from子句中的表名是按照从右到左的顺序进行解析的, 即:

From子句中排在最后的表会被首先处理。我们把这张表称做驱动表。当from字句中包含多个标的情况下, oracle是通过排序合并的方式连接这些表的, 为了提高oracle的执行效率, 应当选择包含记录条数少的表作为驱动表, 即放在from子句的最后。当from子句中有3张以上的表进行连接查询时, 需要将连接其他表的交叉表作为驱动表。

2) 在oracle语句中, where子句的执行顺序是自下而上的对语句进行解析的。为了提高sql语句的执行效率, 应该将能过滤掉大量数据的条件写在where子句的最后。

3) 在selcect语句中使用*虽然对编程人员简单方便, oracle会自动列出所有列名, 但oracle解析*时则是通过查询数据字典来完成对*的转换的, 这样耗费了更多的时间用来查询数据字典, 转换, 必然降低执行效率, 因此在selcect语句中应当直接列出所有的列名。

4) 用where子句代替having子句, 在where子句中排除不需要的记录, 这样的执行效率将远远高于执行完成之后用having子句对记录进行筛选。

总体来说, Oracle数据库的性能优化涉及的方面很广, 是一个系统工程, 需要在系统设计运行的过程中, 不断运用以上提到的各个方面, 对Oracle数据库系统进行优化, 以确保数据库的使用效率。数据库的性能变差, 往往不是一个方面的问题, 而是各种问题相互结合导致的, 因此, 需要对各种因素综合分析, 对各种优化手段综合应用, 才能做到将数据库的性能维持在一个比较好的水平。

参考文献

[1]Gaja Krishna Vaidyanatha.Oracle性能优化技术内幕.机械工业出版社, 2002, 5:284.

创建Oracle数据库的原则 篇3

关键词:Oracle;数据库;原则

中图分类号:TP311.13 文献标识码:A文章编号:1007-9599 (2010) 14-0000-03

The Principle of Creating Oracle Database

Liu Yin

(China Airlines Clearing Co.,Ltd.,Beijing100028,China)

Abstract:In the China Aviation Clearing Corporation six years of work has been engaged in the Oracle applications database development and maintenance.Application process in the establishment of a database and found that many applications do not meet the Oracle database creation application of the principle database settings. This problem is prevalent in many systems,we consider the availability of more,while ignoring the performance of the database problems.I would like to work according to their own practical experience,according to Oracle applications to talk about the process of database creation and consideration should be noted that some basic principles and requirements.

Keywords:Oracle;Database;Principle

首先我想要申明的是,这个过程是根据NT上Oracle应用数据库建立过程来说明的,但是所说的原则同样适用于其他的操作系统平台(如UNIX)。虽然对于Oracle方面的高手来说,有一点班门弄斧的嫌疑,但是对于一个需要全面了解Oracle建立过程的初、中级用户,仍然还是大有益处的(这个例子中将要建立的实例名和数据库名设为VETO)。

一、初始化文件(initSID.ora)的建立

大家都知道要建立一个初始化文件(例如initAOMN.ora),这个文件可以用写字板进行编辑和修改。这个文件决定了实例的基本配置和性能,中间参数的大小需要根据具体的应用要求决定。用户还可以根据情况的变化,以后进行调整修改。

许多关键的参数Oracle公司都给了大、中、小三个标准,用户可以根据需要确定。除了要修改DB_NAME,将它改为将要建立的数据库名外,还有以下的几个参数要注意:

(一)CONTROL_FILES是指定控制文件的名称和位置。控制文件必须小于8个。但是为了防止控制文件毁坏而导致数据库的崩溃,建议将控制文件指定在不同硬盘上互做备份。文件名最好让人望名知意。

(二)SHARE_POOL_SIZE指的是共享池的大小,如果想加快SQL语句的处理速度,而且操作系统的内存足够的话,可以开大些加快速度

(三)DB_BLOCK_SIZE这个参数设置Oracle块的大小。对于OLTP(在线事务处理系统),应该设置得小点,而对于DDS(数据仓库)而言,应该设置得大点。一旦设定并且数据库建立以后时没有办法修改的。这个问题值得注意。

二、建立实例(Instance)

数据库的实例指的是为处理数据库而分配的内存结构和后台处理过程,它的配置和性能由上面的初始化文件决定的。为了在操作系统中建立这个实例,必须使用Oracle提供的Oradim工具。我们可以在NT Windows菜单的运行中输入:

ORADIM73 -NEW -SID VETO -USRPWD VETO -STARTTYPE SVRC,INST -STARTMODE AUTO -PFILE=D:ORANTDATABASEVETOINITVETO.ORA

这个命令的结果是在操作系统中建立了一个实例,并且实例的启动方式是自动。internal用户的密码是VETO,在系统的服务中建立了OracleStartVeto和OracleServiceVeto两个服务。在开始的时候OracleServiceVeto已经启动,但是OracleStartVeto可能没有启动。所以可用Net Start OralceStartVeto直接将OralceStartVeto和OralceServiceVeto启动,确保这个实例所需的服务都正常启动。即:C:NET START OracleServiceVeto

三、建立数据库(database)

实例的建立只是为数据库的建立做了一个准备,我们可以将实例付给任何一个数据库使用,只要数据库的参数MaxInstances没有被超过。建数据库需要用CREATE DATABASE命令,最好事先将参数写入一个SQL文件中,以被使用和今后的维护。我们需要了解建立数据库时,一些参数的意义,有利于我们对数据库性能的把握。

例如:这里用到的CREATE_DB_VETO.SQL

CREATE DATABASE VETO

CONTROLFILE REUSE

MAXLOGFILES 32MAXLOGMEMBERS 5MAXDATAFILES 50 MAXINSTANCES 2

LOGFILE GROUP 1 ('D:ORANTDATABASEVETOLOGVETO11.RDO',

'D:ORANTDATABASEVETOLOGVETO12.RDO')SIZE 1M,

GROUP 2 ('D:ORANTDATABASEVETOLOGVETO21.RDO',

'D:ORANTDATABASEVETOLOGVETO22.RDO')SIZE 1M

DATAFILE 'D:ORANTDATABASEVETOSYSTEMVETO.DBF' SIZE 100M

CHARACTER SET ZHS16cgb231280;

在这里我们需要注意以下几点要求:

(一)如果initVeto.ora文件中指定的controlfile已经存在才可以在建立数据库时使用CONTROLFILE REUSE,否则不能使用.

(二)MAXLOGFILES指最大的redo log file的group数。MAXLOGMEMBERS指最大的redolog file的group中的member数。MAXDATAFILES指数据库中最大的datafile数。MAXINSTANCES指数据库可被多少个instance使用数。这五个参数将会影响controlfile的大小

(三)LOGFILE指的是redo log file的设置,每个GROUP中的MEMBER文件的大小必须是大小相同的。由于redo log file是循环使用的,所以最少必须有两个GROUP,否则数据库无法建立。虽然每个GROUP的MEMBER文件可以只有一个,但是为了防止某个MEMBER文件的毁坏而导致数据库的不可用,必须在每个GROUP中有多个MEMBER,最好是每个GROUP有相同数目的MEMBER文件。建立数据库的SQL语句写好后,以internal用户进入,重新启动实例并进入数据库的nomount状态,建立数据库并打开数据库。

结果:INSTANCE启动,数据库是OPEN状态,数据库可以被使用。在建立数据库的过程中,数据库中所用到的基表都在这个过程由系统运行sql.bsq自动建立了。

四、建立动态性能视图(data dictionary view)

当数据库建立后,用户仍然不能用system用户的身份进入系统。这是由于数据库的基表虽然已经建立,但是动态性能视图没有建立,所以system的身份无法被系统确认。必须以sys或者internal用户的身份重新进入系统,运行catalog.sql和catproc.sql(这两个文件存在于目录%Oracle_homerdbms73admin中)。catalog.sql的目的是建立动态性能视图。catproc.sql的目的是建立运行SQL,PL/SQL所需的一些函数包和其他帮助工具包。虽然这个时候system用户可以登录数据库,但是可能系统要求运行pupbld.SQL,目的是防止系统设置的确省的profile不能被访问。

五、建立监听器(LISTENER.ORA)

数据库的基本结构已经建立,但是用户仍然无法远程访问数据库,因为操作系统,需要为新建的实例建立一个监听器,监听用户发出的连接请求。首先,我们必须手动的修改D:ORANTNTWORKADMINLISTENER.ORA的最后部分,然后,我们进入操作系统的服务中重启OracleTNSListener服务使修改生效,新的监听器建立。但是我们还是不能远程访问数据库,必须建立数据库别名。

六、建立数据库别名

监听器中的SID_NAME指的VETO是监听器监听的连接串的值。这个值必须等于数据库别名,所以我们必须在SQL NET EASY CONFIG中建立数据库别名,使数据库的能被远程访问数据库。例如:VETOTCP/IP10.1.3.57VETO。上面句中的前一个VETO指的是数据库别名,而后一个VETO指的是实例名。由于为了方便使用和理解,推荐使数据库别名等于实例名。

七、表空间(tablespace)

上面的六步将数据库建立了起来,但是对于一个Oracle应用数据库来说仅仅是将基本的结构建立了起来,为了使数据库能够被应用程序所使用,必须为不同的应用建立不同属性的表空间。首先,建立一个存放应用程序的数据的表空间,在建立这类表空间的时候存在很多问题。我们先来建立一个数据表空间,再讨论一下建立的原则,这些原则是避免问题的关键:

create tablespace DATA

datafile 'd:orantdatabasevetodatveto.ora' size 600M

storage(initial 1600K next 1600K pctincrease 100 minextents 1 maxextents unlimited)autoextend on next 100M maxsize 1000M;

(一)由于许多系统在建表生成的SQL语句中并没有指定表的存储参数, 建表时会使用表空间的存储参数,所以并且在建立表空间时最好指定存储参数。这需要根据具体系统的特点来设置,对于一个数据表空间,由于不同的表的定义和存放的数据量一般有很大的差异,所以建议采取中等的值。

(二)为了防止在分配extent时在表空间的数据文件中产生碎片,initial和next的值必须是db_block_size的整数倍。而且是db_file_multiblock_read_count*db_block_size的整数倍,目的是在全表搜索时速度快。

(三)数据表空间中的数据表比较多,而大量的表的数据比较小,所以initial和next不能太小,也不能太大,minextents设置为1。而且个别表中的数据多,所以maxextents设置为unlimited,pctincrease=100保证数据可以全部导入表中。pctincrease的设置必须满足上面的第二条,也就是接下来建立的extent不会在数据文件中建立碎片,在这里设为100,设所有的分配的EXTENT满足条件。

接下来建立一个存放应用程序代码的表空间,这类表空间中的数据变化不大,并且数据量不大,所以initial和next也不必太大,pctincease设置为0.其他的原则与建立数据表空间的原则一致.

八、建会滚表空间和回滚段(rollback segment)

回滚段是用来记录是数据被DML(数据处理语言)处理前的值,如果事务被回滚,可以将数据恢复到修改前。它还为其他的用户提供读一致性(read consistency),就是数据被一个用户进行DML处理但还没有提交时,其他用户读取数据时看到的值。数据库建立时,会在system表空间中建立一个系统回滚段,这个回滚段是为system/sys/internal用户操作动态性能视图及其基表而使用,其他用户不能使用这个回滚段。所以我们必须为其他用户操作数据库数据而建立回滚段。为了减少因使用回滚段产生的碎片,最好建立一个专门的回滚段表空间。然后就可以建立回滚段了,但有几点必须注意:

(一)在创建时回滚段可以指定为PUBLIC或PRIVATE(默认),在创建后不能更改。一般建立的回滚段为PUBLIC。不能为回滚段指定PCTINCREASE参数,总是设置为0。这一点很多时候都被忽略了。对于回滚段而言,总是使用INITIAL=NEXT,以保证所有的扩展有相同的大小。

(二)OPTIMAL参数,如果设置了,必须至少和回滚读段的初始值相等,而且最好设置,可以保证回滚段在没有事务处理时可以自动的回到OPTIMAL指定的值,释放空间。

(三)按照事务所需的平均空间设置OPTIMAL参数。如果没有适当的数值,把它设置为初始值,以后再调整。不要把MAXEXTENTS设置为UNLIMITED。这可能会导致不必要的回滚段扩展,可能会由于程序错误造成数据文件的扩展。

(四)总是把回滚段放在分离的、独占的表空间中,以便把竞争和碎片降到最低。所以必须专门的建立一个回滚段表空间。回滚段的数量没有详细的规定,但是对于OLTP系统,一般四个事务对应使用一个回滚段。回滚段必须ONLINE后才可以被使用。

九、建临时表空间

很多时候我们忽略了临时表空间的建立,因为它的影响仅仅限于排序查询时,对速度的影响。临时段是在排序结果大于PGA中SORT_AREA_SIZE指定的排序区,在指定的临时表空间存放排序的中间结果时产生的,在实例关闭时才释放。由于临时段产生的碎片比任何段都多,所以必须建立一个专门的临时表空间,虽然在临时表空间中只有一个临时段。

十、建立用户并授权

对于一个应用程序,必须建立不同于SYSTEM用户的其他用户来管理应用程序的数据和代码。所以我们将上面建立的数据表空间和代码表空间分别给用户DATA和CODE,如下:

CREATE USER UNIFACE IDENTIFIED BY ACCA DEFAULT TABLESPACE DATA TEMPORARY TABLESPACE TMP PROFILE DEFAULT;

GRANT RESOURCE TO UNIFACE;

CREATE USER CODE IDENTIFIED BY ACCA DEFAULT TABLESPACE CODE TEMPORARY TABLESPACE TMP PROFILE DEFAULT;

GRANT RESOURCE TO CODE;

要求和原则:

(一)建用户时必须指定用户的确省表空间和临时表空间,确省表空间保存用户所有对象。临时表空间是在排序时作为当排序所需的空间大于SORT_AREA_SIZE时存放临时过程使用的。

(二)用户建立时,系统自动将角色CONNECT付给用户,但是用户如果想拥有建立对象的权利,就必须将角色RESOURCE付给用户。

虽然第二步到第四步在NT上都可以在INSTANCE MANAGER中完成,但是由于不能给大家更加清晰和灵活的配置,建议不要用。而且根据以上十步关于建立Oracle应用数据库的过程,可以将这个过程写成批处理过程,这样不仅有助于保留建立应用数据库的参数,加快数据库的建立过程,而且还有助于日后的对数据库进行性能调整。所以我推荐根据具体的应用系统要求,建立一套标准的建立过程,是很有必要。

ORACLE数据库的部分试题 篇4

1怎样查看数据库引擎的报错

解答:alert log.

2比较truncate和delete 命令

解答:两者都可以用来删除表中所有的记录,区别在于:truncate是DDL操作,它移动HWK,不需要 rollback segment .而Delete是DML操作, 需要rollback segment 且花费较长时间.

3使用索引的理由

解答:快速访问表中的data block

4. 给出在STAR SCHEMA中的两种表及它们分别含有的数据

解答:Fact tables 和dimension tables. fact table 包含大量的主要的信息而 dimension tables 存放对fact table 某些属性描述的信息

10. FACT Table上需要建立何种索引?

Oracle数据库碎片 篇5

下面就让我们一起来将Oracle删除干净,为重装做好准备。

1、删除服务命令

具体操作方法是:开始--运行--cmd,进入cmd命令行

然后输入: sc delete 服务名

例如: sc delete serv-u 服务器

查询服务输入命令:sc query 服务名

例如:sc query OracleServiceORCL

2、删除oracle注册表信息

cmd命令行输入:regedit

(1)选择HKEY_LOCAL_MACHINESOFTWAREORACLE,按del键删除这个入口

(2)选择HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices,滚动这个列表,删除所有Oracle入口

(3)选择HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplication,删除所有Oracle入口

(4)选择HKEY_LOCAL_MACHINESOFTWARE下,删除Oracle目录

(5)选择HKEY_LOCAL_MACHINESYSTEMControlSet001Services下,删除所有Oracle项

(6)选择HKEY_LOCAL_MACHINESYSTEMControlSet002Services下,删除所有Oracle项

(7)选择HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices下,删除所有Oracle项

(8)选择HKEY_CLASSES_ROOT下,删除所有Oracle项

3、开始->设置->控制面板->系统->高级->环境变量,删除环境变量CLASSPATH和PATH中有关Oracle的设定

4、删除C:Program Files (x86)Oracle目录

Oracle数据库碎片 篇6

很多朋友只用了oracle的删除,但很多情况下,他会发现重新安装时,点了下一步安装界面就消失了,往往无奈下只好重装系统,其实只是你数据库没删干净,删干净就不会出现这种情况了。

实现方法:

1、开始->设置->控制面板->管理工具->服务

停止所有Oracle服务。

2、开始->程序->Oracle - OraHome81->Oracle Installation Products->

Universal Installer

卸装所有Oracle产品,但Universal Installer本身不能被删除

5、运行regedit,选择HKEY_LOCAL_MACHINESOFTWAREORACLE,按del键删除这个入口。

6、运行regedit,选择HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices,滚动

这个列表,删除所有Oracle入口。

7、运行refedit,

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplication,

删除所有Oracle入口,

8、开始->设置->控制面板->系统->高级->环境变量

删除环境变量CLASSPATH和PATH中有关Oracle的设定

9、从桌面上、STARTUP(启动)组、程序菜单中,删除所有有关Oracle的组和图标

10、删除Program FilesOracle目录

11、重新启动计算机,重起后才能完全删除Oracle所在目录

12、删除与Oracle有关的文件,选择Oracle所在的缺省目录C:Oracle,删除这个入

口目录及所有子目录,并从Windows目录(一般为C:WINNT)下删除以下文

件ORACLE.INI、oradim73.INI、oradim80.INI、oraodbc.ini等等。

13、WIN.INI文件中若有[ORACLE]的标记段,删除该段

14、如有必要,删除所有Oracle相关的ODBC的DSN

15、到事件查看器中,删除Oracle相关的日志

说明:

如果有个别DLL文件无法删除的情况,则不用理会,重新启动,开始新的安装。安装时,选择一个新的目录,则,安装完毕并重新启动后,老的目录及文件就可以删除掉了

(责任编辑:铭铭 mingming_ky@126.com TEL:(010)68476636)

Oracle数据库安全策略 篇7

1 数据库安全管理

数据库的安全性是指保护数据库, 防止非法操作所造成的数据泄露、篡改或损坏。在计算机系统中, 安全性问题普遍存在, 特别是当大量用户共享数据库中的数据时, 安全问题尤其明显。保证数据库安全也成为DBA一项最重要的工作。

1.1 安全性要求

⑴数据库的完整性。预防数据库物理方面的问题, 保护数据结构;⑵元素的完整性。包含在每个元素中的数据是准确的;⑶可审计性。能够追踪到谁访问修改过的数据元素;⑷访问控制。允许用户只访问被批准的数据, 以及限制不同的用户有不同的访问模式;⑸用户认证。确保每个用户被正确地识别, 既便于审计追踪, 也为了限制对特定的数据进行访问;⑹可获性。用户一般可以访问数据库以及所有被批准访问的数据。

1.2 安全分类

数据库安全可以分为系统安全和数据安全。

系统安全包括在系统级别上, 控制数据库的存取和使用的机制。系统安全机制检查用户是否被授权连接到数据库, 数据库审计是否是活动的, 用户可以执行哪些系统操作等。

数据安全包括在方案对象级别上, 控制数据库的存取和使用的机制, 如哪个用户可以存取指定的方案对象, 在方案对象上允许每个用户采取的操作, 每个方案对象的审计操作。

2 Oracle数据库安全策略

Oralce数据库系统至少具有以下一些安全策略:⑴保证数据库的存在安全, 确保数据库系统的安全首先要确保数据库系统的存在安全;⑵保证数据库的可用性, 数据库管理系统的可用性表现在两个方面:一是需要阻止发布某些非保护数据以防止敏感数据的泄露, 二是当两个用户同时请求同一记录是进行仲裁;⑶保障数据库系统的机密性, 主要包括用户身份认证、访问控制和可审计性等;⑷保障数据库的完整性, 数据库的完整性包括物理完整性、逻辑完整性和元素完整性。

2.1 系统安全策略

⑴数据库用户管理。数据库用户是存取数据库中信息的通道, 必须对数据库用户进行严格的安全管理。既可以由安全管理员作为唯一有权限创建、修改和删除数据库用户的用户, 也可以由多个有权限的管理员来管理数据库用户。

⑵用户验证。为了防止数据库用户未经授权访问, Oracle提供主机操作系统、网络服务和数据库验证等方法对数据库用户实施验证。一般情况下, 使用一种方法验证数据库中的所有用户, 但也允许在同一数据库实例中使用多种验证方法。

⑶操作系统安全。为运行Oracle和数据库应用程序的操作系统环境考虑安全:DBA必须有创建和删除文件的操作系统权限;通常的数据库用户不应该有创建和删除文件的操作系统权限;若操作系统识别用户的数据库角色, 则安全管理员必须拥有操作系统权限, 以修改系统账户和安全域。

2.2 数据安全策略

数据安全包括在对象级控制数据库访问和使用的机制, 它决定了哪个用户访问特定方案对象, 在对象上允许每个用户的特定类型操作, 也可以定义审计每个方案对象的操作。

为数据库中数据创建的安全等级决定数据安全策略。若要允许任何用户创建任何方案对象, 或将对象的存取权限授予系统中的其他用户, 数据库将缺乏安全保障。当希望仅有DBA或安全管理员有权限创建对象, 并向角色和用户授权对象的存取权限时, 必须完全控制数据安全。

2.3 用户安全策略

用户安全策略包括一般用户、最终用户、管理员、应用程序开发人员和应用程序管理员的安全策略。

⑴一般用户安全。对于一般用户安全, 主要考虑口令安全和权限管理问题;⑵最终用户安全;⑶管理员安全。由于SYSTEM和SYS用户拥有强大的权限, 在创建数据库后, 应该立即修改SYSTEM和SYS用户的口令;⑷应用程序开发人员安全;⑸应用程序管理员安全。

2.4 数据库管理者安全性策略

⑴保护作为sys和system用户的连接;⑵保护管理者与数据库的连接;⑶使用角色对管理者权限进行管理。

2.5 应用程序开发者的安全性策略

⑴应用程序开发者和他们的权限;⑵应用程序开发者的环境。程序开发者不应与终端用户竞争数据库资源;程序开发者不能损害数据库其他应用产品;⑶应用程序开发者的空间限制。作为数据库安全性管理者, 应该特别地为每个应用程序开发者设置以下的一些限制:开发者可以创建table或index的表空间;在每一个表空间中, 开发者所拥有的空间份额。

3 结束语

Oracle安全策略有着教高的可伸缩性以及安全性, 还有着多样的可扩展性以及可用性。进行数据库系统安全管理工作, 应坚持长期性、持久性。为了组建相对安全及稳定的数据库系统, 数据库管理者要通过技术方式进行严格管理, 做好防御, 更应增加防范意识。

参考文献

[1]巢子杰.数据库优化探究[J].软件导刊, 2010, 2.[1]巢子杰.数据库优化探究[J].软件导刊, 2010, 2.

Oracle数据库碎片 篇8

关键词: 日志 内存命中率 等待事件 实例活动

中图分类号: TP39 文献标识码: A文章编号: 1007-3973 (2010) 04-061-02

随着数据库系统的普遍使用,一方面,各类型企业海量数据信息的存储变得不再困难,越来越多的企业以数据为核心开展自身业务;另一方面,随着数据库系统的长期、深入使用,数据量日积月累的海量增加,数据库逐渐成为企业系统性能性能问题的高发区。

解决数据库的性能问题,提高系统运行速度逐渐成为各DBA的主要任务之一。数据库性能问题调整工作贯穿于整个数据库生存周期,从数据库的设计,实施开始,一直到结束使用。但由于数据库性能问题的时效性、隐蔽性以及突然性等特性使问题的定位变得异常困难。本文结合了一些常见的性能分析手段,枚举了性能问题的定位方法,希望能抛砖引玉使数据库的性能问题定位更规范化、流程化。

1 日志监控

由于性能问题常常会伴随着一些系统异常,或者是一些异常发生的先兆,所以监控数据库系统日志是定位性能故障的一个基本点。

1.1 库警告日志监控

Oracle在运行过程中,会在BDUMP路径下的警告日志文件中记录数据库的一些运行情况,包括系统启动参数、日志切换情况、数据库异常等。大部分性能问题发生的同时都会伴随着一些异常信息如:死锁、回滚段溢出、临时表空间满等。

1.2监听警告日志监控

监听日志记录数据库的每个连接(无论是正常的还是非法的)的链接情况,查看该日志可以获取数据库链接情况,当出现链接相关的性能问题,如:PGA耗尽或达到UNIX最大链接数等就应该查询该文件。

2 OS系统性能监控

由于OS是数据库系统运行的基础,也是数据库系统的载体,所以数据库性能问题一般反映到OS系统上就是CPU、内存、I/O资源的消耗殆尽。所以OS层出现资源短缺的时候,亦是数据出现资源短缺的时候。

2.1 TOP命令监控内存/进程/CPU

top命令用来显示执行中的程序进程和其他状况,使用权限是所有用户;top命令提供了实时的对系统处理器的状态监视,通过该命令可以查看数据库进程对CPU、内存等资源的占用情况,并从OS进程PID查找出故障SQL。

2.2VMSTAT监控内存情况

vmstat 命令报告关于内核线程的统计信息,包括处于运行和等待队列中的、内存中的、页面调度中的、磁盘中的、中断、系统调用、上下文切换和CPU活动的内核线程。该命令可以确定系统内存的整体消耗情况。

2.3IOSTAT监控I/O情况

iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。该命令可以查看系统的整体I/O消耗状态。

3 等待事件监控

在任何一个时间点,每个Oracle进程都正在忙于服务一个请求或者等待某些事件的发生。Oracle的等待事件是衡量Oracle运行状况的重要依据及指标,分为:空闲事件――Oracle正等待某种工作,非空闲等待事件――专门针对Oracle的活动,指数据库任务或应用运行过程中发生的等待

3.1 系统等待事件

通过v$system_event视图,查询从实例启动后各个等待事件的概括。根据系统等待信息的历史影象,并通过两个snapshot获取等待项增量,可以确定这段时间内系统的总体等待信息。从数据库系统级别判断存在等待的资源瓶颈。

3.2会话等待事件

V$session_wait提供了任何情况下session在数据库中当前正在等待什么(如果session当前什么也没在做,则显示它最后的等待事件)。当系统存在性能问题时,可使用该视图进一步定位引起等待事件的会话等信息。

4 内存命中率监控

监控内存命中率,可以有效地定位由内存参数分配与实际数据库运行状态不匹配等,由数据库内存引起的性能问题故障。

4.1 字典缓存命中率

数据字典缓存区是存储在共享池中的,它缓存了最近访问的数据字典信息。在内存中缓存这些信息将大大减少了时间和解析SQL语句所必须的I/O。字典缓冲区的命中率≥95%认为是理想的。

4.2 库缓存命中率

库高速缓存区是系统全局区(SGA)中的一块区域。Oracle 对最近执行的SQL语句执行计划和解析树进行缓存,也包括了PL/SQL代码的缓存备份。库高速缓存区的命中率表明了代码重用的频繁程度。通常来说,命中率接近100%是理想值。

4.3 数据库高速缓存区命中率

数据库高速缓存区,以下称为高速缓存区,它存放着内存中最近被访问的数据块。通过查看高速缓存器的命中率,DBA可以判断出数据库高速缓存器的规模是否合理。如果命中率≥90%,可以认为参数设置是合理的,否则说明缓存中的很多数据无法满足数据库访问的需要,增加了系统I/O操作的次数。

4.4 闩命中率

获得Latch的次数与请求Latch的次数的比率。该指标的值应接近100%,如果低于99%,可以考虑采取一定的方法来降低对Latch的争用。

4.5 内存排序命中率

指排序操作在内存中进行的比率。当查询需要排序的时候,数据库会话首先选择在内存中进行排序,当内存大小不足的时候,将使用临时表空间进行磁盘排序,但磁盘排序效率和内存排序效率相差好几个数量级。该指标的值应接近100%,如果指标的值较低,则表示出现了大量排序时的磁盘I/O操作。

5 实例活动情况监控

针对性能问题期间,对实例的各个内部模块的活动和各种资源使用情况的统计,主要包括CPU使用情况,SQL*Net消息,链接的行存取和PGA使用情况等,从数据库的实际活动情况可以分析出数据库系统的负载情况,主要活动内容等。

5.1 系统活动情况

v$sysstat视图可用于监控系统资源使用情况,以及系统资源利用率的变化。正因如此多的性能数据,检查某区间内系统资源使用情况可以这样做,在一个时间段开始时创建一个视图数据快照,结束时再创建一个,二者之间各统计项值的不同 (end value - begin value) 即是这一时间段内的系统资源消耗情况。

5.2 会话活动情况

v$sesstat存储session从login到logout的详细资源使用统计。类似于v$sysstat可从该视图查询出每一会话的资源消耗情况。

6STATPACK/AWR检测

通过Statspack/AWR我们可以很容易的确定Oracle数据库的瓶颈所在,记录数据库性能状态,也可以使远程技术支持人员迅速了解你的数据库运行状况。

7 自建JOB监控实时视图

由于会话等待事件,会话活动等均为实时视图,无历史记录,而STATPACK/AWR有时不能抓取想要的信息,此时,需要建立一套临时记录表,编写存储过程,定时记录相关的实时情况,再根据空闲时段的视图对比,获取系统的瓶颈。

8 通过自建视图对比检测

由于系统等待事件视图与系统实例活动视图等系统级视图记录的都是由系统启动以来的信息,并不能体现出增量变化情况,此时可创建临时表记录系统表信息,然后在使用当前系统表信息与之对比,以获取在故障时段的增量变化,以便从变化中定位到系统瓶颈。

9 结束语

ORACLE数据库性能问题出现机率,会随着数据库系统的使用时间与使用频率会成几何倍数上升,但性能问题一般出现都会呈现明显的时段性、随机性,这使得故障重现,或者在故障发生期间及时查找出故障问题变得难上加难。

数据库的性能问题定位是一个系统工程,涉及的方面很多。如何有效地进行定位,数据库管理员需要经过反反复复的过程,且要注重各方面的努力才会取得整体效果。这些都需要在大量的实践工作中不断地积累经验,从而更好地进行数据库的调优而解决问题的关键是找到真正的性能问题。

参考文献:

[1] 杨厚云,龚汉明,武装. Oracle数据库性能优化方案[J].机械工业学院学报,2006年12月第21卷第4期.

[2] ITPUB数据库管理版http://www.itpub.net/forum-2-1.html .

[3] 盖国强,冯春培,叶梁,等Oracle 数据库性能优化[M].人民邮电出版社,2005年1月.

Oracle数据库碎片 篇9

SQL语句的执行步骤

一条SQL语句的处理过程要经过以下几个步骤。

1 语法分析 分析语句的语法是否符合规范,衡量语句中各表达式的意义。

2 语义分析 检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限。

3 视图转换 将涉及视图的查询语句转换为相应的对基表查询语句。

4 表达式转换 将复杂的SQL表达式转换为较简单的等效连接表达式。

5 选择优化器 不同的优化器一般产生不同的“执行计划”

6 选择连接方式 ORACLE有三种连接方式,对多表连接ORACLE可选择适当的连接方式。

7 选择连接顺序 对多表连接ORACLE选择哪一对表先连接,选择这两表中哪个表做为源数据表。

8 选择数据的搜索路径 根据以上条件选择合适的数据搜索路径,如是选用全表搜索还是利用索引或是其他的方式。

9 运行“执行计划”

ORACLE的优化器

ORACLE有两种优化器:基于规则的优化器(RBO, Rule Based Optimizer),和基于代价的优化器(CBO, Cost Based Optimizer)。

RBO自ORACLE 6版以来被采用,有着一套严格的使用规则,只要你按照它去写SQL语句,无论数据表中的内容怎样,也不会影响到你的“执行计划”,也就是说对数据不“敏感”,ORACLE公司已经不再发展这种技术了。

CBO自ORACLE 7版被引入,ORACLE自7版以来采用的许多新技术都是基于CBO的,如星型连接排列查询,哈希连接查询,和并行查询等。CBO计算各种可能“执行计划”的“代价”,即cost,从中选用cost最低的方案,作为实际运行方案。各“执行计划”的cost的计算根据,依赖于数据表中数据的统计分布,ORACLE数据库本身对该统计分布并不清楚,须要分析表和相关的索引,才能搜集到CBO所需的数据。

一般而言,CBO所选择的“执行计划”都不会比RBO的“执行计划”差,而且相对而言,CBO对程序员的要求没有RBO那么苛刻,节省了程序员为了从多个可能的“执行计划”中选择一个最优的方案而花费的调试时间,但在某些场合下也会存在问题。

较典型的问题有:有时,表明明建有索引,但查询过程显然没有用到相关的索引,导致查询过程耗时漫长,占用资源巨大,问题到底出在哪儿呢?按照以下顺序查找,基本上能发现原因所在。

查找原因的步骤

首先,我们要确定数据库运行在何种优化模式下,相应的参数是:optimizer_mode。可在svrmgrl中运行“show parameter optimizer_mode”来查看。ORACLE V7以来缺省的设置应是“choose”,即如果对已分析的表查询的话选择CBO,否则选择RBO,

如果该参数设为“rule”,则不论表是否分析过,一概选用RBO,除非在语句中用hint强制。

其次,检查被索引的列或组合索引的首列是否出现在PL/SQL语句的WHERE子句中,这是“执行计划”能用到相关索引的必要条件。

第三,看采用了哪种类型的连接方式。ORACLE的共有Sort Merge Join(SMJ)、Hash Join(HJ)和Nested Loop Join(NL)。在两张表连接,且内表的目标列上建有索引时,只有Nested Loop才能有效地利用到该索引。SMJ即使相关列上建有索引,最多只能因索引的存在,避免数据排序过程。HJ由于须做HASH运算,索引的存在对数据查询速度几乎没有影响。

第四,看连接顺序是否允许使用相关索引。假设表emp的deptno列上有索引,表dept的列deptno上无索引,WHERE语句有 emp.deptno=dept.deptno条件。在做NL连接时,emp做为外表,先被访问,由于连接机制原因,外表的数据访问方式是全表扫描,emp.deptno上的索引显然是用不上,最多在其上做索引全扫描或索引快速全扫描。

第五,是否用到系统数据字典表或视图。由于系统数据字典表都未被分析过,可能导致极差的“执行计划”。但是不要擅自对数据字典表做分析,否则可能导致死锁,或系统性能下降。

第六,索引列是否函数的参数。如是,索引在查询时用不上。

第七,是否存在潜在的数据类型转换。如将字符型数据与数值型数据比较,ORACLE会自动将字符型用to_number()函数进行转换,从而导致第六种现象的发生。

第八,是否为表和相关的索引搜集足够的统计数据。对数据经常有增、删、改的表最好定期对表和索引进行分析,可用SQL语句“analyze table xxxx compute statistics for all indexes;"。ORACLE掌握了充分反映实际的统计数据,才有可能做出正确的选择。

第九,索引列的选择性不高。

我们假设典型情况,有表emp,共有一百万行数据,但其中的emp.deptno列,数据只有4种不同的值,如10、20、30、40。虽然emp 数据行有很多,ORACLE缺省认定表中列的值是在所有数据行均匀分布的,也就是说每种deptno值各有25万数据行与之对应。假设SQL搜索条件 DEPTNO=10,利用deptno列上的索引进行数据搜索效率,往往不比全表扫描的高,ORACLE理所当然对索引“视而不见”,认为该索引的选择性不高。

但我们考虑另一种情况,如果一百万数据行实际不是在4种deptno值间平均分配,其中有99万行对应着值10,5000行对应值20,3000行对应值30,行对应值40。在这种数据分布图案中对除值为10外的其它deptno值搜索时,毫无疑问,如果索引能被应用,那么效率会高出很多。我们可以采用对该索引列进行单独分析,或用analyze语句对该列建立直方图,对该列搜集足够的统计数据,使ORACLE在搜索选择性较高的值能用上索引。

第十,索引列值是否可为空(NULL)。如果索引列值可以是空值,在SQL语句中那些需要返回NULL值的操作,将不会用到索引,如COUNT(*),而是用全表扫描。这是因为索引中存储值不能为全空。---www.bianceng.cn

第十一,看是否有用到并行查询(PQO)。并行查询将不会用到索引。

Oracle数据库碎片 篇10

前言

这篇文章介绍了DBA每天在监控Oracle数据库方面的职责,讲述了如何通过shell脚本来完成这些重复的监控工作。本文首先回顾了一些DBA常用的Unix命令,以及解释了如何通过Unix Cron来定时执行DBA脚本。同时文章还介绍了8个重要的脚本来监控Oracle数据库:

检查实例的可用性

检查 的可用性

检查alert日志文件中的错误信息

在存放log文件的地方满以前清空旧的log文件

分析table和index以获得更好的性能

检查表空间的使用情况

找出无效的对象

监控用户和事务

DBA需要的Unix基本知识

基本的UNIX命令

以下是一些常用的Unix命令:

ps--显示进程 grep--搜索文件中的某种文本模式 mailx--读取或者发送mail cat--连接文件或者显示它们 cut--选择显示的列 awk--模式匹配语言 df--显示剩余的磁盘空间

以下是DBA如何使用这些命令的一些例子:

显示服务器上的可用实例:

$ ps -ef | grep smon

oracle 21832 1 0 Feb 24 ? 19:05 ora_smon_oradb1

oracle 898 1 0 Feb 15 ? 0:00 ora_smon_oradb2

dliu 25199 19038 0 10:48:57 pts/6 0:00 grep smon

oracle 27798 1 0 05:43:54 ? 0:00 ora_smon_oradb3

oracle 28781 1 0 Mar 03 ? 0:01 ora_smon_oradb4、显示服务器上的可用 :

$ ps -ef | grep listener | grep -v grep

(译者注:grep命令应该加上-i参数,即grep -i listener,

该参数的作用是忽略大小写,因为有些时候listener是大写的,这时就会看不到结果)

oracle 23879 1 0 Feb 24 ? 33:36 /8.1.7/bin/tnslsnr listener_db1 -inherit

oracle 27939 1 0 05:44:02 ? 0:00 /8.1.7/bin/tnslsnr listener_db2 -inherit

oracle 23536 1 0 Feb 12 ? 4:19 /8.1.7/bin/tnslsnr listener_db3 -inherit

oracle 28891 1 0 Mar 03 ? 0:01 /8.1.7/bin/tnslsnr listener_db4 -inherit

查看Oracle存档目录的文件系统使用情况

$ df -k | grep oraarch

/dev/vx/dsk/proddg/oraarch 71123968 4754872 65850768 7% /u09/oraarch

统计alter.log文件中的行数:

$ cat alert.log | wc -l

2984

列出alert.log文件中的全部Oracle错误信息:

$ grep ORA- alert.log

ORA-00600: internal error code, arguments: [kcrrrfswda.1], [], [], [], [], []

ORA-00600: internal error code, arguments: [1881], [25860496], [25857716], []

CRONTAB基本

一个crontab文件中包含有六个字段:

分钟 0-59

小时 0-23

月中的第几天 1-31

月份 1 - 12

星期几 0 - 6, with 0 = Sunday

Unix命令或者Shell脚本

要编辑一个crontab文件,输入:Crontab -e

要查看一个crontab文件,输入:

Crontab -l

0 4 * * 5 /dba/admin/analyze_table.ksh

30 3 * * 3,6 /dba/admin/hotbackup.ksh /dev/null 2>&1

在上面的例子中,第一行显示了一个分析表的脚本在每个星期5的4:00am运行。第二行显示了一个执行热备份的脚本在每个周三和周六的3:00a.m.运行。

监控数据库的常用Shell脚本

以下提供的8个shell脚本覆盖了DBA每日监控工作的90%,你可能还需要修改UNIX的环境变量。

检查Oracle实例的可用性

oratab文件中列出了服务器上的所有数据库

$ cat /var/opt/oracle/oratab

############################################################

## /var/opt/oracle/oratab##

############################################################

oradb1:/u01/app/oracle/product/8.1.7:Y

oradb2:/u01/app/oracle/product/8.1.7:Y

oradb3:/u01/app/oracle/product/8.1.7:N

oradb4:/u01/app/oracle/product/8.1.7:Y以下的脚本检查oratab文件中列出的所有数据库,并且找出该数据库的状态(启动还是关闭)

##############################################################

## ckinstance.ksh ## ###################################################################

RATAB=/var/opt/oracle/oratab

echo `date`

echo Oracle Database(s) Status `hostname` :

db=`egrep -i :Y|:N $ORATAB | cut -d: -f1 | grep -v # | grep -v *`

pslist=`ps -ef | grep pmon`

for i in $db ; do

echo $pslist | grep ora_pmon_$i >/dev/null 2>$1

if (( $? )); then

echo Oracle Instance - $i: Down

else

echo Oracle Instance - $i: Up

fi

done

使用以下的命令来确认该脚本是可以执行的:

$ chmod 744 ckinstance.ksh

$ ls -l ckinstance.ksh

-rwxr--r-- 1 oracle dba 657 Mar 5 22:59 ckinstance.ksh*

以下是实例可用性的报表:

$ ckinstance.ksh

Mon Mar 4 10:44:12 PST

Oracle Database(s) Status for DBHOST server:

Oracle Instance - oradb1: Up

Oracle Instance - oradb2: Up

Oracle Instance - oradb3: Down

Oracle Instance - oradb4: Up

检查Oracle 的可用性

以下有一个类似的脚本检查Oracle 。如果 停了,该脚本将会重新启动 :

#######################################################################

## cklsnr.sh ##

#######################################################################

#!/bin/ksh

DBALIST=primary.dba@company.com,another.dba@company.com;export DBALIST

cd /var/opt/oracle

rm -f lsnr.exist

ps -ef | grep mylsnr | grep -v grep >lsnr.exist

if [ -s lsnr.exist ]

then

echo

else

echo Alert | mailx -s Listener ‘mylsnr‘ on `hostname` is down $DBALIST

TNS_ADMIN=/var/opt/oracle; export TNS_ADMIN

ORACLE_SID=db1; export ORACLE_SID

ORAENV_ASK=NO; export ORAENV_ASK

PATH=$PATH:/bin:/usr/local/bin; export PATH

. oraenv

LD_LIBRARY_PATH=${ORACLE_HOME}/lib;export LD_LIBRARY_PATH

lsnrctl start mylsnr

fi

检查Alert日志(ORA-XXXXX)

每个脚本所使用的一些环境变量可以放到一个profile中:

#######################################################################

## oracle.profile ##

#######################################################################

EDITOR=vi;export EDITOR ORACLE_BASE=/u01/app/oracle; export

ORACLE_BASE ORACLE_HOME=$ORACLE_BASE/product/8.1.7; export

ORACLE_HOME LD_LIBRARY_PATH=$ORACLE_HOME/lib; export

LD_LIBRARY_PATH TNS_ADMIN=/var/opt/oracle;export

TNS_ADMIN NLS_LANG=american; export

NLS_LANG NLS_DATE_FORMAT=‘Mon DD YYYY HH24:MI:SS‘; export

NLS_DATE_FORMAT RATAB=/var/opt/oracle/oratab;export

ORATAB PATH=$PATH:$ORACLE_HOME:$ORACLE_HOME/bin:/usr/clearcase/“ target=”_blank“ >ccs/bin:/bin:/usr/bin:/usr/sbin:/

sbin:/usr/openwin/bin:/opt/bin:.; export

PATH DBALIST=primary.dba@company.com,another.dba@company.com;export

DBALIST以下的脚本首先调用oracle.profile来设置全部的环境变量。如果发现任何的Oracle错误,该脚本还会给DBA发送一个警告的email。

####################################################################

## ckalertlog.sh ##

####################################################################

#!/bin/ksh

.. /etc/oracle.profile

for SID in `cat $ORACLE_HOME/sidlist`

do

cd $ORACLE_BASE/admin/$SID/bdump

if [ -f alert_${SID}.log ]

then

mv alert_${SID}.log alert_work.log

touch alert_${SID}.log

cat alert_work.log >>alert_${SID}.hist

grep ORA- alert_work.log >alert.err

fi

if [ `cat alert.err|wc -l` -gt 0 ]

then

mailx -s ${SID} ORACLE ALERT ERRORS $DBALIST< alert.err

fi

rm -f alert.err

rm -f alert_work.log

done

清除旧的归档文件

以下的脚本将会在log文件达到90%容量的时候清空旧的归档文件:

$ df -k | grep arch

Filesystem kbytes used avail capacity Mounted on

/dev/vx/dsk/proddg/archive 71123968 30210248 40594232 43% /u08/archive

#######################################################################

## clean_arch.ksh ##

#######################################################################

#!/bin/ksh

df -k | grep arch >dfk.result

archive_filesystem=`awk -F ‘{ print $6 }‘ dfk.result`

archive_capacity=`awk -F ‘{ print $5 }‘ dfk.result`

if [[ $archive_capacity >90% ]]

then

echo Filesystem ${archive_filesystem} is ${archive_capacity} filled

# try one of the following option depend on your need

find $archive_filesystem -type f -mtime +2 -exec rm -r {} ;

tar

rman

fi

分析表和索引(以得到更好的性能)

以下我将展示如果传送参数到一个脚本中:

####################################################################

## analyze_table.sh ##

####################################################################

#!/bin/ksh

# input parameter: 1: password # 2: SID

if (($#<1)) then echo ”Please enter oracle user password as the first parameter !“ exit 0

fi

if (($#<2)) then echo ”Please enter instance name as the second parameter!“ exit 0

fi

要传入参数以执行该脚本,输入:

$ analyze_table.sh manager oradb1

脚本的第一部分产生了一个analyze.sql文件,里面包含了分析表用的语句,

脚本的第二部分分析全部的表:

#####################################################################

## analyze_table.sh ##

#####################################################################

sqlplus -s<

oracle/$1@$2

set heading off

set feed off

set pagesize 200

set linesize 100

spool analyze_table.sql

select ANALYZE TABLE || owner || . || segment_name ||

ESTIMATE STATISTICS SAMPLE 10 PERCENT;

from dba_segments

where segment_type = TABLE

and owner not in (SYS, SYSTEM);

spool off

exit

!

sqlplus -s<

oracle/$1@$2

@./analyze_table.sql

exit

!

以下是analyze.sql的一个例子:

$ cat analyze.sql

ANALYZE TABLE HIRWIN.JANUSAGE_SUMMARY ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE HIRWIN.JANUSER_PROFILE ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE APPSSYS.HIST_SYSTEM_ACTIVITY ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE HTOMEH.QUEST_IM_VERSION ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE JSTENZEL.HIST_SYS_ACT_0615 ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE JSTENZEL.HISTORY_SYSTEM_0614 ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE JSTENZEL.CALC_SUMMARY3 ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE IMON.QUEST_IM_LOCK_TREE ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE APPSSYS.HIST_USAGE_SUMMARY ESTIMATE STATISTICS SAMPLE 10 PERCENT;

ANALYZE TABLE PATROL.P$LOCKCONFLICTTX ESTIMATE STATISTICS SAMPLE 10 PERCENT;

检查表空间的使用

以下的脚本检测表空间的使用。如果表空间只剩下10%,它将会发送一个警告email。

#####################################################################

## ck_tbsp.sh ##

#####################################################################

#!/bin/ksh

sqlplus -s<

oracle/$1@$2

set feed off

set linesize 100

set pagesize 200

spool tablespace.alert

SELECT F.TABLESPACE_NAME,

TO_CHAR ((T.TOTAL_SPACE - F.FREE_SPACE),999,999) ”USED (MB)“,

TO_CHAR (F.FREE_SPACE, 999,999) ”FREE (MB)“,

TO_CHAR (T.TOTAL_SPACE, 999,999) ”TOTAL (MB)“,

TO_CHAR ((ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100)),999)|| % PER_FREE

FROM (

SELECT TABLESPACE_NAME,

ROUND (SUM (BLOCKS*(SELECT VALUE/1024

FROM V$PARAMETER

WHERE NAME = db_block_size)/1024)

) FREE_SPACE

FROM DBA_FREE_SPACE

GROUP BY TABLESPACE_NAME

) F,

(

SELECT TABLESPACE_NAME,

ROUND (SUM (BYTES/1048576)) TOTAL_SPACE

FROM DBA_DATA_FILES

GROUP BY TABLESPACE_NAME

) T

WHERE F.TABLESPACE_NAME = T.TABLESPACE_NAME

AND (ROUND ((F.FREE_SPACE/T.TOTAL_SPACE)*100))< 10;

spool off

exit

!

if [ `cat tablespace.alert|wc -l` -gt 0 ]

then

cat tablespace.alert -l tablespace.alert >tablespace.tmp

mailx -s ”TABLESPACE ALERT for ${2}“ $DBALIST< tablespace.tmp

fi

警告email输出的例子如下:

TABLESPACE_NAME USED (MB) FREE (MB) TOTAL (MB) PER_FREE

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

SYSTEM 2,047 203 2,250 9 %

STBS01 302 25 327 8 %

STBS02 241 11 252 4 %

STBS03 233 19 252 8 %

查找出无效的数据库对象

以下查找出无效的数据库对象:

#####################################################################

## invalid_object_alert.sh ##

#####################################################################

#!/bin/ksh . /etc/oracle.profile

sqlplus -s<

oracle/$1@$2

set feed off

set heading off column object_name format a30

spool invalid_object.alert

SELECT OWNER, OBJECT_NAME, OBJECT_TYPE,

STATUS FROM DBA_OBJECTS WHERE STATUS =

INVALID ORDER BY OWNER, OBJECT_TYPE, OBJECT_NAME;

spool off

exit ! if [ `cat invalid_object.alert|wc -l` -gt 0 ] then

mailx -s ”INVALID OBJECTS for ${2}“ $DBALIST< invalid_object.alert

fi$ cat invalid_object.alert

OWNER OBJECT_NAME OBJECT_TYPE STATUS

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

HTOMEH DBMS_SHARED_POOL PACKAGE BODY INVALID

HTOMEH X_$KCBFWAIT VIEW INVALID

IMON IW_MON PACKAGE INVALID

IMON IW_MON PACKAGE BODY INVALID

IMON IW_ARCHIVED_LOG VIEW INVALID

IMON IW_FILESTAT VIEW INVALID

IMON IW_SQL_FULL_TEXT VIEW INVALID

IMON IW_SYSTEM_EVENT1 VIEW INVALID

IMON IW_SYSTEM_EVENT_CAT VIEW INVALIDLBAILEY CHECK_TABLESPACE_USAGE PROCEDURE INVALID

PATROL P$AUTO_EXTEND_TBSP VIEW INVALID

SYS DBMS_CRYPTO_TOOLKIT PACKAGE INVALID

SYS DBMS_CRYPTO_TOOLKIT PACKAGE BODY INVALID

SYS UPGRADE_SYSTEM_TYPES_TO_816 PROCEDURE INVALID

SYS AQ$_DEQUEUE_HISTORY_T TYPE INVALID

SYS HS_CLASS_CAPS VIEW INVALID SYS HS_CLASS_DD VIEW INVALID

监视用户和事务(死锁等)

以下的脚本在死锁发生的时候发送一个警告e-mail:

###################################################################

## deadlock_alert.sh ##

##################################################################

##!/bin/ksh

.. /etc/oracle.profile

sqlplus -s<

oracle/$1@$2

set feed off

set heading off

spool deadlock.alert

SELECT SID, DECODE(BLOCK, 0, NO, YES ) BLOCKER,

DECODE(REQUEST, 0, NO,YES ) WAITER

FROM V$LOCK

WHERE REQUEST >0 OR BLOCK >0

ORDER BY block DESC;

spool off

exit

!

if [ `cat deadlock.alert|wc -l` -gt 0 ]

then

mailx -s ”DEADLOCK ALERT for ${2}“ $DBALIST< deadlock.alert

fi

结论

0,20,40 7-17 * * 1-5 /dba/scripts/ckinstance.sh >/dev/null 2>&1

0,20,40 7-17 * * 1-5 /dba/scripts/cklsnr.sh >/dev/null 2>&1

0,20,40 7-17 * * 1-5 /dba/scripts/ckalertlog.sh >/dev/null 2>&1

30 * * * 0-6 /dba/scripts/clean_arch.sh >/dev/null 2>&1

* 5 * * 1,3 /dba/scripts/analyze_table.sh >/dev/null 2>&1

* 5 * * 0-6 /dba/scripts/ck_tbsp.sh >/dev/null 2>&1

* 5 * * 0-6 /dba/scripts/invalid_object_alert.sh >/dev/null 2>&1

0,20,40 7-17 * * 1-5 /dba/scripts/deadlock_alert.sh >/dev/null 2>&1

通过以上的脚本,可大大减轻你的工作。你可以使用这些是来做更重要的工作,例如性能调整。(责任编辑:铭铭)

上一篇:那一次我战胜了困难作文600字下一篇:描写军训心得体会