Oracle原理学习笔记_第1页
Oracle原理学习笔记_第2页
Oracle原理学习笔记_第3页
Oracle原理学习笔记_第4页
Oracle原理学习笔记_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Oracle原理学习笔记

实例

Oracle运行的时候,在内存中会要开发一个区间,这个区间要紧是用于从磁盘(数据文

件)中读出数据后的一个在内存的缓存与处理。而处理这些数据的操作,需要有一些系统的

后台进程,这些进行在Oracle数据库启动的时候,就开始运行,一直在响应前台的操作。实

际上,这一个区间(SGA)与这些后台进程合在一起,就称之实例。实例是包含SGA区与后

台进程两个部分的。

数据库启动执行若干动作,经历三个阶段,分别是未加载、加载与打开。

1、未加载(nomount)能够把数据库启动的这一阶段看作是Oracle实例的启动。

这种方式启动下可执行:重建操纵文件、重建数据库。这一启动命令:

・读取数据库参数文件。

•启动所需的后台进程并按参数文件中的定义分配内存。

♦将进展情况写入告警日志文件中。

2、加载(mount)在实例启动加载阶段,数据库参数文件中指定的操纵文件被读

取。记住操纵文件将数据库各部分联系在一起。实例从操纵文件中找到下列信息,然

后将进展写入告警日志文件。这种方式启动下可执行:数据库日志归档、数据库恢复、

重新命名一些数据库文件:

•所有数据文件与重做日志文件的名称与位置。

­数据库名。

•最新系统更换号(SCN)。

3、打开(open)包含在数据库中的每个联机数据文件在数据库打开前务必被同

步。在数据库打开阶段:

•所有联机数据文件的头与操纵文件信息相比较。

•所有文件同步后,数据库打开。

当数据库关闭时,取决于它的关闭方式执行不一致的任务:

•正常(normal)在所有的用户离线后发生的正常关闭。

•事务(transactional)事务关闭就是当所有的用户执行完当前的事务后,将用

户从数据库上清除。

•立即(immediate)立即关闭就是从数据库清除所有当前用户之后,回退所有未

完成的操作。

•特殊(abort)特殊关闭没有给数据库任何整理的机会。这种方式关闭后需要实

行崩溃恢复。

实例是数据管理的核心一它做所有的工作,而数据库存储所有的数据。

其他启动方式:

•startuprestrict

约束方式启动

这种方式能够启动数据库,但只同意具有一定特权的用户访问

非特权用户访问时,会出现下列提示:

ERROR:0RA-01035:ORACLE只同意具有RESTRICTEDSESSION权限的用户使用

,startupforce

强制启动方式

当不能关闭数据库时,能够用startupforce来完成数据库的关闭

先关闭数据库,再执行正常启动数据库命令

,startuppfile=参数文件名

带初始化参数文件的启动方式

先读取参数文件,再按参数文件中的设置启动数据库

•startupEXCLUSIVE

一个Delete操作的流程:

1、检查语法、语义(V$ROWCACHE:datadictionarycache),计算HASHVALUE,

在session的UGA中进行匹配(session_cached_cursors),假如UGA中没有,

在librarychache中匹配(librarychachelocklatch保护library

chachelock对地址堆的访问,而后librarychachepinlatch保护

librarycachepin对librarycache中sql有关信息的访问)

2、根据执行计划读取数据:cachebufferchainlatch保护能定位到buffer

header并pin住该块(假如没有bufferheader,就pin住某个空块(没

有空块就产生freebufferwaits),并到数据文件中读取)。假如如今有

某个进程想访问该块,将产生bufferbusywaits。

3、在redologbuffer中记录delete操作的细节。(包含回滚段前后镜像、数

据块前后镜像)。

4、在相应回滚段段头的事务表中创建一个undo条目,把将要删除的记录创建

前镜像,存放到UndoBlock中。

5、在BufferCache中的相应数据块上删除记录,同时标记相应的数据块为

Dirty。

提交(COMMIT)

1.Oracle产生一个SCN

2.在回滚段事务表中标记该事务状态为commited

3.LGWRFlushLogBuffer到日志文件

3.假如如今数据块仍然在BufferCache中,那么SCN将被记录到BlockHeader_b,

这被称之快速提交(fastcommit)

4.假如dirtyblock已经被写回到磁盘,那么下一个访问这个block的进程将会自

回滚段中获取该事务的状态,确认该事务被提交。然后这个进程获得提交SCN并写

回到BlockHeader上。这被称之延迟块清除(delayedblockcleanout)„

内存

SGA(系统全局区、共享全局区)、PGA(进程全局区、私有全局区)

内存分配原则:

10%冗余内存,OSSYS进程(约1.6G),OSBUFFER(约0.8G),数据库连接消耗内存(每

个连接约5'8M),PGA(每个连接约2M,V$PGA_TARGET_ADVTCE),SGA

SGA

v$sgastat

DatabaseBuffers

注意shov

Oracle的

•软件

•系统

•进程

•排序

SGA中的Thefixedarea包含了数千个原子变量,与如指向SGA中其它区域的pointers(指

针)等小的数据结构.通过对fixedtable内表XSKSMFSV查询(如下)能够获得这些变量的名字,

变量类型,大小与在内存中的地址.

thevariablearea是由largepool与sharedpool构成

Sharedpool中永久性的内存包含各类数据结构如:thebufferheaders,processes,sessions,

transactionarrays,theenqueueresources,locks,theonlinerollbacksegmentarrays,variousarrays

forrecordingstatistics.其中大部分的SIZE是依靠初始参数的设置来确定的.这些初始参数只能

在实例被关闭的状态下才能够进行修改.因此这里说的永久性是针对实例打开状态下的生存

期而言.

Thevariablearea的在SGA中的SIZES就等于

LARGE_POOL_SIZE,SHARED_POOL_SIZE与永久性的内存arrays的SIZE三者相加.

永久性内存arrays的SIZE=thevariablearea

(LARGE_POOL_SIZE+SHARED_POOL_SIZE).

数据缓冲区命中率

v$sysstat

这里命中率的计算应该是

令x二physicalreadsdirect+physicalreadsdirect(lob)

命中率=100-(physicalreads-x)/(consistentgets+dbblockgets-x)*100

通常假如发现命中率低于90%,则应该调整应用可能够考虑是否增大数据缓冲区

共享池的命中率

SQL>selectsum(pinhits-reloads)/sum(pins)*100"hitradio"fromv$librarycache;

hitradio

99.809291

假如共享池的命中率低于95%,就要考虑调整应用(通常是没使用bindvar)或者者增

加内存

关于排序部分

SQL>selectname,valuefromv$sysstatwherenamelike'/sort%';

NAMEVALUE

sorts(memory)67935

sorts(disk)1

sorts(rows)7070

假如我们发现sorts(disk)/(sorts(memory)+sorts(disk))的比例过高,则通常意

味着sort_area_size部分内存较小,可考虑调整相应的参数。

关于log_buffer

SQL>selectname,valuefromv$sysstat

2wherenamein(,redoentries'redobufferallocationretries');

NAMEVALUE

redoentries2325719

redobufferallocationretries10

假如redobufferallocationretries/redoentries的比例超过1%我们就能够考虑

增大log_buffer

共享池(SHARED_POOL_SIZE)

v$shared_pool_advice

ALTERSYSTEMFLUSHSHARED_POOL

HowtoKeepObjects--重点

使用DBMS_SHARED_POOL.KEEP过程来keepobjects,UNKEEP过程从sharedpool中移走

pinnedobjects

executedbms_shared_pool.keep(,address,hash_value,);--keep该匿名块

共享池包含摩高速缓存(libraryca")、数据字典高速缓存与服务器操纵结构(及如

数据库字符集)。Oracle服务器用库高速缓存来提高执行SQL语句的性能;库高速缓存包含

共享与专用SQL区。共享SQL区包含SQL语句语法分析树与执行路径,而专用SQL区存储特

定的会话信息,比如捆绑变量、环境与会话参数、运行堆栈与缓冲区等。

Softparse使用的资源包含CPU与librarycachelatchgets

Hardparse是指要解析的SQL没有在libraecache中,或者者执行的时候发现解析过

的SQL已经agedout,就是离开了librarycache,称之Librarycachemisses.使用的资

源包含额外的CPU,librarycachelatchgets,与sharedpoollatchgets.

专用SQL区在每个事务初始化时创建,在与专用SQL区有关的游标关闭时被释放。一个

用户会话能够一次打开的专用SQL区的数量由init.ora参数OPEN_CURSORS决定。使用这两

个结构,Oracle服务器能够重用一条SQL语句的所有执行的共同信息。与此同时,能够从专

用SQL区中查询执行的特定会话信息。

注意游标使用过程中并不关闭游标的应用会继续为应用分配越来越多的内存,部分原因

是为每个打开的游标分配了专用SQL区。

库高速缓存中的专用SQL区可更进一步分为永久区与运行区。

共享池的大小取决于init.ora文件参数SHARED_POOL_SIZE,它是以字节为单位的。你

务必将这个值设得足够大,以确保有足够的可用空间来装载与存储PL/SQL块与SQL语句。共

享区通过长期装卸与卸载数据对象会产生许多碎片,假如在共享池中没有足够的连续空间用

来装载目标数据,会产生错误。解决这个问题的捷径是运行SQL命令ALTERSYSTEMFLUSH

SHARED_P00Lo但是假如在数据库操作时,经常遇到共享池错误,你务必增大共享池

Librarycache包含sharedSQLandPL/SQLareas(PL/SQL包含Procedures,

Functions,Packages,Trigger,匿名PL/SQL块)

SizingtheLibraryCache

定义storedobject(packages,views等等)的内存需求;定义经常使用的sqlstatement

的所需内存

1.初始时将SHARED_POOL_SIZE设得很大,运行应用程序

2.计算storedobject所占的内存

SELECTSUM(sharable_mem)FROMv$db_object_cacheWHEREtype=

'PACKAGE'ortype='PACKAGEBODY,ortype='FUNCTION'ortype='PROCEDURE';

3.应用程序运行一段时间后,估计常用sql语句所占的内存(不包含动态SQL)

SELECTSUM(sharable_mem)FROMv$sqlareaWHEREexecutions>5;

4.对每个user每个打开的cursor,需要250bytes,可在运行高峰期间使用查询:

SELECTSUM(250*users_opening)FROMv$sqlarea;

5.在测试环境中,可让一个用户打开一定数量的cursor,运行下列语句测试共享内存,

然后乘上user数

SELECT250*valuebytesjper_userFROMv$sesstats,v$statname

nWHEREs.statistic#=n.statistic#ANDn.name='openedcursorscurrent,AND

s.sid=15;

以上内存的与,再加上一点内存(留给动态SQL使用),作为你的应用的理想内存设置;预

留一部分空间作为大的内存需要,避免miss与碎片;一些大的内存需要:PL/SQL块的编

译,trigger的编译;小的object不可能使预留空间碎片化,反而保证reservedlist有大的

连续块,一旦从reservedlist中分配的内存释放它就返回reservedlist。

影响的参数:SHARED_POOL_RESERVED_SIZE初始值二SHARED_POOL_SIZE*1O%,超过

50%,oracleserver报错

OPEN_CURSORS缺省二50

定义了涉及分配给用户进程的私有SQL区域的cursors数量,一个privateSQLarea

一直存在直至cursor关闭;为了利用更多的内存给共享SQL区域,需要提高session每个

session同意多cursor数量,开发人员应关闭不需要的cursor节约内存

CURSOR_SPACE_FOR_TIME缺省二FALSE布尔值

设置TRUE,表示以空间换取时间,共享SQL区不可能被agedout直至有关的cursor被关

闭,因此确信有足够的内存,没有cachemiss;除非RELOADSinV$LIBRARYCACHE一直为0,否

则不要改变此参数值

若应用为FORM或者使用动态SQL,设此值为FALSE-由于动态sql总是不一致,将占用

过多内存

SESSION_CACHED_CURSORS缺省=0表示没有cache

当一个session打算关闭一个cursor时,假如这个cursor的parsecount超过3次,那

么这个cursor将会被加到sessioncursorcachelist的MRU端.当一个session打算parse

一个sql时,它会先去session的pga内搜索sessioncursorcachelist,假如找到那么会

把这个cursor脱离list,然后当关闭的时候再把这个cursor加到MRU端.

session_cached_cursor提供了快速软分析的功能,提供了比softparse更高的性能.

检查系统是否需要此参数的方法:

对某个典型用户session

selecta.sid,b.name,a.valuefromv$sesstata,v$statnamebwhere

a.statistic#=b.statistic#and(b.name=,sessioncursorcachehits,orb.namelike

'parsecount%^);

Iffewparsesresultinhits,则可提高此参数,注意它将increaseoveralldemands

onmemory.-????

DataDictionaryCache

Selecttype,parameter,gets,getmisses,

round(getmisses/decode(gets,0,null,gets)*100,2)“ratio(%)“fromv$rowcache;

GoalforaGoodRatio

SUM(GETMISSES)/SUM(GETS)<15%,否则应增大SHARED_POOL_SIZE

不可能希望getmisses趋近于0,由于数据库启动后需要读取objects定义

OEM->PerformanceManager—>Memory—>DataDictionaryCacheHit%

检索需要在共享池中要求大于100K连续空间的对象:

select*fromv$db_object_cachewheresharable_mem>100000andtypein

('PACKAGE','PACKAGEBODY','PROCEDURE','FUNCTION');

考察返回的结果,确认是否需要pin到共享池中,返回结果中的KEPT字段假如是YES,

那么表示该对象已经固定在了共享池中,为N0,则表示还没有固定。

假如需要固定,使用下面的语句:

execdbmssharedpool,keepCSYS.STANDARD');

数据库默认安装的时候没有创建dbms_shared_pool包,因此需要先创建该包。

cd$ORACLE_HOME/rdbms/admin

sqlplus"/assysdba”

©dbmspool.sql

DATABUFFER——数据库缓冲区高速缓存

v$db_cache_advice

==一堆数据块(DB_BLOCK_SIZE*DB_BLOCK_BUFFERS)

数据库的任何修改都在该缓冲里完成(LRU—>LRUW)»

所有的块,被读到内存中后,它的块头(datablockheader)放在一•个Cachebufferchain

中,Cachebufferchain由多个双向hash链表构成,hash链表数量由

_db_block_hash_buckets决定.每个数据块头由DBA(datablockaddress)作为key,经hash

函数后放在链表上,它与blockbuffer中的block对应,数据块头不包含实际的数据,仅

是一个简单的描述.后台进程扫描hash链表前,务必获得cachebufferchainlatch,假如

在CacheBufferchain中找不某块,就由磁盘读入.若需要查找某个block,则根据block

的信息能计算hashvalue然后迅速定位到hashtable,然后根据hashtable信息去查看

是否存在所想要的buffer,若有则命中,若没有则不命中。显然不可能根据list去逐个搜

索,这样效率太低.

LRU就是一种尽可能将常用的数据保留在内存的算法.当数据库需要一个数据缓冲区,

他会从数据库缓冲区的LRU队列的尾部找一个空闲的缓冲,将一个数据块读入,然后数据

库会把这个缓冲区放到LRU队列的中部,假如该缓冲被其他程序用到的话,那么他会往队

列的头上移动,假如这个缓冲没有被其他程序用到,同时没有被修改过,那么他会慢慢的移

动到LRU队列的尾部,最终被认为是空缓冲区被其他数据块所覆盖.一旦这个缓冲区被修改

过DBWR把他从LRU队列中移出,放到LRL'W队列(也叫赃缓冲区)中,等待DBWR把他们批

量写入数据文件,然后再把他们的缓冲区连接到LRU队列的尾部.周而复始的工作.

假如查找在一个阀值内没有结果或者者造成dirty缓冲区已经溢出,在进一步查找free

buffer前系统将发出一个消息给DBWR让他能够将LRUW队列的缓冲区写入磁盘.这个阀值被

叫做这个阀值被叫做DBWRscandepthdirty缓冲区大小能够用_DB_LARGE_DIRTY_QUEUE与

2*J)B_BL0CK』RITE_BATCH来确定.前台进程继续搜索freebuffer.直到

DBBLOCKMAXSCANCNT还没有发现系统就会挂起该进程.记录dirtybuffersinspected

的静态变量并把该进程标志为freebufferwait.

cache与buffer_pool_keep是不一•样的,cache是假如对该表全表扫描的话,会把块

放在mru端,buffer_pool_keep是放在keep池中

selecttable_name,cache,buffer_poolfromdba_tableswheretable_name=,TEST);

将表与索引Cache到SGA中

从0RACLE805之后,支持ALTERTABLEtable_nameSTORAGE(BUFFER_POOLKEEP)命令了。

但是在805与8i中,需要设置buffer_pool_keep参数来设置KEEP池大小。这块内存来自数

据缓存区,也就是从db_block_buffers中分配。在0RACLE8与8i中,还务必设置

db_block」ru_latches参数。该参数应该比2*3*CPU数量少,但是要大于1,否则无法设置

buffer_pool_keepo在0RACLE9i中则需要设置DB_KEEP_CACHE_SIZE来设置KEEP池内存的

大小。这样将表KEEP才有用。而且KEEP池要能够容纳得下才行的

将函数Cache到SGA中

@$ORACLE_HOME\rdbms\admin\dbmspoo1.sql;

execdbms_shared_poo1.keepCprocedure_name",'P");

重做日志缓冲区(LOG_BUFFER)

logbuffer分成内部的bufferblocks,而这些block各有8个字节的头部信息存在于

variablearea中.

当重做日志缓冲区填满时,将它的内容写入联机重做日志文件。是循环使用。是数据库

最活跃的情形,能够用V$SYSSTAT视图进行监控。查询V$SYSSTAT视图value域,它说明用

户进程等待重做日志缓冲区所花费的时间(此处value的值应接近于0,否则应增大初始化

参数文件的Log_buffers的值):

SELECTNAME,VALUEFROMV$SYSSTATWHERENAME='redologspacerequests);

PGA

v$pgastatv$pgatargetadvice

后台进程

v$bgprocess

■数据库写进程(DBWR)

(DBBLOCKWRITEBATCH,DBBLOCKMAXSCAN,DBWRITES,DBBLOCKLRULATCHES,DBBL

OCK_C1IECKPOINT_BATCH,DB_BLOCK_CHECKSUM)

负责数据文件的读写与db_data_buffer的清理

dbwr负责搜集dirtybuffer,slaves负责写磁盘

工作的前提条件:

1.dirtybuffer超出了dirtybufferlist的threshold.

2.serverprocess在buffercache中查找freebuffer时,则也可能会通知DBWn

将dirtybuffer写入datafile.

3.DBWn每3秒会检查是否有dirty数据要写入datafile.

4.CKPT

5.tablespaceoffline或者tablespacebeginbackup(这里实际上是由CKPT弓I

起).

6.dropobject

7.shutdown(这里实际上也是由CKPT引起)

建议你使用与存储数据文件的物理磁盘一样多的DBWR进程;

DBWR写入数据文件的任何修改已经被记录在重做日志文件中.

一次checkpoint的成功过程是:dbwr搜集dirtybuffer,交给slave写磁盘,写完毕

通知dbwr;然后dbwr才返回检查点完成。

增加写进程,同时要调整db_block_lru_latches参数,如修改或者添加如下两个参数:

db_writer_processes=4

db_block_lru_latches=8

■日志写进程(LGWR)。

L0G_CHECKP01NT」NTERVAL,L0G_CHECKP01NT_TIMEOUT,LOG_CHECKPOINTS_TO_ALERT

LGWR工作的要紧条件如下

1.用户提交

2.有1/3重做日志缓冲区未被写入磁盘

3.有大于1M重做日志缓冲区未被写入磁盘

4.超时

5.DBWR需要写入的数据的SCN号大于LGWR记录的SCN号,DBWR触发LGWR写入

■归档进程(ARCH)。

ARCHIVE_LOG_START

■检查点(CKPT)。

同步数据文件,日志文件与操纵文件

CKPT会更新数据文件/操纵文件的头信息.

CKPT工作的要紧条件如下

1.在日志切换的时候

2.数据库用immediate,transaction,normal选项shutdown数据库的时候

3.根据初始话文件LOG_CHECKPOINT_INTERVAL,

L0G_CHECKP01NT_TIMEOUT,FAST_START」O_TARGET的设置的数值来确定

4.用户触发

■系统监控与进程监控进程(SM0N与PM0N)。

■调度进程(Dnnn)。

MTS_DISPATC1IERS

■恢复进程(RECO)。

DISTRIBUTED^TRANSACTIONS

■快照进程(SNPn)。

OB_QUEUE_PROCESS,JOB_QUEUE_INTERVAL

■锁进程(LCKn)。

■并行查询进程(Pnnn)。

PARALLEL_M1N_SERVERS,PARALLEL_MAX_SERVERS

■用户与服务器进程(Snnn)。

回滚

v$rollstatv$waitstatv$sysstatx$bhdba_rollback_segs

一下事务的流程:

1.分配一个回滚段

2.在回滚段事务表中分配一个事务槽

3,分配undoblock

4.更新数据块上的ITL事务槽

5.把前镜像记录在undoblock内

6.更换数据块的内容

ITL事务槽一InterestedTransactionList(ITL)

ITL内容包含:

xidTransactionID

Uba—UndoBlockAddress

Lek—LockStatus

xid=Undo.Segment.Number+Transaction.Table.Slot.Number+Wrap

uba=Address.Of.Last.Undo.Block.Used+Sequence+Last.Entry,in.UNDO.Record.Map

ALTERSYSTEMSETUNDO_MANAGEMENT=MANUALSCOPE=SPFILE;

SETTRANSACTIONUSEROLLBACKSEGMENTRB_LARGE1;

当一个事务开始的时候,会首先把变化前的数据与变化后的数据先写入日志缓冲区,然

后把变化前的数据写入回滚段,最后才在数据缓冲区中修改数据

一致性读取consistentreads

假设查询开始的时候的SCN为T,则在查询所扫描的数据块中,假如数据的COMMITSCN

小于T,则查询同意该数据,假如COMMITSCN大于T或者者说还没有产生COMMITSCN,则

查询会尝试去回滚段中查找数据。这是为了保证数据的读取的时间点的一致性,因此叫一致

性读。

我们能够参考v$rollstat、v$transaction与x$bh表,在x$bh中的class字段,假如

是回滚段块,假设回滚段USN为n,则回滚段头class为ll+2n,回滚段块为12+2n。

回滚段的使用、扩展、回缩

同一个事务不能跨越回滚段;一个回滚段至少包含2个extent。每个回滚段有一个回滚

段头,回滚段头是一个block,里面要紧记录了事务表信息。当产生一个事务的时候,就在

回滚段头的事务表中记录一条信息,该信息中包含了事务标志、事务状态、使用的回滚段块

数等等信息。使用时从第一个extent的第二个block到最后一个extent循环使用;假如其

中的一个extent有未提交的事物,那么前面的extent不能跨越该extent,只能在2个extent

之间扩展新的extent,并修改相应的节点指针(回滚段的extent之间是通过指针连起来的

一个单向循环的链表结构);

系统回滚段与延迟回滚段

SYSTEM回滚段是创建在系统表空间中,要紧是用于系统级的事务与分配普通事务于其他

回滚段上。当手工创建数据库后需要创建普通回滚段之前务必首先创建系统回滚段。

系统回滚段要紧用于两个方面。一是系统事务,比如针对数据字典的操作的truncate

table与droptable。假如truncatetableordroptable的过程中没有成功,则系统

会根据系统回滚段中的数据字典操作信息对该DDL操作进行回退。另一个方面,就是延迟回

滚段(DeferredRollbackSegment)。表空间off1ine时用户申请回滚,数据库会将回滚信

息写入系统回滚段(就是延迟回滚段),等到。nline时,在写入表空间。

回滚段的设置与管理

init.ora:transactions_per_ro11back_segment与transactions,

max_rollback_segments

1:系统并发事务数有多少?(要紧是产生恢复信息的会话数+一部分冗余数(20)=总回滚

段数)

2:系统是否存在大查询或者者大是事务?频繁么?

3:能提供给系统的回滚段表空间的磁盘空间是多少?

不要将回滚段的MAXEXTENTS设为UNLIMITED,回滚段所在表空间也不要设为AUTOEXTEND

方式,否则将会使得由于某个不正常的事务导致整个数据库处于失控状态。

9i

undojetention表示在自动管理模式下,回滚段中的数据在被覆盖前保留多长的时间,

单位是秒。这个参数应该决定于系统所中一些大查询运行的时间长度,以避免0RA-01555错

误。

在9i下创建非自动管理的的回滚段而不使用UNDO表空间,则设置undojnanagement

为MANUAL,然后在系统表空间中创建一个回滚段(注意这是务必的),创建自己的回滚段表空

间,这时能够在回滚段表空间中创建回滚段,创建完毕删除系统表空间中的回滚段。

著名的0RA-01555问题

一致读获取的时候发现回滚段已经被覆盖而出现找不着变化前映像,也就是当COMMIT

SCN大于T查询尝试去回滚段中找回数据却发现回滚段已经被覆盖了(由于回滚段是循环使

用的),则会出现著名的0RA-01555错误。

重做

v$sysstatv$logv$logfilev$loghistory

altersystemswitchlogfile;

重做记录了块的改变,包含回滚段头块、回滚段块、数据块,同时在块改变之前先记录

重做信息。

更换矢量(changevector)一当要改变数据库的数据时,这些改变的细节被记录为更换

矢量。通过这些记录,数据库处理过程能够被重现。

简而言之,一个更换矢量就是记录了一个数据块的行槽从一个状态改变到另一个状态的

its蜀_

也就是redo的记录单位是entry,即:fileX,blockY,rowslotZ。

Redo也记录了数据块(tableblock&indexblock)前照,事实上记录的就是undo,

由于即使没有commit,改动也会被记录到redo文件里,这时的tableblock&indexblock

就是未提交的最新状态,假如如今系统崩溃,则需要redo中记录的undo(前照)进行恢复,

因此redo记录了数据块、索引块、回滚块o

ORACLE推荐logswitch时间最好在15—30分钟之间。

跟redologfile有关的其它数据库参数

1、log_buffer它最好不要大于512K或者者128K*CPU个数。

我们能够用下面的SQL语句检测log_buffer使用情况:

SELECTRBAR.NAME,RBAR.VALUE,RE.NAME,RE.VALUE,(RBAR.VALUE*100)/

RE.VALUE||'%''radio"FROMV$SYSSTATRBAR,V$SYSSTATREWHERERBAR.NAME

=Jredobufferallocationretries,ANDRE.NAME='redoentries,;

这个比率小于1%才好,否则增加logbuffer的大小

2、log_checkpoint_interval

0racle8.1版本后log_checkpoint_interval指的是两次checkpoint之间操作系统数据

块的个数。checkpoint时Oracle把内存里修改过的数据块用DBWR写到物理文件,用LGWR

写到日志与操纵文件。

从性能优化来说log_checkpoint_interval=redologfilesizebytes/512bytes

3、logcheckpointtimeout

0racle8.1版本后log_checkpoint_timeout指的是两次checkpoint之间时间秒数。

Oracle建议不用这个参数来操纵,由于事务(transaction)大小不是按时间等量分布的。用

log_checkpoint_interval参数操纵会好一些。禁用此参数或者者按默认的900。

altersystemarchivelogcurrent;

第二个存档日志目的地能够通过初始化参数LOGARCHEVEDUPLEXDEST设定。

LOG_ARCHEVE_DEST与LOG_ARCHEVE_DUPLEX_DEST都能够存档所有的联机重作日志文件。另一

个初始化参数LOG_ARCH1VE_M1N_SUCCEED_DEST假如设置了的话,能够决定一个重作日志组务

必被成功存档到的存档日志目的地数,在一个目的地满或者其介质有错时,该参数能够防止

Oracle被冻结。要确保这两个目的地被配置在两个分离的磁盘/操纵器上,避免I/O冲突对

数据库性能的影响。

一些参数

v$parameter

查看系统当前使用的所有参数

SETpagesize9000

SETheadOFF

SETtermOFF

SELECTDECODE(isdefault,'TRUE','#')||DECODE(isdefault,'TRUE’,

RPAD(name,43),RPAD(name,45))II'='IIvalueFROMv$parameterORDERBYname;

查看所有参数是否已被init.ora重新设定

SELECTname,isspecifiedFROMv$obsolete_parameter;

查看过时参数与强调参数

SELECTkspponm,DECODE(ksppoflg,1,'Obsolete',2,'Underscored')FROMx$ksppo

ORDERBYkspponm;

查看当前系统中的所有隐臧参数(以sys身份登录)

SELECTksppinm,ksppstvl,ksppdescFROMx$ksppix,x$ksppcvyWHEREx.inst_id

=userenv(JInstance,)andy.instid=userenvC,Instance,)andx.indx=y.indxand

x.ksppinmlikeJ%_&par%>orderbytranslate(x.ksppinm,

用户参数

select*fromv$fixedtablewherenamelike'%NLS%';

SELECT*FROMV$NLS_PARAMETERS;

ALTERSESSIONSETNLS_DATE_FORMAT=,YYYY-MM-DDHH24:MI:SS';

最常被修改的参数:

Shared_pool_size分配给共享池的内存字节数随着用户的需求,能够按时增加此值

Rollback_segments数据库启动时获取的一个或者多个当事务处理量增加或者减少

时,能够从该回滚段名列表中增加或者删除回滚段名

Processes可同时访问数据库的最大进程数量

session=l.i*process+5,通常而言,session与process是对应的,5是Oracle

后台进程的session,10%是提供给recursivesession使用的。

db_b1ock_buffers见SGA介绍中的有关内容

shared_pool_size见SGA介绍中的有关内容

log_buffer见SGA介绍中的有关内容

sort_area_size

针对每个session,排序首先会使用sort_area_size,假如不足则会使用临时表空间。

实际上就是外排序过程,把要排序的对象分割为内存能够容纳的小段(sortrun),然后每个

sortrun都放到sortarea里面去排序,排序结果作为中间信息放在临时表空间的临时段内,

由于分段排序的结果当然不可能是最终要求的排序结果,因此还要通过一个merge的过程,

才会得到最终排序结果,原理大概是比较每个sortrun的第一名,取出领先者,然后该sort

run的第二名顶上,继续上述过程直到取完。

因此建议:sortarea_size所能容纳记录数至少大于排序记录数的平方根

5.open_cursor见皿介绍中的有关内容

6.database_writers

许多DBA有个错误的概念,认为此参数受CPU数量的限制,实际并非如此。提示:假如

工作在一个能够支持多进程的操作系统上,需做的第一件事就是改变这个参数的值。

重新启动数据库,使用startup命令,Oralce将会按照下列顺序在缺省目录中搜索参数

文件:

spfile${ORACLE_S1D}.ora

缺省目录UNIX:${ORACLE_HOME}/dbs/NT:${0RACLEJI0ME}\database

spfile.ora

缺省目录UNIX:${ORACLE_HOME}/dbs/NT:${ORACLE_HOME}\database

init${ORACLESID},ora

缺省目录UNIX:${ORACLE_HOME}/dbs/

NT:${ORACLE_HOME}\databaseor${ORACLE_HOME}\admin\db_name\pfile\

创建了spfile,重新启动数据库,Oracle会按顺序搜索以上目录,spfile就会自动生效。

startuppfile=,E:\Oracle\admin\eyglen\pfile\init.ora);

createspfilefrompfile;

然后我们能够使用ALTERSYSTEM方式将修改固定到SPFILE.

ALTERSYSTEMSETlog_archive_start=FALSESCOPE二spfile;

空间管理

主体思想一直围绕着内部段的扩展。不仅仅影响到空间大小,自由块太分散的话会影响

性能(I/O,及扩展时间等)

空闲表(主空闲表、进程空闲表、事务空闲表),可能存在于表头块中

表空间

droptablespace***includingcontents;

注:LMT是segment中extent的管理,ASSM是thefreespaceofsegment的管理。

在0racle8I的版本中,Oracle推出了一种全新的表空间管理方式:本地化管理的表空

间。所谓本地化管理,就是指Oracle不再利用数据字典表来记录Oracle表空间里面的extent

的使用状况,而是在每个表空间的数据文件的头部加入了一个位图区,在其中记录每个

extent的使用状况。每当一个extent被使用,或者者被释放以供重新使用时,Oracle都会

更新数据文件头部的这个记录,反映这个变化。

Oracle之因此推出了这种新的表空间管理方法,这种表空间组织方法的优点:

1.本地化管理的表空间避免了递归的空间管理操作。而这种情况在数据字典管理的表空

间是经常出现的,当表空间里的区的使用状况发生改变时,数据字典的表的信息发生改变,

从而同时也使用了在系统表空间里的回滚段。

2.本地化管理的表空间避免了在数据字典相应表里面写入空闲空间、已使用空间的信

息,从而减少了数据字典表的竞争,提高了空间管理的并发性

3.区的本地化管理自动跟踪表空间里的空闲块,减少了手工合并自由空间的需要。

4.表空间里的区的大小能够选择由Oracle系统来决定,或者者由数据库管理员指定一

个统一的大小,避免了字典表空间一直头疼的碎片问题。

5.从由数据字典来管理空闲块改为由数据文件的头部记录来管理空闲块,这样避免产生

回滚信息,不再使用系统表空间里的回滚段。由于由数据字典来管理的话,它会把有关信息

记在数据字典的表里,从而产生回滚信息。

由于这种表空间的以上特性,因此它支持在一个表空间里边进行更多的并发操作,并减

少了对数据字典的依靠。

关于表空间中的每一个空间(一个或者多个extent),我们务必明白:

1、这个可用空间位于什么数据文件

2、这个空间的尺寸是多大

3、假如它在用了,是哪一个段占用的这个空间

直到8i之前,所有的表空间都是使用字典管理模式,为了确保能储存以上的信息,ORACLE

用了两个数据字典表:UET$(已使用的区间)或者FET$(空闲空间):当一个段被删除的时候,

ORACLE就移动UET$中相应的行到FET$,这个过程的发生是连续的,而且可能发生等待.当

并发性很高的时候,数据字典的争用就来了。另外有一个问题就是,当表的空间很不连续或

者表空间有大量的碎片引起这两个表的增大,那么也就会引起数据库性能上的下降。

表空间分段:

气泡(bubble):一个连续的自由空间块;蜂窝(honeycomb):一系列看起来相连的块。

蜂窝由气泡构成(气泡间有边界),去掉边界,蜂窝并成一个大的气泡。气泡与蜂窝多是由于

扩展段的释放而产生。过多的小的气泡会导致DDL操作时多次扫描SYS.FET$,并花时间合并

可用空间,影响性能。

让我们看一下当一个行被从一个应用程序中插入到表中时发生的一系列动作:

1)查表的自由列表,考虑在哪能够放一个新行。假如没有自由块可用,需要分配一个新

的扩展段。

2)Oracle扫描SYS.FET$表,为空间中的扩展段定位自由空间。

3)第一次扫描找出能够供新的扩展段使用的气泡。新扩展段的大小计算使用大于扩展段

所需块数的、下一个可被5整除的数。比如,假如一个扩展段包含23块,则得到的数是25

块。然而,假如需要的是5块或者更小,就不必这样计算,一旦块数确定,第一次扫描就寻

找块数恰好满足需要的气泡。

4)假如没有找到恰好合适的,那么Oracle扫描大些的气泡。假如一个大的气泡所拥有

的块数比所需要的块数多5块或者5块以上(当然是在取了约数以后),那么气泡中的自由空

间分成两部分,一部分满足扩展段的需要,另一部分仍作为自由空间。新的(小一些的)的

自由空间气泡包含去掉所需的块数后剩下的块数(5块或者多于5块)。比如,假如需要的

块数是25,但找到了一个32块的气泡,那么Oracle占用其中的25块分配给扩展段并保持

剩下的7块形成一个分开的气泡,仍然保留在原处。另外一种情况,找到了一个28块的气泡,

那么只是把此气泡供扩展段使用。换句话说,假如多余的块数少于5就不产生分割操作。

5)假如所有现有的气泡都太小,不足以满足扩展段的需要(即没有找到大小相等的也没

有找到大于数据块数的气泡),那么进行第三次扫描寻找是否有能够合并的蜂窝能提供所需的

空间。在合并以后,再次进行第3步与第4步。

6)假如前面的几步都没有找到能够供扩展段使用的气泡,那么Oracle检查AUTOEXTEND

功能是否已被使能(后面全面介绍这一选项)。假如是的,再检查数据文件是否是可扩展的。

7)假如AUTOEXTEND没有被使能或者者在磁盘上(数据文件所在的磁盘)没有足够的空

间来扩大该数据文件,Oracle返回"0RAT650-55:Unabletoextend"错误消息,引起应用

失败。

预防措施:

1)将大小相同而且增长率相似的段应该储存在相同的表空间集合中,保证释放的气泡能

够高效地被别的段重新使用。

2)理想情况下,一个表空间中的所有段应该有相同的存储参数(对每一个段有相同的

IN1T1AL/NEXT值)。假如不能做到这一点,要保证不一致段的存储参数要互为倍数。为所有

的表空间指定DEFAULTSTORAGE参数。

3)一旦可能,指定PCTINCREASE=O。当由于没有定义增长模式而不可能指定该值时,

用100作为PCTINCREASE的可能值。在任何情况下,不要用如1、5等的随机值,以防止生成

奇数大小的扩展段。

4)周期性显式地合并应用程序的表空间。不要配置SMON来自动合并表空间,由于它需

要在表空间的DEFAULTSTORAGE语句中指定一个大于0的PCTINCREASE的值。

识别表空间段情况、重构特定文件:

1)识别表空间中的扩展段、气泡、蜂窝:

SETLINES132

SETPAGES500

COLUMN“FIL」D”FROMAT999HEADING“FIL|ID”

COLUMN“FIL”FORMATA55HEADING“FIL-NAME”

COLUMN“SEGMENT”FROMATA55

COLUMN“STARTBLK”FROMAT999999HEADING“STARTBLK”

COLUMN**#BLOCKSwFORNIAT999,999HEADING“#:BLKS”

SELECTD.FILE_IDMFIL_ID>,,D.FILE_NAME“FIL”,SEGMENT_TYPE||4,OWNER

||,,'||SEGMENT_NAME“SEGMENT”,E.BLOCKED“STARTBLK”,

E.BLOCKS“#BLOCKS”

FROMDBA_EXTENTSE,DBA_DATA_FILESD

WHEREE.TABLESPACE_NAME=UPPER(,&&TBLSPC_NAME,)

ANDI).TABLESPACENAME=E.TABLESPACENAMEANDD.FILEID=E.FILEID

UNION

SELECTS.FILE_ID(<FIL_IDW,D.FILE_NAME“FIL”,'FREECHUNK'"SEGMENT”,

S.BLOCK_ID“STARTBLK”,S.BLOCKS“#BLOCKS”

FROMDBA_FREE_SPACES,DBA_DATA_FILESD

WHERES.TABLESPACE_NAME=UP

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论