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

下载本文档

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

文档简介

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

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

3、块的格格式(Datta Bloock Foormat)块中存放表表的数据和索索引的数据,无无论存放哪种种类型的数据据,块的格式式都是相同的的,块由块头头(headder/Coommon and VVariabble),表表目录(Taable DDirecttory),行目录(RRow Diirectoory),空空余空间(FFree SSpace)和行数据(Row DData)五五部分组成,如下图所示示。 块头(heeader/Commoon andd Variiable):存放块的的基本信息,如如:块的物理理地址,块所所属的段的类类型(是数据据段还是索引引段)。 表表目录(Taable DD

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

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

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

7、动管理,手手动管理行链接和行行迁移(Roow Chaainingg and Migraating)行链接(RRow Chhaininng):如果果我们往数据据库中插入(INSERRT)一行数数据,这行数数据很大,以以至于一个数数据块存不下下一整行,OOraclee就会把一行行数据分作几几段存在几个个数据块中,这这个过程叫行行链接(Roow Chaainingg)。如下图图所示: 如果一行数数据是普通行行,这行数据据能够存放在在一个数据块块中;如果一一行数据是链链接行,这行行数据存放在在多个数据块块中。行迁移(RRow Miigratiing):数数据块中存在在一条记录,用用户执行UPPDATE

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

9、踪数数据块,这种种块的空间管管理方式叫“自动管理”。自动管理理有下面的好好处:易于使用用更好地利利用空间可以对空空间进行实时时调整块中自由空空间的手动管管理用户可以通通过PCTFFREE, PCTUSSED来调整整块中空间的的使用,这种种管理方式叫叫手动管理。相相对于自动管管理,手动管管理方式比较较麻烦,不容容易掌握,容容易造成块中中空间的浪费费。PCTFRREE参数用用于指定块中中必须保留的的最小空闲空空间百分例。之之所以要预留留这样的空间间,是因为UUPDATEE时,需要这这些空间。如如果UPDAATE时,没没有空余空间间,Oraccle就会分分配一个新的的块,这会产产生行迁移(Row M

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

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

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

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

14、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_TYPPE TAABLESPPACE_NNAME -

15、 - - - - -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; 未选定定行 插入10行行数据,进行行测试。 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 过程已成成功完成。 再次查看vv$bh视图图,检查内存存中是否使用用到了块。 selecct frr

17、om 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、的,现在我们来看看在一个会话中插入数据之后,同时在另外一个会话查询数据,这样的情况会对块有什么影响。打开一个新的会话, 然后执行如下命令:查询表,由于插入数据的事务没有提交,这里在另外的会话中就看不到任何数据,深深体现了ORACLE的多版本一致性select * from test_gao.t; 未选定行 查询视图v$bh,看是否有了变化select from v$bh where ts#=12; FILE# BLOCK# CLASS# STATU XNC OBJD- - - - - - 1 28089 4 xcur 0 11038 1 28090 1 cr 0 11038 1 28090 1

19、 cr 0 11038 1 28090 1 xcur 0 11038 果然和上一节查询出来的结果不同,多了红色字体标识出来的两行,大家可以看到这两行的STATUS字段值为cr,什么是cr呢?它是Consistency Read(一致性读取)的缩写。从这里可以看出28090这个块被两个会话进行了操作。 在第一个会话中回滚事务会发生什么呢?看下面的操作:会话1:执行rollback SQL rollback;回退已完成。 再次查询v$bh视图,看看什么情况select from v$bh where objd=11038; FILE# BLOCK# CLASS# STATU XNC OBJD- -

20、 - - - - 1 28089 4 xcur 0 11038 1 28090 1 cr 0 11038 1 28090 1 cr 0 11038 1 28090 1 xcur 0 11038 结果还是一样,说明在事务回滚之后,块还是处于一致读取的状态。(四)我们继续上一节的话题。 关闭数据库实例 SQL shutdown immediate 数据库已经关闭。已经卸载数据库。 重新打开数据库 SQLstartup ORACLE 例程已经启动。Total System Global Area253214492 bytesFixed Size 454428 bytesVariable Size 1

21、17440512 bytesDatabase Buffers 134217728 bytesRedo Buffers 1101824 bytes数据库装载完毕。数据库已经打开。 检查v$bh视图 select from v$bh where objd=11038; 未选定行 说明在没有进行块中数据的相关操作的时候,并没有从物理文件中提取块到内存。 执行查询或者插入、更新的SQL语句 SQL insert into test.t values (200,200); 已创建 1 行。 再次检查v$bh视图 SQL select from v$bh where objd=11038; FILE# B

22、LOCK# CLASS# STATU XNC OBJD- - - - - - 1 28089 4 xcur 0 11038 1 28090 1 xcur 0 11038 总结:在没有进行物理I/O的时候,v$bh视图中不会出现相关的块信息,同时证明此视图中存放的乃是数据文件块放到内存中的“块”信息。 HYPERLINK t _blank 实例讲解Oraacle 99i数据坏块块的处理2009-3-17 作者: 编编辑:齐瑞瑞瑞 HYPERLINK t _blank 点击进入论论坛关键词: HYPERLINK t _blank Oraacle HYPERLINK t _blank 数据 HYPE

23、RLINK t _blank 处理笔者在一台生产产用测试库上上SELECCT一个表时时出现ORAA-015778,一个块块损坏,以前前学习过块损损坏怎么处理理,到还真没没遇到过,今今天总算让我我遇到了,还还是一台生产产用测试库,就就不用很紧张张了。数据库版本是99.2.0.4,Oraacle9ii的RMANN有一个bllockreecoverr命令,可以以在线修复坏坏块,以下就就是使用RMMAN修复坏坏块的过程。SQL coonn owwi/owiiConneected.SQL selecct * ffrom ddpa_hiistoryy;seleect * from dpa_hhistorr

24、y*ERRORR at lline 11:ORA-015788: ORAACLE ddata bblock corruupted (filee # 155, bloock # 18)ORRA-011110: ddata : /d001/appp/oraccle/orradataa/dpa/dpa011.dbf报ORA-011578数据据块损坏,以以下使用RMMAN命令查查询是否可以以使用bloockreccover命命令恢复以及及怎样恢复使用rman登登录cataalog数据据库ora9rrmanseerver $ rrman ttargett sys/oraclledpaa cataalog

25、 rrman/rrmanRecoverry Mannager: Releease 99.2.0.8.0 - ProdductioonCopyrigght (cc) 19995, 20002, OOraclee Corpporatiion. All rrightss reseerved.connectted too targget daatabasse: DPPA (DBBID=84434950022)coonnectted too recoovery catallog daatabasse查找最近datta的全备份份,今天下午午刚做了一次次RMAN的的全备份RMAN llist bbackup

26、p of ddata;List off Backkup Seets=BS Key Typee LV SSize Devicce Typpe Elaapsed Time Complletionn Timee- - - - - - -6433 Full 644K DDISK 00:000:27 116-MARR-09 BBP Keyy: 6500 Sttatus: AVAIILABLEE Taag: TAAG200990316TT1543552Piecce Namme: /dd02/fuullbacckup/2200903316_daata_244_1Lisst of Dataffiles in

27、baackup set 6643 Tyype Ckkp SCNN CCkp Tiime NName- - - - - -15 FFull 11185622509055 16-MMAR-099 /d011/app/oraclle/oraadata/dpa/ddpa01.dbf查找SCN 11185622509055 以后的aarchivvelog是是否有备份RMAN llist bbackupp of aarchivvelog scn ffrom 11185622509055List of Baackup Sets=BSS Key Sizee Devvice TType EElapseed Ti

28、mme Commpletiion Tiime- - - - -680 2265K DISK 00:00:000 16-MAAR-09 BP Keey: 6881 SStatuss: AVAAILABLLE TTag: TTAG2000903166T1547731Pieece Naame: /d02/ffullbaackup/200900316_aarch_228Listt of AArchivved Loogs inn backkup seet 6800Thrd Seq Loow SCNN LLow Tiime NNext SSCN Next Time- - - - - -1 1009 118

29、5562508805 166-MAR-09 1118562551483 16-MAAR-0911 1110 1188562511483 116-MARR-09 11185622514877 16-MMAR-099查找sequeence 1110 以后后的archhiveloog是否有备备份RMAN llist ccopy oof arcchivellog frrom seequencce 1100;List off Archhived Log CCopiessKey Thhrd Seeq S Loow Timme Naame- - - - - -6694 1 1111 A 16-MAR-009

30、 /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 INACCTIVE1112 1 YYES INNACTIVVE从以上查询中可可以看出daata有一次次最近的全备备份,有全备备份以来的所所有arch

31、hiveloog,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 bloock(s) to rrestorre froom bacckup ssetresstorinng bloocks oof dattachannnel OORA_DIISK_

温馨提示

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

评论

0/150

提交评论