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

下载本文档

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

文档简介

ORACLE的工作机制体系结构实例Oracle 运行的时候,在内存中会要开辟一个区间,这个区间主要是用于从磁盘(数据文件)中读出数据后的一个在内存的缓存和处理。而处理这些数据的操作,需要有一些系统的后台进程,这些进行在Oracle数据库启动的时候,就开始运行,一直在响应前台的操作。实际上,这一个区间(SGA)和这些后台进程合在一起,就称为 实例。实例是包括SGA区和后台进程两个部分的。 数据库启动执行若干动作,经历三个阶段,分别是未加载、加载和打开。1、未加载(nomount) 可以把数据库启动的这一阶段看作是Oracle实例的启动。这种方式启动下可执行:重建控制文件、重建数据库。这一启动命令: 读取数据库参数文件。 启动所需的后台进程并按参数文件中的定义分配内存。 将进展情况写入告警日志文件中。2、加载(mount) 在实例启动加载阶段,数据库参数文件中指定的控制文件被读取。记住控制文件将数据库各部分联系在一起。实例从控制文件中找到下列信息,然后将进展写入告警日志文件。这种方式启动下可执行:数据库日志归档、数据库恢复、重新命名一些数据库文件: 所有数据文件和重做日志文件的名称和位置。 数据库名。 最新系统更改号(S C N)。3、打开(open) 包含在数据库中的每个联机数据文件在数据库打开前必须被同步。在数据库打开阶段: 所有联机数据文件的头与控制文件信息相比较。 所有文件同步后,数据库打开。当数据库关闭时,取决于它的关闭方式执行不同的任务:正常(normal)在所有的用户离线后发生的正常关闭。事务(transactional)事务关闭就是当所有的用户执行完当前的事务后,将用户从数据库上清除。立即(immediate)立即关闭就是从数据库清除所有当前用户之后,回退所有未完成的操作。异常(abort)异常关闭没有给数据库任何整理的机会。这种方式关闭后需要实行崩溃恢复。实例是数据管理的核心它做所有的工作,而数据库存储所有的数据。其他启动方式:startup restrict 约束方式启动这种方式能够启动数据库,但只允许具有一定特权的用户访问 非特权用户访问时,会出现以下提示: ERROR: ORA-01035: ORACLE 只允许具有 RESTRICTED SESSION 权限的用户使用 startup force 强制启动方式 当不能关闭数据库时,可以用startup force来完成数据库的关闭 先关闭数据库,再执行正常启动数据库命令 startup pfile=参数文件名 带初始化参数文件的启动方式 先读取参数文件,再按参数文件中的设置启动数据库 startup EXCLUSIVE*一个Delete操作的流程:1、 检查语法、语义(V$ROWCACHE :data dictionary cache),计算HASH VALUE,在session的UGA中进行匹配(session_cached_cursors),如果UGA中没有,在library chache 中匹配(library chache lock latch 保护 library chache lock 对地址堆的访问,而后 library chache pin latch 保护 library cache pin 对library cache中sql相关信息的访问)2、 根据执行计划读取数据:cache buffer chain latch 保护能定位到buffer header 并 pin 住该块(如果没有buffer header,就 pin 住某个空块(没有空块就产生 free buffer waits),并到数据文件中读取)。如果此时有某个进程想访问该块,将产生 buffer busy waits 。3、 在redo log buffer中记录delete操作的细节。(包括回滚段前后镜像、数据块前后镜像)。4、 在相应回滚段段头的事务表中创建一个undo条目,把将要删除的记录创建前镜像,存放到Undo Block中。5、 在Buffer Cache中的相应数据块上删除记录,并且标记相应的数据块为Dirty。提交(COMMIT)1.Oracle产生一个SCN2.在回滚段事务表中标记该事务状态为commited3.LGWR Flush Log Buffer到日志文件3.如果此时数据块仍然在Buffer Cache中,那么SCN将被记录到Block Header上,这被称为快速提交(fast commit)4.如果dirty block已经被写回到磁盘,那么下一个访问这个block的进程将会自回滚段中获取该事务的状态,确认该事务被提交。然后这个进程获得提交SCN并写回到Block Header上。这被称为延迟块清除(delayed block cleanout)。内存SGA(系统全局区、共享全局区)、PGA(进程全局区、私有全局区)内存分配原则:10%冗余内存,OS SYS进程(约1.6G),OS BUFFER(约0.8G),数据库连接消耗内存(每个连接约58M),PGA(每个连接约2M,V$PGA_TARGET_ADVICE),SGASGAv$sgastat 注意 show parameter sga_max_sizeOracle的内存:l 软件代码区l 系统全局区l 进程全局区:包含单个进程的数据和控制信息l 排序区System Global AreaFixed SizeVariable SizeDatabase BuffersRedo buffersLarge poolShared PoolLibrary cacheData dictionary cacheUser Global Area共享SQL区专用SQL区db_cache_sizedb_keep_cache_sizedb_recycle_cache_sizedb_nk_cache_size永久性内存结构Java poolSGA中的The fixed area包含了数千个原子变量,以及如指向SGA中其它区域的pointers(指针)等小的数据结构.通过对fixed table内表X$KSMFSV查询(如下)可以获得这些变量的名字,变量类型,大小和在内存中的地址.the variable area是由large pool和shared pool组成Shared pool中永久性的内存包含各种数据结构如:the buffer headers, processes, sessions, transaction arrays, the enqueue resources , locks, the online rollback segment arrays, various arrays for recording statistics.其中大部分的SIZE是依靠初始参数的设置来确定的.这些初始参数只能在实例被关闭的状态下才能够进行修改.所以这里说的永久性是针对实例打开状态下的生存期而言.The variable area的在SGA中的SIZES就等于LARGE_POOL_SIZE,SHARED_POOL_SIZE和永久性的内存arrays的SIZE三者相加.永久性内存arrays的SIZE=the variable area - (LARGE_POOL_SIZE+SHARED_POOL_SIZE).数据缓冲区命中率v$sysstat这里命中率的计算应该是令 x = physical reads direct + physical reads direct (lob)命中率 =100 - ( physical reads - x) / (consistent gets + db block gets - x)*100通常如果发现命中率低于90%,则应该调整应用可可以考虑是否增大数据缓冲区共享池的命中率SQL select sum(pinhits-reloads)/sum(pins)*100 hit radio from v$librarycache;hit radio-99.809291假如共享池的命中率低于95%,就要考虑调整应用(通常是没使用bind var )或者增加内存关于排序部分SQL select name,value from v$sysstat where name like %sort%;NAME VALUE- -sorts (memory) 67935sorts (disk) 1sorts (rows) 7070假如我们发现sorts (disk)/ (sorts (memory)+ sorts (disk)的比例过高,则通常意味着sort_area_size 部分内存较小,可考虑调整相应的参数。关于log_bufferSQL select name,value from v$sysstat2 where name in(redo entries,redo buffer allocation retries);NAME VALUE- -redo entries 2325719redo buffer allocation retries 10假如 redo buffer allocation retries/ redo entries 的比例超过1%我们就可以考虑增大log_buffer如何在Linux上扩展SGA超过1.7G共享池(SHARED_POOL_SIZE)v$shared_pool_adviceALTER SYSTEM FLUSH SHARED_POOLHow to Keep Objects - 重点使用DBMS_SHARED_POOL.KEEP过程来keep objects, UNKEEP过程从shared pool中移走pinned objectsexecute dbms_shared_pool.keep(address,hash_value); - keep 该匿名块共享池包括库高速缓存( library cache)、数据字典高速缓存和服务器控制结构(例如数据库字符集)。Oracle服务器用库高速缓存来提高执行SQL语句的性能;库高速缓存包括共享和专用SQL区。共享SQL区包括SQL语句语法分析树和执行路径,而专用SQL区存储特定的会话信息,例如捆绑变量、环境和会话参数、运行堆栈和缓冲区等。Soft parse使用的资源包括CPU 和library cache latch getsHard parse是指要解析的SQL没有在library cache中,或者执行的时候发现解析过的SQL已经aged out,就是离开了library cache,称为Library cache misses使用的资源包括额外的CPU, library cache latch gets, 以及shared pool latch gets.专用SQL区在每个事务初始化时创建,在与专用SQL区相关的游标关闭时被释放。一个用户会话能够一次打开的专用SQL区的数量由init.ora参数OPEN_CURSORS决定。使用这两个结构,Oracle服务器能够重用一条SQL语句的所有执行的共同信息。与此同时,可以从专用SQL区中查询执行的特定会话信息。注意游标使用过程中并不关闭游标的应用会继续为应用分配越来越多的内存,部分原因是为每个打开的游标分配了专用SQL区。库高速缓存中的专用SQL区可更进一步分为永久区和运行区。共享池的大小取决于init.ora文件参数SHARED_POOL_SIZE,它是以字节为单位的。你必须将这个值设得足够大,以确保有足够的可用空间来装载和存储PL/SQL块和SQL语句。共享区经过长期装卸和卸载数据对象会产生许多碎片,如果在共享池中没有足够的连续空间用来装载目标数据,会产生错误。解决这个问题的捷径是运行SQL命令ALTER SYSTEM FLUSH SHARED_POOL。但是如果在数据库操作时,经常遇到共享池错误,你必须增大共享池Library cache包含 shared SQL and PL/SQL areas(PL/SQL包括Procedures, Functions, Packages, Trigger, 匿名PL/SQL块) Sizing the Library Cache定义stored object(packages,views等等)的内存需求;定义经常使用的sql statement的所需内存1. 初始时将SHARED_POOL_SIZE设得很大,运行应用程序2. 计算stored object所占的内存SELECT SUM(sharable_mem) FROM v$db_object_cacheWHERE type = PACKAGE or type = PACKAGE BODY or type = FUNCTION or type = PROCEDURE;3. 应用程序运行一段时间后,估计常用sql语句所占的内存(不包括动态SQL)SELECT SUM(sharable_mem)FROM v$sqlareaWHERE executions 5;4. 对每个user每个打开的cursor,需要250bytes,可在运行高峰期间使用查询:SELECT SUM(250 * users_opening) FROM v$sqlarea;5. 在测试环境中,可让一个用户打开一定数量的cursor,运行下列语句测试共享内存,然后乘上user数SELECT 250 * value bytes_per_userFROM v$sesstat s, v$statname nWHERE s.statistic# = n.statistic#AND = opened cursors currentAND s.sid = 15;以上内存的和,再加上一点内存(留给动态SQL使用),作为你的应用的理想内存设置;预留一部分空间作为大的内存需要,避免miss和碎片;一些大的内存需要: PL/SQL块的编译,trigger的编译;小的object不会使预留空间碎片化,反而保证reserved list有大的连续块,一旦从reserved list中分配的内存释放它就返回reserved list。影响的参数:SHARED_POOL_RESERVED_SIZE初始值=SHARED_POOL_SIZE*10%, 超过50%,oracle server报错OPEN_CURSORS 缺省=50定义了涉及分配给用户进程的私有SQL区域的cursors数量, 一个private SQL area一直存在直至cursor关闭;为了利用更多的内存给共享SQL区域,需要提高session每个session允许多cursor数量,开发人员应关闭不需要的cursor节省内存CURSOR_SPACE_FOR_TIME 缺省=FALSE 布尔值设置TRUE,表示以空间换取时间,共享SQL区不会被aged out直至相关的cursor被关闭,因此确信有足够的内存,没有cache miss;除非RELOADS in V$LIBRARYCACHE一直为0,否则不要改变此参数值若应用为FORM或使用动态SQL,设此值为FALSE - 因为动态sql总是不一致,将占用过多内存SESSION_CACHED_CURSORS 缺省=0 表示没有cache当一个session打算关闭一个cursor时,如果这个cursor的parse count超过3次,那么这个cursor将会被加到session cursor cache list的MRU端.当一个session打算parse一个sql时,它会先去session的pga内搜索session cursor cache list,如果找到那么会把这个cursor脱离list,然后当关闭的时候再把这个cursor加到MRU端. session_cached_cursor提供了快速软分析的功能,提供了比soft parse更高的性能. 检查系统是否需要此参数的方法:对某个典型用户sessionselect a.sid,,a.value from v$sesstat a,v$statname b where a.statistic#=b.statistic# and (=session cursor cache hits or like parse count%);If few parses result in hits,则可提高此参数,注意它将increase overall demands on memory. - ?Data Dictionary CacheSelect type, parameter, gets, getmisses, round(getmisses/decode(gets,0,null,gets)*100,2) ratio(%) from v$rowcache;Goal for a Good Ratio SUM(GETMISSES)/SUM(GETS) Performance ManagerMemoryData Dictionary Cache Hit%检索需要在共享池中要求大于100K连续空间的对象:select * from v$db_object_cache where sharable_mem 100000 and type in (PACKAGE, PACKAGE BODY, PROCEDURE, FUNCTION);考察返回的结果,确认是否需要pin到共享池中,返回结果中的KEPT字段如果是YES,那么表示该对象已经固定在了共享池中,为NO,则表示还没有固定。如果需要固定,使用下面的语句:exec dbms_shared_pool.keep(SYS.STANDARD); 数据库默认安装的时候没有创建dbms_shared_pool包,所以需要先创建该包。cd $ORACLE_HOME/rdbms/adminsqlplus “/ as sysdba”dbmspool.sqlDATA BUFFER - 数据库缓冲区高速缓存v$db_cache_advice=一堆数据块(DB_BLOCK_SIZE*DB_BLOCK_BUFFERS)数据库的任何修改都在该缓冲里完成(LRU-LRUW)。所有的块,被读到内存中后,它的块头(data block header)放在一个Cache buffer chain 中,Cache buffer chain由多个双向hash 链表组成,hash链表数量由_db_block_hash_buckets决定.每个数据块头由DBA(data block address)作为key,经hash函数后放在链表上,它和block buffer中的block一一对应,数据块头不包括实际的数据,仅是一个简单的描述. 后台进程扫描hash链表前,必须获得cache buffer chain latch,如果在Cache Buffer chain中找不某块,就由磁盘读入. 若需要查找某个 block,则根据 block的信息能计算 hash value 然后迅速定位到 hash table ,然后根据hash table 信息去查看是否存在所想要的 buffer ,若有则命中,若没有则不命中。显然不可能根据list去逐个搜索,这样效率太低.LRU 就是一种尽可能将常用的数据保留在内存的算法.当数据库需要一个数据缓冲区, 他会从数据库缓冲区的LRU 队列的尾部找一个空闲的缓冲, 将一个数据块读入, 然后数据库会把这个缓冲区放到LRU 队列的中部, 如果该缓冲被其他程序用到的话, 那么他会往队列的头上移动, 如果这个缓冲没有被其他程序用到,并且没有被修改过, 那么他会慢慢的移动到LRU 队列的尾部, 最终被认为是空缓冲区被其他数据块所覆盖.一旦这个缓冲区被修改过DBWR 把他从LRU 队列中移出, 放到LRUW 队列 (也叫赃缓冲区) 中, 等待DBWR 把他们批量写入数据文件, 然后再把他们的缓冲区连接到LRU 队列的尾部.周而复始的工作.如果查找在一个阀值内没有结果或者造成dirty缓冲区已经溢出,在进一步查找free buffer前系统将发出一个消息给DBWR让他可以将LRUW队列的缓冲区写入磁盘. 这个阀值被叫做这个阀值被叫做DBWR scan depthdirty缓冲区大小可以用 _DB_LARGE_DIRTY_QUEUE和 2*_DB_BLOCK_WRITE_BATCH 来确定. 前台进程继续搜索free buffer.直到 _DB_BLOCK_MAX_SCAN_CNT还没有发现系统就会挂起该进程.记录dirty buffers inspected的静态变量并把该进程标志为free buffer wait.cache 和 buffer_pool_keep是不一样的,cache 是如果对该表全表扫描的话,会把块放在mru端 ,buffer_pool_keep是放在 keep池中select table_name,cache,buffer_pool from dba_tables where table_name=TEST;将表和索引 Cache 到 SGA 中从ORACLE805之后,支持ALTER TABLE table_name STORAGE(BUFFER_POOL KEEP)命令了。但是在805与8i中,需要设置buffer_pool_keep参数来设置KEEP池大小。这块内存来自数据缓存区,也就是从db_block_buffers中分配。在ORACLE8和8i中,还必须设置db_block_lru_latches参数。该参数应该比2*3*CPU数量少,但是要大于1,否则无法设置buffer_pool_keep。在ORACLE9i 中则需要设置DB_KEEP_CACHE_SIZE来设置KEEP池内存的大小。这样将表KEEP才有用。而且KEEP池要能够容纳得下才行的将函数Cache 到 SGA 中$ORACLE_HOMErdbmsadmindbmspool.sql;exec dbms_shared_pool.keep(procedure_name,P);重做日志缓冲区(LOG_BUFFER)log buffer分成内部的buffer blocks,而这些block各有8个字节的头部信息存在于variable area中.当重做日志缓冲区填满时,将它的内容写入联机重做日志文件。是循环使用。是数据库最活跃的情形,可以用V$SYSSTAT视图进行监控。查询V$SYSSTAT视图value域,它表明用户进程等待重做日志缓冲区所花费的时间(此处value的值应接近于0,否则应增大初始化参数文件的Log_buffers的值):SELECT NAME, VALUE FROM V$SYSSTAT WHERE NAME = redo log space requests;PGAv$pgastat v$pga_target_advice后台进程v$bgprocess数据库写进程(DBWR)(DB_BLOCK_WRITE_BATCH,DB_BLOCK_MAX_SCAN,DB_WRITES,DB_BLOCK_LRU_LATCHES,DB_BLOCK_CHECKPOINT_BATCH,DB_BLOCK_CHECKSUM)负责数据文件的读写和db_data_buffer的清理dbwr负责搜集dirty buffer,slaves负责写磁盘工作的前提条件:1. dirty buffer超出了dirty buffer list的threshold.2. server process在buffer cache中查找free buffer时,则也可能会通知DBWn将dirty buffer写入datafile.3. DBWn每3秒会检查是否有dirty数据要写入datafile.4.CKPT5.tablespace offline或tablespace begin backup(这里实际上是由CKPT引起).6.drop object7. shutdown (这里实际上也是由CKPT引起)建议你使用与存储数据文件的物理磁盘一样多的DBWR进程;DBWR写入数据文件的任何修改已经被记录在重做日志文件中.一次checkpoint的成功过程是:dbwr搜集dirty buffer,交给slave写磁盘,写完毕通知dbwr,然后dbwr才返回检查点完成。增加写进程,同时要调整db_block_lru_latches参数,如修改或添加如下两个参数: db_writer_processes=4 db_block_lru_latches=8日志写进程(LGWR)。LOG_CHECKPOINT_INTERVAL,LOG_CHECKPOINT_TIMEOUT,LOG_CHECKPOINTS_TO_ALERTLGWR工作的主要条件如下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、LOG_CHECKPOINT_TIMEOUT,FAST_START_IO_TARGET的设置的数值来确定4.用户触发系统监控和进程监控进程(SMON和PMON)。调度进程(Dnnn)。MTS_DISPATCHERS恢复进程(RECO)。DISTRIBUTED_TRANSACTIONS快照进程(SNPn)。OB_QUEUE_PROCESS,JOB_QUEUE_INTERVAL锁进程(LCKn)。并行查询进程(Pnnn)。PARALLEL_MIN_SERVERS,PARALLEL_MAX_SERVERS用户和服务器进程(Snnn)。回滚v$rollstat v$waitstat v$sysstat x$bh dba_rollback_segs一下事务的流程:1.分配一个回滚段2.在回滚段事务表中分配一个事务槽3.分配undo block4.更新数据块上的ITL事务槽5.把前镜像记录在undo block内6.更改数据块的内容ITL事务槽-Interested Transaction List(ITL)ITL内容包括:xid-Transaction IDUba-Undo Block AddressLck-Lock Statusxid=Undo.Segment.Number+Transaction.Table.Slot.Number+Wrapuba=Address.Of.Last.Undo.Block.Used+Sequence+Last.Entry.in.UNDO.Record.MapALTER SYSTEM SET UNDO_MANAGEMENT=MANUAL SCOPE=SPFILE;SET TRANSACTION USE ROLLBACK SEGMENT RB_LARGE1;当一个事务开始的时候,会首先把变化前的数据和变化后的数据先写入日志缓冲区,然后把变化前的数据写入回滚段,最后才在数据缓冲区中修改数据一致性读取consistent reads假设查询开始的时候的SCN 为T,则在查询所扫描的数据块中,如果数据的COMMIT SCN 小于T,则查询接受该数据,如果COMMIT SCN 大于T 或者说还没有产生COMMIT SCN,则查询会尝试去回滚段中查找数据。这是为了保证数据的读取的时间点的一致性,所以叫一致性读。我们可以参考v$rollstat、v$transaction和x$bh 表,在x$bh 中的class字段,如果是回滚段块,假设回滚段USN 为n,则回滚段头class 为11+2n,回滚段块为12+2n。回滚段的使用、扩展、回缩同一个事务不能跨越回滚段;一个回滚段至少包含2个extent。每个回滚段有一个回滚段头,回滚段头是一个block,里面主要记录了事务表信息。当产生一个事务的时候,就在回滚段头的事务表中记录一条信息,该信息中包含了事务标志、事务状态、使用的回滚段块数等等信息。使用时从第一个extent的第二个block到最后一个extent循环使用;如果其中的一个extent有未提交的事物,那么前面的extent不能跨越该extent,只能在2个extent之间扩展新的extent,并修改相应的节点指针(回滚段的extent 之间是通过指针连起来的一个单向循环的链表结构);系统回滚段与延迟回滚段SYSTEM 回滚段是创建在系统表空间中,主要是用于系统级的事务和分配普通事务于其他回滚段上。当手工创建数据库后需要创建普通回滚段之前必须首先创建系统回滚段。系统回滚段主要用于两个方面。一是系统事务,比如针对数据字典的操作的truncate table 和 drop table 。如果truncate table or drop table 的过程中没有成功,则系统会根据系统回滚段中的数据字典操作信息对该DDL 操作进行回退。另一个方面,就是延迟回滚段(Deferred Rollback Segment) 。表空间offline时用户申请回滚,数据库会将回滚信息写入系统回滚段(就是延迟回滚段),等到online时,在写入表空间。回滚段的设置和管理init.ora: transactions_per_rollback_segment 和transactions,max_rollback_segments1:系统并发事务数有多少?(主要是产生恢复信息的会话数+一部分冗余数(20)=总回滚段数)2:系统是否存在大查询或者大是事务?频繁么?3:能提供给系统的回滚段表空间的磁盘空间是多少?不要将回滚段的MAXEXTENTS设为UNLIMITED, 回滚段所在表空间也不要设为AUTOEXTEND方式, 否则将会使得由于某个不正常的事务导致整个数据库处于失控状态。9iundo_retention 表示在自动管理模式下,回滚段中的数据在被覆盖前保留多长的时间,单位是秒。这个参数应该决定于系统所中一些大查询运行的时间长度,以避免ORA-01555 错误。在9i 下创建非自动管理的的回滚段而不使用UNDO 表空间,则设置undo_management为MANUAL,然后在系统表空间中创建一个回滚段(注意这是必须的),创建自己的回滚段表空间,这时可以在回滚段表空间中创建回滚段,创建完毕删除系统表空间中的回滚段。著名的ORA-01555 问题一致读获取的时候发现回滚段已经被覆盖而出现找不着变化前映像,也就是当COMMIT SCN 大于T 查询尝试去回滚段中找回数据却发现回滚段已经被覆盖了(因为回滚段是循环使用的),则会出现著名的ORA-01555 错误。重做v$sysstat v$log v$logfile v$log_historyalter system switch logfile;重做记录了块的改变,包括回滚段头块、回滚段块、数据块,并且在块改变之前先记录重做信息。更改矢量(change vector)当要改变数据库的数据时,这些改变的细节被记录为更改矢量。通过这些记录,数据库处理过程可以被重现。简而言之,一个更改矢量就是记录了一个数据块的行槽从一个状态改变到另一个状态的过程。也就是redo的记录单位是entry,即:file X,block Y,row slot Z。Redo也记录了数据块(table block & index block)前照,其实记录的就是undo,因为即使没有commit,改动也会被记录到redo 文件里,这时的table block & index block就是未提交的最新状态,如果此时系统崩溃,则需要redo中记录的undo(前照)进行恢复,所以redo记录了数据块、索引块、回滚块 。ORACLE推荐logswitch时间最好在15-30分钟之间。跟redologfile有关的其它数据库参数1、log_buffer它最好不要大于512K或者128K*CPU个数。我们可以用下面的SQL语句检测log_buffer使用情况:SELECT RBAR.NAME,RBAR.VALUE,RE.NAME,RE.VALUE,(RBAR.VALUE * 100) / RE.VALUE | % radio FROM V$SYSSTAT RBAR, V$SYSSTAT RE WHERE RBAR.NAME = redo buffer allocation retries AND RE.NAME = redo entries;这个比率小于1%才好,否则增加log_buffer的大小2、log_checkpoint_intervalOracle8.1版本后log_checkpoint_interval指的是两次checkpoint之间操作系统数据块的个数。checkpoint时Oracle把内存里修改过的数据块用DBWR写到物理文件,用LGWR写到日志和控制文件。从性能优化来说log_checkpoint_interval=redo log file size bytes/512bytes3、log_checkpoint_timeoutOracle8.1版本后log_checkpoint_timeout指的是两次checkpoint之间时间秒数。Oracle建议不用这个参数来控制,因为事务(transaction)大小不是按时间等量分布的。用log_checkpoint_interval参数控制会好一些。禁用此参数或者按默认的900。alter system archive log current;第二个存档日志目的地可以通过初始化参数LOG_ARCHEVE_DUPLEX_DEST设定。LOG_ARCHEVE_DEST和LOG_ARCHEVE_DUPLEX_DEST都可以存档所有的联机重作日志文件。另一个初始化参数LOG_ARCHIVE_MIN_SUCCEED_DEST如果设置了的话,可以决定一个重作日志组必须被成功存档到的存档日志目的地数,在一个目的地满或其介质有错时,该参数可以防止Oracle被冻结。要确保这两个目的地被配置在两个分离的磁盘/控制器上,避免I/O冲突对数据库性能的影响。一些参数v$parameter查看系统当前使用的所有参数SET pagesize 9000 SET head OFF SET term OFF SELECT DECODE(isdefault, TRUE, # ) | DECODE(isdefault, TRUE, RPAD(name,43), RPAD(name,45) | = | value FROM v$parameter ORDER BY name;查看所有参数是否已被init.ora重新设定SELECT name, isspecified FROM v$obsolete_parameter ;查看过时参数和强调参数SELECT kspponm,DECODE(ksppoflg, 1,Obsolete, 2, Underscored)FROM x$ksppo ORDER BY kspponm; 查看当前系统中的所有隐藏参数(以sys身份登录)SELECT ksppinm, ksppstvl, ksppdesc FROM x$ksppi x, x$ksppcv y WHERE x.inst_id = userenv(Instance) and y.inst_id = userenv(Instance) and x.indx = y.indx and x.ksppinm like %_&par% order by translate(x.ksppinm, _, );用户参数select * from v$fixed_table where name like %NLS%;SELECT * FROM V$NLS_PARAMETERS;ALTER SESSION SET NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS;最常被修改的参数:Shared_pool_size分配给共享池的内存字节数随着用户的需求,可以按时增加此值Rollback_segments数据库启动时获取的一个或多个当事务处理量增加或减少时,可以从该回滚段名列表中增加或删除回滚段名Processes可同时访问数据库的最大进程数量session=1.1*process+5,一般而言,session和process是一一对应的,5是Oracle后台进程的session,10%是提供给recursive session使用的。db_block_buffers见SGA介绍中的相关内容shared_pool_size见SGA介绍中的相关内容log_buffer见SGA介绍中的相关内容sort_area_size针对每个session,排序首先会使用sort_area_size ,如果不足则会使用临时表空间。实际上就是外排序过程,把要排序的对象分割为内存可以容纳的小段(sort run),然后每个sort run都放到sort area里面去排序,排序结果作为中间信息放在临时表空间的临时段内,由于分段排序的结果当然不会是最终要求的排序结果,所以还要经过一个merge的过程,才会得到最终排序结果,原理大概是比较每个sort run的第一名,取出领先者,然后该sort run的第二名顶上,继续上述过程直到取完。所以建议:sort_area_size 所能容纳记录数至少大于排序记录数的 平方根5. open_cursor见SGA介绍中的相关内容6. database_writers许多DBA有个错误的概念,认为此参数受CPU数量的限制,实际并非如此。提示: 如果工作在一个可以支持多进程的操作系统上,需做的第一件事就是改变这个参数的值。重新启动数据库,使用startup命令,Oralce将会按照以下顺序在缺省目录中搜索参数文件:spfile$ORACLE_SID.ora 缺省目录 UNIX: $ORACLE_HOME/dbs/ NT: $ORACLE_HOMEdatabasespfile.ora缺省目录 UNIX: $ORACLE_HOME/dbs/ NT: $ORACLE_HOMEdatabaseinit$ORACLESID.ora 缺省目录UNIX: $ORACLE_HOME/dbs/ NT: $ORACLE_HOMEdatabase or $ORACLE_HOMEadmindb_namepfile创建了spfile,重新启动数据库,Oracle会按顺序搜索以上目录,spfile就会自动生效。startup pfile=E:Oracleadmineyglenpfileinit.ora;create spfile from pfile;然后我们可以使用ALTER SYSTEM方式将修改固定到SPFILE.ALTER SYSTEM SET log_archive_start=FALSE SCOPE=spfile;空间管理主体思想一直围绕着内部段的扩展。不仅仅影响到空间大小,自由块太分散的话会影响性能(I/O,及扩展时间等)空闲表(主空闲表、进程空闲表、事务空闲表),可能存在于表头块中表空间drop tablespace * including contents;注:LMT是segment中extent的管理,ASSM是the free space of segment的管理。在Oracle8I的版本中,Oracle推出了一种全新的表空间管理方式:本地化管理的表空间。所谓本地化管理,就是指Oracle不再利用数据字典表来记录Oracle表空间里面的extent的使用状况,而是在每个表空间的数据

温馨提示

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

评论

0/150

提交评论