一、概念介绍
rdba是Oracle数据块头部offset 4~7的一个结构,大小为4 bytes,由表空间相对文件号(tablespace relative file numbers)和块号2部分组成。本文主要说明以下问题,
1、 FILE#(File identification number):数据文件标识,database级;
2、 RFILE#(Tablespace relative datafile number):表空间相对文件号,tablespace级;
3、 File#取值范围为:1~65533;
4、 RFILE#的取值范围为: 1~1023,大于1023时重置为1保持表空间内;
5、 当file#<1024时,file#=rfile#,否则file#自增,rfile重置为1自增;
6、 rdba由4 bytes组成,共32 bits,offset 22~31(10 bits)表示RFILE#,offset 0~21(22 bits)表示:block#;
7、 Oracle Physical Database Limits中(Database files Maximum per tablespace Operating system dependent; usually 1022),2^10 = 1024-1(去掉0),所以rfile#在单个表空间内多1023个,官方文档和mos中提到的1022,有点不准确;
8、 分享os层rdba解析工具,方便大家解析rdba和dump数据块,工具下载方法:请关注公众号,回复“rdba”。
对文章内容有疑问的欢迎留言讨论,感谢您的阅读,如果您觉得有所收获,也欢迎把文章分享给您的朋友。
二、RDBA结构解析
alter session settracefile_identifier='orastar_hdrseg_after_trunc_10';
oradebug setmypid
alter system dump datafile 5 block 130;
oradebug close_trace
oradebug tracefile_name
***头部信息如下,
buffer tsn: 6 rdba: 0x01400082 (5/130)
scn: 0x0000.00347db2 seq: 0x01 flg: 0x04tail: 0x7db22301
frmt: 0x02 chkval: 0xfd95 type:0x23=PAGETABLE SEGMENT HEADER
图1 rdba结构解析
小结:
1、 rdba由4 bytes组成,共32 bits,offset 22~31(10 bits)表示 RFILE#,offset 0~21(22 bits)表示:block#。
三、RFILE#的取值范围
create tablespace hsql datafile'/oradata/epmsn/hsql1.dbf' size 1024k autoextend off;
spool /home/oracle/cr_tb.sql
set serveroutput on
DECLARE
c_sql varchar2(100) := '';
begin
for i in 2..1030 loop
c_sql := 'alter tablespace hsql adddatafile '||'''/oradata/epmsn/hsql'||i||'.dbf'' size 1024K;';
dbms_output.put_line(c_sql);
end loop;
end;
/
@cr_tb.sql
Tablespace altered.
alter tablespace hsql add datafile'/oradata/epmsn/hsql1024.dbf' size 1024K
*
ERROR at line 1:
ORA-01686: max # files (1023) reached forthe tablespace HSQL
1000 1000/oradata/epmsn/hsql995.dbf 6
1001 1001/oradata/epmsn/hsql996.dbf 6
1002 1002/oradata/epmsn/hsql997.dbf 6
1003 1003/oradata/epmsn/hsql998.dbf 6
1004 1004/oradata/epmsn/hsql999.dbf 6
1005 1005/oradata/epmsn/hsql1000.dbf 6
1006 1006/oradata/epmsn/hsql1001.dbf 6
1007 1007/oradata/epmsn/hsql1002.dbf 6
1008 1008/oradata/epmsn/hsql1003.dbf 6
1009 1009/oradata/epmsn/hsql1004.dbf 6
1010 1010/oradata/epmsn/hsql1005.dbf 6
1011 1011/oradata/epmsn/hsql1006.dbf 6
1012 1012/oradata/epmsn/hsql1007.dbf 6
1013 1013/oradata/epmsn/hsql1008.dbf 6
1014 1014/oradata/epmsn/hsql1009.dbf 6
1015 1015/oradata/epmsn/hsql1010.dbf 6
1016 1016/oradata/epmsn/hsql1011.dbf 6
1017 1017/oradata/epmsn/hsql1012.dbf 6
1018 1018/oradata/epmsn/hsql1013.dbf 6
1019 1019/oradata/epmsn/hsql1014.dbf 6
1020 1020/oradata/epmsn/hsql1015.dbf 6
1021 1021/oradata/epmsn/hsql1016.dbf 6
1022 1022 /oradata/epmsn/hsql1017.dbf 6
1023 1023/oradata/epmsn/hsql1018.dbf 6
1024 1 /oradata/epmsn/hsql1019.dbf 6
1025 2 /oradata/epmsn/hsql1020.dbf 6
1026 3 /oradata/epmsn/hsql1021.dbf 6
1027 4 /oradata/epmsn/hsql1022.dbf 6
1028 6 /oradata/epmsn/hsql1023.dbf 6
1028 rows selected.
SQL>
SQL> select ts#,count(1) from v$datafilegroup by ts#;
TS# COUNT(1)
---------- ----------
1 1
6 1023
2 1
4 2
0 1
SQL>
小结:
1、 FILE#(File identification number):数据文件标识,database级;
2、 RFILE#(Tablespace relativedatafile number):表空间相对文件号,tablespace级;
3、 File#取值范围为: 1~65533;
4、 RFILE#的取值范围为: 1~1023,大于1023时重置为1保持表空间内;
5、 当file#<1024时,file#=rfile#,否则file#自增,rfile重置为1自增;
6、 rdba由4 bytes组成,共32 bits,offset 22~31(10 bits)表示 RFILE#,offset 0~21(22 bits)表示:block#;
7、 Oracle Physical Database Limits中(Database filesMaximumper tablespace Operating systemdependent; usually 1022),2^10 = 1024-1(去掉0),所以rfile#在单个表空间内多1023个,官方文档和mos中提到的1022,有点不准确。
四、os层rdba解析工具
mkdir -p /home/oracle/orastar
mv ora_rdba /home/oracle/orastar
export PATH=/home/oracle/orastar/:$PATH
五、说明
1、以上内容为个人多次测试结果,由于个人原因,如有分析不足之处还请见谅及指正。
2、文章涉及内容,请勿在生产环境模拟。
纸上得来终觉浅,绝知此事要躬行。--陆游
感谢您的阅读,如果您觉得有所收获,也欢迎把文章分享给您的朋友。