后面的更新文章会以坏块修复以及异常恢复为主,期间会用到不少的rowid,这里简要的把rowid的寄出常识过一遍。
我们从rowid伪列里select出来的rowid是基于base64编码,一共有18位,分为4部分:
OOOOOOFFFBBBBBBRRR
在此rowed的结构中可以分为以下4类解析:
1.
OOOOOO: 六位表示data object id,根据object id可以确定segment。
2.
FFF: 三位表示相对文件号。根据该相对文件号可以得到绝对文件号,从而确定datafile。
3.
BBBBBB:六位表示data block number。这里的data block number是相对于datafile的编号,而不是相对于tablespace的编号。
4.
RRR:三位表示row number.
Oracle提供了dbm_rowid来进行rowid的一些转换计算.
SQL> select rowid from luda.t1 where rownum <2; ROWID ------------------ AAANfEAAEAAAEicAAA
通过dbms_rowid包可以查询rowid对应的信息,示例如下:
select dbms_rowid.rowid_object(AAANfEAAEAAAEicAAA) obj#, dbms_rowid.rowid_relative_fno(AAANfEAAEAAAEicAAA) rfile#, dbms_rowid.rowid_block_number(AAANfEAAEAAAEicAAA) block#, dbms_rowid.rowid_row_number(AAANfEAAEAAAEicAAA) row#, dbms_rowid.rowid_to_absolute_fno(rowid,'LUDA','T1') file# from luda.t1;
具体使用方法可以参考以下文档:
PACKAGE DBMS_ROWID Specification (文档 ID 67639.1)
HOW TO USE DBMS_ROWID PROCEDURE AND FUNCTIONS (文档 ID 1057891.6)