Oracle数据块原理的深入剖析_第1页
Oracle数据块原理的深入剖析_第2页
Oracle数据块原理的深入剖析_第3页
Oracle数据块原理的深入剖析_第4页
Oracle数据块原理的深入剖析_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、Oracle数据块原理深入剖析-入门基础时间:2009-033-10 000:00来来源:IT1168 biitsCN编编辑字体:大 中 小小数据块(Oraclle Datta Bloocks),本本文简称为“块”,是Oraacle最小小的存储单位位,Oraccle数据存存放在“块”中。一个块块占用一定的的磁盘空间。特别注意的的是,这里的的“块”是Oraccle的“数据块”,不是操作作系统的“块”。 Oraclle每次请求求数据的时候候,都是以块块为单位。也也就是说,OOraclee每次请求的的数据是块的的整数倍。如如果Oraccle请求的的数据量不到到一块,Orracle也也会读取整个个块。

2、所以说说,“块”是Oraccle读写数数据的最小单单位或者最基基本的单位。块的标准大大小由初始化化参数DB_BLOCKK_SIZEE指定。具有有标准大小的的块称为标准准块(Staandardd Blocck)。块的的大小和标准准块的大小不不同的块叫非非标准块(NNonstaandardd Blocck)。同一一数据库中,OOraclee9i及以上上版本支持同同一数据库中中同时使用标标准块和非标标准块。Orracle允允许指定5种种非标准块(Nonsttandarrd Bloock)。操作系统每每次执行I/O的时候,是是以操作系统统的块为单位位;Oraccle每次执执行I/O的的时候,都是是以O

3、raccle的块为为单位。Oraclle数据块大大小一般是操操作系统块的的整数倍。数据块的格格式(Datta Bloock Foormat)块中存放表表的数据和索索引的数据,无无论存放哪种种类型的数据据,块的格式式都是相同的的,块由块头头(headder/Coommon and VVariabble),表表目录(Taable DDirecttory),行目录(RRow Diirectoory),空空余空间(FFree SSpace)和行数据(Row DData)五五部分组成,如下图所示示。块头(heeader/Commoon andd Variiable):存放块的的基本信息,如如:块的物理理

4、地址,块所所属的段的类类型(是数据据段还是索引引段)。 表表目录(Taable DDirecttory):存放表的信信息,即:如如果一些表的的数据被存放放在这个块中中,那么,这这些表的相关关信息将被存存放在“表目录”中。行目录(RRow Diirectoory):如如果块中有行行数据存在,则则,这些行的的信息将被记记录在行目录录中。这些信信息包括行的的地址等。行数据(RRow Daata):是是真正存放表表数据和索引引数据的地方方。这部分空空间是已被数数据行占用的的空间。空余空间(Free Spacee):空余空空间是一个块块中未使用的的区域,这片片区域用于新新行的插入和和已经存在的的行的更新

5、。头部信息区区(Overrhead):我们把块块头(heaader/CCommonn and Variaable),表目录(TTable Direcctory),行目录(Row DDirecttory)这这三部分合称称为头部信息息区(Oveerheadd)。头部信信息区不存放放数据,它存存放的整个块块的信息。头头部信息区的的大小是可变变的。一般来来说,头部信信息区的大小小介于84字字节(byttes)到1107字节(bytess)之间。数据块中自自由空间的使使用当往数据库库中插入(IINSERTT)数据的时时候,块中的的自由空间会会减少;当对对块中已经存存在的行进行行修改(UPPDATE)的时

6、候(使使记录长度增增加),块中中的自由空间间也会减少。DELETTE语句和UUPDATEE语句会使块块中的自由空空间增加。当当使用DELLETE语句句删除块中的的记录或者使使用UPDAATE语句把把列的值更改改成一个更小小值的时候,OOraclee会释放出一一部分自由空空间。释放出出的自由空间间并不一定是是连续的。通通常情况下,OOraclee不会对块中中不连续的自自由空间进行行合并。因为为合并数据块块中不连续的的自由空间会会影响数据库库的性能。只只有当用户进进行数据插入入(INSEERT)或者者更新(UPPDATE)操作,却找找不到连续的的自由空间的的时候,Orracle才才会合并数据据块中

7、不连续续的自由空间间。对于块中的的自由空间,OOraclee提供两种管管理方式:自自动管理,手手动管理行链接和行行迁移(Roow Chaainingg and Migraating)行链接(RRow Chhaininng):如果果我们往数据据库中插入(INSERRT)一行数数据,这行数数据很大,以以至于一个数数据块存不下下一整行,OOraclee就会把一行行数据分作几几段存在几个个数据块中,这这个过程叫行行链接(Roow Chaainingg)。如下图图所示:如果一行数数据是普通行行,这行数据据能够存放在在一个数据块块中;如果一一行数据是链链接行,这行行数据存放在在多个数据块块中。行迁移(RR

8、ow Miigratiing):数数据块中存在在一条记录,用用户执行UPPDATE更更新这条记录录,这个UPPDATE操操作使这条记记录变长,这这时候,Orracle在在这个数据块块中进行查找找,但是找不不到能够容纳纳下这条记录录的空间,无无奈之下,OOraclee只能把整行行数据移到一一个新的数据据块。原来的的数据块中保保留一个“指针”,这个“指针”指向新的数数据块。被移移动的这条记记录的ROWWID保持不不变。行迁移移的原理如下下图所示:无论是行链链接还是行迁迁移,都会影影响数据库的的性能。Orracle在在读取这样的的记录的时候候,Oraccle会扫描描多个数据块块,执行更多多的I/O。

9、块中自由空空间的自动管管理Oraclle使用位图图(bitmmap)来管管理和跟踪数数据块,这种种块的空间管管理方式叫“自动管理”。自动管理理有下面的好好处:易于使用更好地利用空空间可以对空间进进行实时调整整块中自由空空间的手动管管理用户可以通通过PCTFFREE, PCTUSSED来调整整块中空间的的使用,这种种管理方式叫叫手动管理。相对于自动动管理,手动动管理方式比比较麻烦,不不容易掌握,容容易造成块中中空间的浪费费。PCTFRREE参数用用于指定块中中必须保留的的最小空闲空空间百分例。之所以要预预留这样的空空间,是因为为UPDATTE时,需要要这些空间。如果UPDDATE时,没没有空余空

10、间间,Oraccle就会分分配一个新的的块,这会产产生行迁移(Row MMigratting)。PCTUSSED也是用用于设置一个个百分比,当当块中已使用用的空间的比比例小于这个个百分比的时时候,这个块块才被标识为为有效状态。只有有效的的块才被允许许插入数据。文章转载自网管管网: HYPERLINK ORACLE块块的分析(一一)一直以来来对“块”的概念总是是含混不清,从从字面意义理理解,只知道道这是ORAACLE存放放数据的最小小单位,然而而它的内部世世界如何呢,本本人打算从今今天开始连载载几篇文档,对对它进行深度度分析。通过过很多文档、资料,了解解到了数据库库基本结构鱼鱼刺图:基本本上每个

11、对象象对应一个段段(Segmment),只只有分区对应应多个段,这这里的对象包包括tablle,inddex,paartitiion等等,段段可以跨越多多个数据文件件。每个段又又有多个区(eextentt)来组成,这这些区不能跨跨越多个数据据文件,同时时在系统使用用过程中自动动扩展。最后后是块(bllock),所所有的数据都都是存放在块块中。为了适适应操作系统统,每个块在在创建数据库库的时候默认认了一个大小小,这个大小小一般是8KK,同时在99I及其以后后的版本中增增加了不同大大小的块参数数,这将在以以后的实验中中体现。先说说说这个8KK大小的块,一一般来说,为为了使得orracle运运行读写

12、数据据文件的时候候有一个合理理的吞吐量,这这里的块大小小,都跟操作作系统块大小小设为整数倍倍,例如nttfs格式化化的磁盘文件件,每个物理理块大小为44,这里orracle的的块大小为88,即是代表表每读取一个个oraclle块,其实实物理上也就就是读取了两两个操作系统统块。这里主主要指的是数数据文件存放放在块设备上上,在实际的的生产环境中中,大部分情情况都是将数数据库安装在在裸设备(RRAW)也叫叫做原始分区区之上。关于于RAW将在在以后进行 讲解。 通过上面面这段文字,我我们可以了解解到ORACCLE基本的的存储结构,下下一篇将针对对块的大小与与存放数据大大小来做实验验。(二)上一节节了解

13、到了OORACLEE的存储结构构,这节讲一一讲块的大小小与数据存放放之间的关系系。大家都知知道了在ORRACLE环环境中,所有有的对象都是是存放在块中中,这个块大大小与存放的的记录之间到到底存在怎样样的关系呢?做一个实验验看看:创建建一个表空间间test creatte tabblespaace teest daatafille /ooraclee/oraddata/ttest.ddbf ssize 1100m; 创建一个用用户 creatte useer tesst ideentifiied byy testt defaault ttablesspace test; 创建一个个表 creat

14、te tabble teest.t11 (a1 numbeer,a2 varchhar2(1100); 检查段,可可以发现在这这个视图中出出现了名称为为T的段,段段类型为TAABLE,这这个段里面分分配了1个区区,其中包含含8个块,大大小为64KK字节。 selecct seggment_name,blockks,exttents,bytess,segmment_ttype,ttablesspace_name from dba_ssegmennts whhere oowner=TESTT; SEEGMENTT_NAMEE BLOCKKS EXTENNTS BYYTES SSEGMENNT_TY

15、PPE TAABLESPPACE_NNAME - - - - - -T 8 1 655366 TABLLE TEST 检查区,可可以发现在这这个视图中出出现了一个区区,区号为00,包含8个个块,大小为为64K字节节。 selecct seggment_name,segmeent_tyype,exxtent_id,bllocks,bytess fromm dba_extennts whhere oowner=TESTT; SEEGMENTT_NAMEE SEGMMENT_TTYPE EXTEENT_IDD BLOCKKS BYTTES- - - - -TT TABLEE 0 88 655336

16、检检查块,可以以发现这里没没有载入到内内存的块,由由此断定,在在数据未写入入的时候,内内存中并没有有存放数据的的块。 selecct frrom v$bh whhere tts#=122; 未选定定行插入100行数据,进进行测试。 SQL declaare22i nnumberr3;4begiin5for i in 1.100 loopp6execuute immmediaate iinsertt intoo testt.t vaalues (:x,:y) uusing i,i;7eend looop;8ennd;99/ PPL/SQLL 过程已成成功完成。再再次查看v$bh视图,检检查内存中

17、是是否使用到了了块。 selecct frrom v$bh whhere tts#=122; FILLE# BLOOCK# CLLASS# STATUU XNNC OBBJD- - - - - - 1 288089 4 xcur 0 110038 1 288090 1 xcur 0 110038 哈哈哈,果然出现现了数据,说说明在数据插插入的表的时时候在内存中中已经载入了了分配的块,同同时在这些块块中写入了数数据,这里占占用了两个块块,块号分别别为280889,280090,其中中我们可以根根据CLASSS#来判断断出他们属于于不同类型。(三)这一节节紧接着上一一节来说。上上一节通过实实验,我

18、们了了解到,块的的创建和读取取流程,不过过只是针对一一个会话的,现现在我们来看看看在一个会会话中插入数数据之后,同同时在另外一一个会话查询询数据,这样样的情况会对对块有什么影影响。打开一一个新的会话话,然后执行行如下命令:查询表,由由于插入数据据的事务没有有提交,这里里在另外的会会话中就看不不到任何数据据,深深体现现了ORACCLE的多版版本一致性sselectt * frrom teest_gaao.t; 未选定行查询询视图v$bbh,看是否否有了变化sselectt froom v$bbh wheere tss#=12; FILEE# BLOCCK# CLAASS# SSTATU XNCC

19、 OBJJD- - - - - - 1 280089 4 xxcur 00 110338 1 280090 1 ccr 00 110338 1 280090 1 ccr 00 110338 1 280090 1 xxcur 00 110338 果然和和上一节查询询出来的结果果不同,多了了红色字体标标识出来的两两行,大家可可以看到这两两行的STAATUS字段段值为cr,什什么是cr呢呢?它是CoonsisttencyRRead(一一致性读取)的的缩写。从这这里可以看出出280900这个块被两两个会话进行行了操作。在在第一个会话话中回滚事务务会发生什么么呢?看下面面的操作:会会话1:执行行roll

20、bback SQL rollbback;回回退已完成。再次查询vv$bh视图图,看看什么么情况sselectt froom v$bbh wheere obbjd=111038; FFILE# BBLOCK# CLASSS# STAATU XNC OBJD- - - - - - 1 280899 4 xcuur 0 111038 1 280900 1 cr 0 111038 1 280900 1 cr 0 111038 1 280900 1 xcuur 0 111038 结果还是一一样,说明在在事务回滚之之后,块还是是处于一致读读取的状态。(四)我们继继续上一节的的话题。关闭闭数据库实例例 SQ

21、L shutddown iimmediiate 数数据库已经关关闭。已经卸卸载数据库。重新打开数数据库 SQLsstartuup ORAACLE 例例程已经启动动。Totaal Sysstem GGloball Areaa byytesFiixed SSize byytesVaariablle Sizze bytessDatabbase BBufferrs byttesReddo Bufffers bytees数据库装装载完毕。数数据库已经打打开。检查vv$bh视图图 selecct frrom v$bh whhere oobjd=111038; 未选定行行说明在没有有进行块中数数据的相关操操

22、作的时候,并并没有从物理理文件中提取取块到内存。执行查询或或者插入、更更新的SQLL语句 SQL inserrt intto tesst.t vvaluess (2000,200); 已创建建 1 行。再次检查vv$bh视图图 SQL selecct frrom v$bh whhere oobjd=111038; FILEE# BLOCCK# CLAASS# SSTATU XNCC OBJJD- - - - - - 1 280089 4 xxcur 00 110338 1 280090 1 xxcur 00 110338 总结:在没有进行行物理I/OO的时候,vv$bh视图图中不会出现现相关的

23、块信信息,同时证证明此视图中中存放的乃是是数据文件块块放到内存中中的“块”信息。 HYPERLINK t _blank seg.JPGG (22.43 KBB)2008-6-17 188:46实例讲解Oraacle 99i数据坏块块的处理2009-3-17 作者: 编辑:齐齐瑞瑞 HYPERLINK t _blank 点击进入入论坛关键词: HYPERLINK t _blank Oraacle HYPERLINK t _blank 数据 HYPERLINK t _blank 处理笔者在一台生产产用测试库上上SELECCT一个表时时出现ORAA-015778,一个块块损坏,以前前学习过块损损坏怎

24、么处理理,到还真没没遇到过,今今天总算让我我遇到了,还还是一台生产产用测试库,就就不用很紧张张了。数据库版本是99.2.0.4,Oraacle9ii的RMANN有一个bllockreecoverr命令,可以以在线修复坏坏块,以下就就是使用RMMAN修复坏坏块的过程。SQL coonn owwi/owiiConneected.SQL selecct * ffrom ddpa_hiistoryy;seleect * from dpa_hhistorry*ERRORR at lline 11:ORA-015788: ORAACLE ddata bblock corruupted (filee # 1

25、55, bloock # 18)ORRA-011110: ddata : /d001/appp/oraccle/orradataa/dpa/dpa011.dbf报ORA-011578数据据块损坏,以以下使用RMMAN命令查查询是否可以以使用bloockreccover命命令恢复以及及怎样恢复使用rman登登录cataalog数据据库ora9rrmanseerver $ rrman ttargett sys/oraclledpaa cataalog rrman/rrmanRecoverry Mannager: Releease 99.2.0.8.0 - ProdductioonCopyriggh

26、t (cc) 19995, 20002, OOraclee Corpporatiion. All rrightss reseerved.connectted too targget daatabasse: DPPA (DBBID=)cconneccted tto reccoveryy cataalog ddatabaase查找最近datta的全备份份,今天下午午刚做了一次次RMAN的的全备份RMAN llist bbackupp of ddata;List off Backkup Seets=BS Key Typee LV SSize Devicce Typpe Elaapsed Time C

27、omplletionn Timee- - - - - - -6433 Full 644K DDISK 00:000:27 116-MARR-09 BBP Keyy: 6500 Sttatus: AVAIILABLEE Taag: TAAGTPieece Naame: /d02/ffullbaackup/_dataa_24_11List of Daatafilles inn backkup seet 6433 Typee Ckp SCN Ckpp Timee Namme- - - - - -115 Fulll 166-MAR-09 /dd01/appp/oraacle/ooradatta/dpa

28、a/dpa001.dbff查找SCN 以后的arrchiveelog是否否有备份RMAN llist bbackupp of aarchivvelog scn ffrom LList oof Bacckup SSets=BS Key Size Deviice Tyype Ellapsedd Timee Comppletioon Timme- - - - -680 2665K DDISK 00:000:00 116-MARR-09 BBP Keyy: 6811 Sttatus: AVAIILABLEE Taag: TAAGTPieece Naame: /d02/ffullbaackup/_arc

29、hh_28Liist off Archhived Logs in baackup set 6680Thrrd Seqq Low SSCN Low Time Nextt SCN Nexxt Timme- - - - - -1 109 116-MARR-09 16-MAAR-0911 1110 166-MAR-09 116-MARR-09查找sequeence 1110 以后后的archhiveloog是否有备备份RMAN llist ccopy oof arcchivellog frrom seequencce 1100;List off Archhived Log CCopiessKey Th

30、hrd Seeq S Loow Timme Naame- - - - - -6694 1 1111 A 16-MAR-009 /d002/arcch/1_1111.dbbf695 11 1112 A 116-MARR-09 /d02/aarch/11_112.dbf查询onlinne arcchive logSQL seelect sequeence#,membeers,arrchiveed,staatus ffrom vv$log;SEQUENCCE# MEMBBERS AARC STTATUS- - - -113 11 NO CURREENT1111 1 YESS INACCTIVE111

31、2 1 YYES INNACTIVVE从以上查询中可可以看出daata有一次次最近的全备备份,有全备备份以来的所所有archhiveloog,onlline rredo llog下面开开始blocckreoccver,其其实命令很简简单RMAN bblockrrecoveer datta bloock 188;Startinng bloockreccover at 166-MAR-09alllocateed chaannel: ORA_DISK_1channnel OORA_DIISK_1: sid=16 deevtypee=DISKKchannell ORA_DISK_1: reestoriing bllock(ss)channnel OORA_DIISK_1: speccifyinng blo

温馨提示

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

评论

0/150

提交评论