好奇心是我们学习过程中最好的老师,对于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~32(10 bits)表示 RFILE#,offset 0~21(22 bits)表示:block#。
复制
图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~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,有点不准确。
复制
问题三、如何通过程序解析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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
ora_rdba工具能提供一下吗
3年前

评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1322次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
793次阅读
2025-03-17 11:33:53
Oracle+Deepseek+Dify 实现数据库数据实时分析
bicewow
724次阅读
2025-03-06 09:41:49
Oracle避坑指南|同名表导出难题:如何精准排除指定用户下的表?
szrsu
558次阅读
2025-03-05 00:42:34
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
465次阅读
2025-03-13 14:38:19
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
356次阅读
2025-03-12 21:27:56
Oracle DataGuard高可用性解决方案详解
孙莹
314次阅读
2025-03-26 23:27:33
Oracle分区和执行计划相关的几个问题
听见风的声音
308次阅读
2025-03-07 08:51:42
数据库管理-第299期 数据库是否需要定期重启(20250306)
胖头鱼的鱼缸
250次阅读
2025-03-06 09:09:35
切换Oracle归档路径后,不能正常删除原归档路径上的归档文件
dbaking
247次阅读
2025-03-19 14:41:51
热门文章
oracle drop table purge无备份bbed恢复
2021-01-25 6643浏览
20230704_一键安装Oracle11g/19C/21C_单机/RAC集群/standalone/PostgreSQL_工具分享_开放源码
2021-11-04 5180浏览
20211119_一键安装Oracle 21C RAC_1731秒完成
2021-11-19 4781浏览
Oracle异常恢复_ORA-01189: file is from a different RESETLOGS than previous files
2021-08-11 4181浏览
Oracle Drop Table Purge后plsql恢复方法
2021-01-26 3750浏览