ITPub博客

首页 > 数据库 > Oracle > DSI401-Oracle块与分析

DSI401-Oracle块与分析

原创 Oracle 作者:brotherxiao 时间:2007-01-04 17:46:02 0 删除 编辑
课程目标
1、在操作系统级别dump oracle block
2、解释格式化的dump结果
3、识别oracle块中的关键数据结构
4、收集解释相关的诊断信息
5、采取合适的恢复策略[@more@]

数据块
数据库存储单元,对应物理数据库磁盘上指定的字节数。空间分配以块为基本单位。
数据库创建后,块大小不能修改。典型大小为2k,4k,8k,16k,最大值与操作系统相关。

数据块结构
oracle数据块包括三层:cache layer,transaction layer,data layer。
cache layer包含信息:块格式,类型及序列数据。transaction layer包含事务信息。cache header提供损坏数据检查信息,确保数据块被正确的读写。

ROWID与块DUMP
ROWID是指向块中特定行的指针。可用于提取数据块的文件号和快号。当数据具有索引,
索引块包含了每一行的ROWID,或者其他方式访问数据块失败时,可通过ROWID访问数据块。
ROWID格式:Oracle8i和9i使用扩展ROWID数据类型。扩展ROWID能有效的识别分区表和索引行。扩展ROWID使用64进制(A-z,0-9,+,/)编码。
OOOOOOFFFBBBBBBSSS
O:Data object number,F:Relative file number, B:block number,S:slot(row) number

DBMS_ROWID包
DBMS_ROWID可获取ROWID相关信息,例如获取数据块号,对象号等。在saloris可使用工具rowid解析ROWID。

Oracle块dump
在unix操作系统上可使用dd作二进制dump。
dd bs=db_block_size if=dbfile.dbf skip=(block-1) count=3|od -xv >file.out

块损坏
无论什么时候,数据库从磁盘上读写数据块时将作进行一致性检查。检查项目包括块版本,DBA值与缓冲区中的DBA值进行比较。block_checksum(if enabled)。
SCNbase,seq number,block type--头尾信息将进行校验。典型的600错误:
ora-600(4519): cache layer block type错误
ora-600(4136):检查回滚段块
ora-600(4154):检查回滚段块

块损坏类型
媒体损坏:scn=0
软件损坏:scn=xxx,seq=UB1MAXVAL,XXX表示更高的scn号,在重建该块后可应用于该块。

ora-1578
通常1578是硬件错误的结果,如果带有相同参数的1578错误发生,很可能是物理损坏引起。如果参数每次改变,则可能存在硬件问题,应该检查内存,交换区及磁盘控制器。如果你知道十进制块号,则可以通过dd尝试dump该块,如果失败说明有物理损坏

ora-600
ora-600[kcbzpb_1],--内部错误,引用源代码模块名
[d],块号
[kind],损坏类型
[chk] checksum标志
错误表示块在内存中发生损坏。

处理坏块
1、检查alert.log和system log 文件
2、采用可用的诊断工具判断损坏类型
3、采用dump来识别问题
4、多次检查以确定损坏是否永久性的。
5、如果需要,恢复数据

DBVERIFY
检查块一致性(仅对数据文件有效),建议在关闭状态下进行,因为内存中块可能重新引起损坏.dbverify采用标准的KCB方法检查块的一致性,如果块头和尾不匹配,DBV重读该块信息,如果匹配则报告分列块,如果不匹配泽报告损坏。
注意DBVERIFY只能检查逻辑损坏,对于HWM以上的块损坏无能为力。
Analyze
进行逻辑检查,仅报告不标记坏块,验证索引与表的逻辑一致性。对于分区表,将验证行是否属于相应的分区,如果错误,rowid将插入到invalid_rows。最简单的可以通过select * from

做一个全表扫描读取所有hwm之前的数据块,可快速检查当前表数据的坏块情况。在ASSM下,分析将验证HWM下的位图信息。

诊断事件
10231:在全表扫描中跳过坏快
10233:在索引范围扫描中跳过损坏数据或索引块。
10232:在trace文件中dump坏块。
10210:强制逻辑块检查,无论什么时候数据块被修改都将进行一致性检查,坏块被标识为soft corrupt
10211:与10210相同(对索引块)
10212:于10210相同(对簇块)
注意:这些事件非常消耗资源,如果再检查做发现坏块,标记为损坏后,块中的数据即丢失。

Flash Freeze--快速冻结
9i提供的新特性,允许在遇到用户定义事件后快速冻结实例.从而提供更进一步的诊断.目前不支持RAC多实例冻结。eg:event="600 flashfreeze on error 1301,proc=PMON"

初始化参数db_block_checking
从8i后引入,可在会话或系统级别引入,用来代替10210,10211,10212事件,默认值为false.
db_block_checking初始化参数调用了与10210,10211,10212事件相同的检查方式,即在数据块

db_block_checking 是当block发生任何变化的时候进行逻辑上的完整性和正确性检查.检查项包块scn base,seq,block type,块头与快尾比较以保证块的逻辑一致性.
db_block_checksum 是在DBW0或loader将数据块写到数据文件的时候对block内数据计算一个校验值写入块头(cache header),当下次读取时时候重新计算并校验,如果不同则认为是块损坏。通常用于验证OS或硬件损坏。从8i开始设置为true的时候也同时对log block进行校验。

_CHECK_BLOCK_AFTER_CHECKSUM
如果这个参数设置为true,在校验计算完成后将调用块检查,如果块检查失败,则调用者(通常是dbw)江失败,块不能写入磁盘。这种情况将导致实例崩溃。这个参数的默认值为true.
在下面的情况下DBW0将调用块检查:
1、_db_always_check_system_ts=true并且块在system表空间
2、db_block_checking=true

Export工具
完全导出可用于检查数据库一致性,包括逻辑和物理一致性.export读取部分数据字典信息,进行全表扫描提取数据。但不能检测系统表空间,高水位以上的坏快,索引和临时分区里的坏快。

媒体恢复
如果数据库运行在归档模式,可通过下面的方式进行恢复:
解决硬件问题;
判断那些数据文件有坏快
恢复数据文件备份
作媒体恢复

块恢复
9i引入的新的恢复选项,可有效降低平均恢复时间,提高可用性。块是恢复的最小单元。
RMAN>bockrecover datafile 5 block 1713;

损坏对象
如果你不打算进行媒体恢复,可以通过错误信息提供的文件号和块号,在dba_extents中获取相关对象信息.
如果是索引对象,只需要删除并重建或在线重建.
回滚段:参见第四章
表:坏块中的数据将丢失.可选的处理方法:
删除并重建表,从exp备份中导出;
设置10231事件跳过坏块,然后使用exp导出,删除并重建表。或是使用sql/plsql提取到另外一张表中。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/131257/viewspace-888379/,如需转载,请注明出处,否则将追究法律责任。

下一篇: Alipay面试记(一)
请登录后发表评论 登录
全部评论
  • 博文量
    6
  • 访问量
    52281