暂无图片
暂无图片
7
暂无图片
暂无图片
暂无图片

从问题出发,解密Oracle rdba结构

原创 惠星星 2021-07-23
3259

好奇心是我们学习过程中最好的老师,对于Oracle的研究和学习也是如此,在遇到未知的问题时要善于提出why,本小节将从问题出发,和大家一起解密Oracle rdba结构。rdba 是Oracle数据块头部offset 4~7的一个结构,大小为4 bytes,由表空间相对文件号(tablespace relative file numbers,简称rfile#)和块号(简称block#)2部分组成。

问题一、rdba是如何转换为rfile#和block#?

Oracle内部是如何将4 bytes的rdba转换rfile#和block#两个值呢?这是一个问题,首先使用Oracle dump工具转储数据块, alter session set tracefile_identifier='orastar_rdba '; oradebug setmypid alter system dump datafile 5 block 130; oradebug close_trace oradebug tracefile_name 在dump的输出文件中,数据块头部信息如下, buffer tsn: 6 rdba: 0x01400082 (5/130) scn: 0x0000.00347db2 seq: 0x01 flg: 0x04 tail: 0x7db22301 frmt: 0x02 chkval: 0xfd95 type: 0x23=PAGETABLE SEGMENT HEADER 对rdba: 0x01400082 (5/130)进行二进制分析,详细分析内容见下图,至此该问题的答案已经非常清晰。 问题答案:rdba由4 bytes组成,共32 bits,offset 22~3210 bits)表示 RFILE#,offset 0~2122 bits)表示:block#。

image.png

图1 rdba结构解析

在完成rdba结构解析后,作者对RFILE#产生了一些疑问。

问题二、RFILE#和FILE#到底有什么区别,取值范围是多少呢?

对于该问题我们通过实验分析, SQL> 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 add datafile '||'''/oradata/epmsn/hsql'||i||'.dbf'' size 1024K;'; dbms_output.put_line(c_sql); end loop; end; / SQL> @cr_tb.sql Tablespace altered. SQL>alter tablespace hsql add datafile '/oradata/epmsn/hsql1024.dbf' size 1024K ERROR at line 1: ORA-01686: max # files (1023) reached for the tablespace HSQL SQL> select ts#,count(1) from v$datafile group by ts#; TS# COUNT(1) ---------- ---------- 1 1 6 1023 2 1 4 2 0 1 SQL> 通过以上实验结果和查询Oracle官方文档,我们可以总结以下知识点: 1、 FILE#(File identification number):数据文件唯一标识,database级唯一。 2、 RFILE#(Tablespace relative datafile number):表空间相对文件号,tablespace级唯一。 3、 File#取值范围为: 1~655334、 RFILE#的取值范围为: 1~1023,大于1023时重置为1保持表空间内唯一。 5、 当file#<1024时,file#=rfile#,否则file#自增,rfile重置为1自增。 6、 rdba由4 bytes组成,共32 bits,offset 22~3110 bits)表示 RFILE#,offset 0~2122 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,有点不准确。

问题三、如何通过程序解析rdba结构?

作者使用C语言解析rdba结构,程序伪代码如下所示, *********程序开始ora_rdba.c unsigned int rfn = rdba>>22; unsigned int blk = (rdba<<10)>>10; printf("rdba is: %#08x\n",rdba); printf("datafile# is: %d\n",rfn); printf("datablock is: %d\n",blk); printf("dump command:alter system dump datafile %d block %d;\n",rfn,blk); *********程序结束 使用操作系统解析工具ora_rdba,进行rdba结构解析, [oracle@sourcedb ~]$ ora_rdba 0x01400082 *******Welcome to use ora_rdba tool authored by orastar.******* *******weixin: xidoublestar******* rdba is: 0x1400082 datafile# is: 5 datablock is: 130 dump command:alter system dump datafile 5 block 130; [oracle@sourcedb ~]$
最后修改时间:2021-07-27 09:14:26
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论