首页 > 数据库 > Oracle > DSI401-Oracle块与分析
数据块
数据库存储单元,对应物理数据库磁盘上指定的字节数。空间分配以块为基本单位。
数据库创建后,块大小不能修改。典型大小为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