Skip to content

坏块 - 2. page

关于rowid的基础常识

后面的更新文章会以坏块修复以及异常恢复为主,期间会用到不少的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)