ORACLE中段的HEADER_BLOCK示例详析_Oracle_数据库_码蚁之家_www.codes51.com
返回首页
专题
网络编程
ASP教程 .NET教程 PHP教程 JSP教程 C#教程 Java教程 Delphi教程 VB教程 C/C++教程 Android开发 IOS开发 Windows Phone开发 Python教程 Ruby教程 移动开发 其他编程教程
网页制作
HTML教程 CSS教程 Dreamweaver教程 FrontPages教程 Javascript教程 web前端
数据库
SqlServer MySql Oracle Access DB2 SQLite 其他数据库
图形设计
photoshop教程 Fireworks教程 CorelDraw教程 Illustrator教程 AutoCad教程 FLASH教程
操作系统
Windows xp教程 Windows 7教程 Windows 8教程 Windows 2003教程 Windows Server 2008教程 Linux教程 Windows 10
网站运营
建站经验 SEO优化 站长心得 网赚技巧 网站推广 站长故事
手机学院
手机速递 安卓教程 iphone教程 手机评测 手机技巧 手机知识 手机应用 手机游戏 手机导购
网店宝典
开店指导 开店经验 网店装修 网店推广 网店seo 网购技巧
软件教程
办公软件 系统工具 媒体工具 压缩工具 图文处理 文件管理
范文之家
自我介绍 自我鉴定 写作模板 合同范本 工作总结 贺词祝福语 演讲致辞 思想汇报 入党申请书 实习报告 心得体会 工作计划 简历模板 工作报告 导游词 评语寄语 口号大全 策划书范文
信息工程
软件工程 企业开发 系统运维 软件测试
移民之家
移民动态 移民政策 移民百科 移民生活 技术移民 投资移民
知识大全
母婴 数码 摄影 装修 美文 常识 时尚 婚嫁 美食 养生 旅游 兴趣 职场 教育 文学 健康
问答大全
电脑网络 手机数码 QQ专区 生活 游戏 体育运动 娱乐明星 休闲爱好 文化艺术 社会民生 教育科学 健康医疗 商业理财 情感家庭 地区问题 其他
编程问答
IOS Android .NET Java C/C++ Delphi VC/MFC 其他语言 PHP MSSQL MYSQL Oracle 其他数据库 Web开发 Windows Linux 硬件/嵌入开发 网络通信 移动开发 云计算 企业IT 游戏开发
笑话大全
幽默笑话 爱情笑话 成人笑话 校园笑话 爆笑笑话 综合笑话 古代笑话 现代笑话 国外笑话

ORACLE中段的HEADER_BLOCK示例详析(1/3)

来源:互联网  时间:2018/9/24 1:17:40

前言

段(segment)是一种在数据库中消耗物理存储空间的任何实体(一个段可能存在于多个数据文件中,因为物理的数据文件

是组成逻辑表空间的基本物理存储单位)

最近在学习段(segment)、区间(extent)时,对段的HEADER_BLOCK有一些疑问,本文记录一下探究的实验过程以及相关总结,,如有不对的地方,敬请指出。以SCOTT.EMP表为例(下面测试环境为Oracle Database 10g Release 10.2.0.5.0 - 64bit Production):

SELECT FILE_ID, 
  BLOCK_ID, 
  BLOCKS 
FROM DBA_EXTENTS 
WHERE OWNER ='&OWNER'
  AND SEGMENT_NAME = '&TABLE_NAME'; 

 

SELECT HEADER_FILE
  , HEADER_BLOCK
  , BYTES
  , BLOCKS
  , EXTENTS 
FROM DBA_SEGMENTS 
WHERE OWNER='&OWNER' AND SEGMENT_NAME='&SEGMENT_NAME';

如上所示,DBA_SEGMENTS 中的HEADER_BLOCK 与DBA_EXTENTS的BLOCK_ID不同(HEADER_BLOCK:文件ID为4的第27个块,区间的第一个块的BLOCK_ID为第25个块),这个的原因如下:

一个segment的第一个区的第一个块是FIRST LEVEL BITMAP BLOCK,第二个块是SECOND LEVEL BITMAP BLOCK,这两个块是用来管理free block的,第三个块是PAGETABLE SEGMENT HEADER,这个块才是segment里的HEADER_BLOCK,再后面的块就是用来记录数据的。所以25+2=27. 详细可以参考《循序渐进ORCLE:数据库管理、优化与备份》这本书的第5章。

下面我们创建一个表,测试一下是否也是这个规律,如下所示:

SQL> CREATE TABLE TEST1.MMM 
 2 AS
 3 SELECT * FROM DBA_OBJECTS;
 
Table created.
 
SQL> COL SEGMENT_NAME FOR A32;
SQL> SELECT SEGMENT_NAME
 2   ,FILE_ID
 3   ,BLOCK_ID
 4   ,BLOCKS
 5 FROM DBA_EXTENTS 
 6 WHERE SEGMENT_NAME='MMM' AND OWNER='TEST1'
 7 ORDER BY BLOCK_ID ASC;
 
SEGMENT_NAME      FILE_ID BLOCK_ID  BLOCKS
-------------------------------- ---------- ---------- ----------
MMM          76   9   8
MMM          76   17   8
MMM          76   25   8
MMM          76   33   8
MMM          76   41   8
MMM          76   49   8
MMM          76   57   8
MMM          76   65   8
MMM          76   73   8
MMM          76   81   8
MMM          76   89   8
 
SEGMENT_NAME      FILE_ID BLOCK_ID  BLOCKS
-------------------------------- ---------- ---------- ----------
MMM          76   97   8
MMM          76  105   8
MMM          76  113   8
MMM          76  121   8
MMM          76  129   8
MMM          76  137  128
MMM          76  265  128
MMM          76  393  128
MMM          76  521  128
MMM          76  649  128
MMM          76  777  128
 
22 rows selected.
 
SQL> SELECT HEADER_FILE
 2  , HEADER_BLOCK
 3  , BYTES
 4  , BLOCKS
 5  , EXTENTS 
 6 FROM DBA_SEGMENTS 
 7 WHERE OWNER='TEST1' AND SEGMENT_NAME='MMM';
 
HEADER_FILE HEADER_BLOCK  BYTES  BLOCKS EXTENTS
----------- ------------ ---------- ---------- ----------
   76   11 7340032  896   22

如上所示,段对象TEST1.MMM的header_block为11 ,而对应的区间的第一个块对象ID为9, 也是9+2=11,确实是如此,那么我们来DUMP数据块看看,如下所示

SQL> alter system dump datafile 76 block 9;
 
System altered.
 
SQL> alter system dump datafile 76 block 10;
 
System altered.
 
SQL> alter system dump datafile 76 block 11;
 
System altered.
 
SQL> select user_dump.value 
 2   || '/' 
 3   || lower(instance.value) 
 4   || '_ora_' 
 5   || v$process.spid 
 6   || nvl2(v$process.traceid, '_' 
 7         || v$process.traceid, null) 
 8   || '.trc'"trace file" 
 9 from v$parameter user_dump 
 10   cross join v$parameter instance 
 11   cross join v$process 
 12   join v$session 
 13   on v$process.addr = v$session.paddr 
 14 where user_dump.name = 'user_dump_dest' 
 15   and instance.name = 'instance_name' 
 16   and v$session.audsid = sys_context('userenv', 'sessionid'); 
 
trace file
--------------------------------------------------------------------------------
/u01/app/oracle/admin/SCM2/udump/scm2_ora_22642.trc

第一个区的第一个块(block_id=9)是FIRST LEVEL BITMAP BLOCK,第二个块(block_id=10)是SECOND LEVEL BITMAP BLOCK,这两个块是用来管理free block的,第三个块(block_id=11)是PAGETABLE SEGMENT HEADER,这个块才是segment里的HEADER_BLOCK,再后面的块就是用来记录数据的


上一篇数据库学习资料分享
下一篇ORACLE检查找出损坏索引Corrupt Indexes的方法详解
明星图片
相关文章
《 ORACLE中段的HEADER_BLOCK示例详析》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)