《数据库程序员面试分类真题19.docx》由会员分享,可在线阅读,更多相关《数据库程序员面试分类真题19.docx(14页珍藏版)》请在第壹文秘上搜索。
1、数据库程序员面试分类真题19倚答题1. Oracle中的坏块指的是什么?正确答案:Oracle数据文件的坏块可以分为物理坏块和逻辑坏块。物理坏块指的是块格式本身已经损坏,块内的数据没有任何意义:逻(江南博哥)辑坏块指的是块内的数据在逻辑上存在问题,比如索引块的索引值没有按顺序排列导致的逻辑坏块。物理坏块一般是由于内存问题、OS问题、I/O子系统问题或硬件引起的,逻辑坏块一般是由OracleBUg等原因引起的。坏块通常是通过OraeIe的ORA-Ol578错误报告出来的,详细的损坏描述会在告警日志中打印出来。可能的报错如下:ORA-O1578:ORAC1.Edatablockcorrupted(
2、fiIe#6,block#11)ORn-Ol1IOidatafile6/u01apporacteoradataorcltbsl.dbf,那么何时进行数据块的一致性检直呢?当一个数据块被读或写的时候,将对块进行一致性检查,检查的内容包括块的版本、比较块在CaCh。和BIOCkBUffer中的数据块地址,然后根据要求进行校验(CheCkSUm).块的一致性检查由DBB1.0CKCHECKSUM和DBB1.OCKQIECKlNG两个初始化参数控制。DBB1.OCKCHECKSUM是一种物理检查,只有在写入(DBWn常规写或用户进程宜接路径写入)数据文件时,根据一个CHECKSUM算法计算数据块的校验
3、和,然后写入数据块的一个特定位置,在读取块时再进行检验,主要是为了防止1/0硬件和1/0了系统的错误。DBB1.OCK.CHECKING参数主要用于数据块的逻辑一致性检查,但只是在块内,不包H块间的逻辑检查,用于防止在内存中损坏或数据损坏。考点RMAN2. Oracle中的坏块有哪些检测方法?正确答案:坏块的检测方法主要包括卜表所示的几种。方法I)FS中:dhfil.!hr*st01,dbfblocksize=8l922)ASM中:SdbVfie=DATA般喻朋施I2H99Ml:即邂三MRdoHi.朋R此联、嬲文件和RMANW.娘肝酬文件懒教正,(b丽R令行如,一1林文件的触块,二是豌朋在生正
4、反时;5要自由的怖由包括SYWSDRtSK和SYSSYS_USER_SEGS)UWid零1命令文好憎叫名的文件反胡酬口侬FR需忑黑黑粽-畸蠢畸SEGMENTNAMEqBC1.HR,对连接文件摩跳实则政务懿文物甑.艘牌DBVRFY如麻限薪后醐施解f含飕名的文件,3)甑段.料加end&幽枷跑ID或蜥在(如)瞅睚女蟒倒减备作为林旅虏么我撼蜥In醯文算段头懿第:证存相在ASM中的贵兴件,瓦么能留院用ZK影方:dbvuse油5yStaT*gme11l#36.12130嫌不龌即名解外舷就到DBV三8:USERlDmusbuSpedfitdfctOSMIito摭第ANA1.YZE令黜分析紫鼾棘,Mtmm翱!
5、懒触,mmmmm帆vt,vnTAillUZWVovrcWmEAIw1.YZE它也磔欣个胸制婕i三国坏的OAM1.YZH辎濡JM-但行#块枚但自足不会斥记趣为CoRRUP1.版院果保存在USHlDUMP_DEST豚询用户TRACE文件中对N讪邛块)我执厅导出发作,会收到相关的SSK版(ORA-OIJ78).卬坏触好会发财根理包括HWM(酩峨)肚的槌、索引中存确械,髅?财睇的极.肝这相娥,料明颇设须燃复修妫耀奸,施卜.酬a方法;旗1:朋侬I怖通过联IOBI施多舸雎导出酬依让Ondc%轴撕的块,10231l0rade的标filft.即位全和喇魁加蝴懿块,只导出包含旧做的JHMZfift三,眦导出的表
6、射招人用我从百触源I)眦IOBI施怀_aplpabks三TBC.1.HRfile=T,BC-1.HIlSQ1.ahSyJtonseicMI0231tracecameCo叱Ufccn,htlIff;2)觑HttniWyft;SQ1.ahJysemsetCCe=10231tractoamccorutfwmrJevdV;方法2:蜩DB电REPAIR祢亩麻饿.ttffiDBMS_RPAIR处耳腋触曲Oraefe做换耳胡掾撕除削浦曲时候会蒯掷潮戈通型:SQ1.EXECDBMSREWHISK1PCORRbHB1.OCKS(U双TAB1.ENAMERAcKUPVAIIDMEDXrAFl1.E12;RMAw炖
7、麒壮湛飘.蛾的贾蟒中包含Backupvalidaitdaarase有时bE么总会或利给说BACKUPVAUDATcCHEeK1.OGICA1.DATABASEARCHIVaoGAU;考点RMAN3. BMR如何恢复坏块?正确答案:如果数据库只有很少的数据块被破坏,那么块介质恢复(BlOCkMediaRecovery,BMR)是较好的块恢复方法。BMR只能用于恢复物理损坏(PhySiCalCorruptions),在数据文件联机时即可恢复相关坏块。BMR主要使用Blockrecover命令恢复坏块,该命令有以下三种使用方式:1)使用aB1.OCKRECOVERCORRUPTION1.lST;”命
8、令恢复在VSDATABASE_B1.OeK.CORRUPTION视图中报告的所有块。2)使用aB1.OCKRECOVERDATEI1.E1B1.OCK10;”命令恢复单个块,需要指定文件号和块号。3)使用B1.OCKRIiCOVERTAB1.ESPACETSJJSERDBAXXX;命令恢熨某个表空间的坏块,需要指定表空间和数据块地址。下面给出几个恢复示例。恢复3个数据文件的损坏块:RmanBlockrecoverdatafile2block12,13datafile3block5,23,24DTFI1.E4B1.OCK20;从数据文件拷贝中恢复一系列块:Blockrecoverdtfile3b
9、lock2,3,4tablespacets_userdb4194405,4194409,4194412fromDATAFI1.ECOPY;从指定的TAG备份中恢复块:RMANblockrecovertablespacesystemdba4194404,4194405fromTAGwweekly-backup*:从用于恢夏数据到两天以前的备份中还原、恢熨SYSTEM表空间中的两个块:RVANblockrecoverTAB1.ESPACEsystemdba4194404,4194405restoreUNTI1.TIME,sysdate-2,:运行备份验证数据库,修复在V$DATABASEB1.OC
10、KCoRRUpTION中记录的所有损坏块:RMANBCKUPVA1.IDATEDATABASE;RMNB1.OCKRECOVERCORRUPTION1.IST:考点RMAN4. 如何确定坏块的对象名?正确答案:根据绝;寸工件号和块号确定数据块对象的SQ1.语句如下:SE1.ECTTAB1.ESPACE_NAME,SEGMENTjrYPE,OWNER,SEGMENT_NAME,PARTITION_NAMEFROMDBA_EXTENTSWHEREFI1.E_ID=&FI1.E_IDAND&BI.OCK_IDBETWEENB1.OCK,IDANDB1.OCK,ID+B1.OCKS-1;如下的SQ1.
11、可以确定段苫用的数据块:SE1.ECTDBMSROWID.ROWIDOBJECT(ROWID)OBJECTID,DBMSROWID.ROWIDRE1.ATIVEFNO(ROWID)FI1.E_ID,DBMS_RoWID.ROWID_B1.OCK_NUMBER(ROWID)B1.OCKID,COUNT(I)COUNTSFROM1.HK.T_BC_1.HRDGROUPBYDBMS_ROWID.ROWID_OBJECT(ROWlD),DBMS_ROWID.ROW1D_RE1.ATIVE_ENO(ROWID),DBMS_ROWID.ROWTD_B1.OCK一NUMBER(ROWID)ORDERBYDB
12、MS.ROWID.ROWID_B1.OCK_NUMBER(ROWID);关于坏块需要注意以下几点:D对于受损的数据块,仅仅坏块上的数据无法被查询或读取,其余正常块的数据依旧可以使用。2)对于受损的表对象进行聚合等相关运算时会收到错误提示,因为坏块上的数据无法被统计。3)可以基于RMAN的备份文件实现块介质恢复,其数据文件无须OFF1.INE,开销最小,影响最小。4)对于多个数据块的损坏,先执行BACKUPVA1.lDATE校验数据库或相应的数据文件以便标记受损的坏块后,填充V$DATABASE_B1.OCK工ORRUPTloN后再使用命令B1.OCKREcovERCORRUpTION1.IST
13、;一次性恢复所有的坏块。5)在缺省情况下,存在坏块的数据文件无法成功备份,也会导致自动备份脚本失败。考点RMAN5. 如果发现有坏块,那么如何检索其他未坏的数据?正确答案:首先需要找到坏块的ID(dbv工具可以实现),假设坏块ID为VBID,文件编号为VFID.运行下面的SQ1.语句查找段名:SE1.ECTSEGMENT_NAME,SEGMENT_TYPE,EXTENT_1D,B1.OCK_ID,B1.OCKSEROMDBA_EXTENTSTWHEREFI1.F-ID=ANDBETWEENB1.OCK,11)AND(B1.OCK,ID+B1.OCKS-1);找到标块所属的段名称,若段是一个表,
14、则最好建立一个临时表,存放好的数据;若段是索引,则删除它,再重:建.CREATETAB1.EGOOD_TAB1.EASSE1.ECTFROMBADAB1.EWHEREROWIDNOTIN(SE1.ECTROWIDFROMBAD.TAB1.EWHERESUBSTR(ROWIf)t10,6)=);还可以使用诊断事件10231设置在全表扫描时跳过坏块,如下:SQ1.A1.TERSYSTEMSETEVENTS,10231tracenamecontextforever,level10;然后创建一个临时表GooDJAB1.E,将原表中除坏块的数据都检索出来:SQ1.CREATETAB1.EGoODJTAB
15、1.ESSE1.ECT*FROMBADJAB1.E;最后关闭诊断事件:SQ1.A1.TEKSYSTEMSETEVENTS,10231TRACENAMECONTEXTOFF;事件10231的说明如下:oraclerhel61hr-$OeRROK1023110231,00000,skipcorruptedblockson_table_scans_*/*Action:suchblocksareskippedintablescans,andlistedintracefiles关于ROwID的结构,还nJ以参考DBvSROWlD.ROWIDCREATE函数。考点RMAN6. 1.ogMiner是什么?其有哪些用途?正确答案:1.ogMiner工具可以轻松获得Kedo日志文件(包含归档日志文件)中的具体内容,特别是该工具可以分析出所有对于数据库的DM1.操作(INSERT、UPDATE、DE1.ETE等)语句。Oracle9i后还可以分析DD1.语句,另外还可分析得到些必要的回滚SQ1.