ORACLE关于段的HEADER_BLOCK的一点浅析

在学习段(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,再后面的块就是用来记录数据的

 

不过有一个奇怪的现象,对SCOTT.EMP其数据块做dump,发现25、26、27数据块的type都是trans data,0x06表示的Block Type为 Table/cluster/index segment data block 。 不知是否因为SCOTT.EMP对象位于USERS表空间下的缘故。不过USER表空间也是ASSM管理的。具体情况尚不清楚?

 

SQL> SELECT TABLESPACE_NAME
  2       , SEGMENT_SPACE_MANAGEMENT
  3       , ALLOCATION_TYPE
  4       , EXTENT_MANAGEMENT
  5  FROM DBA_TABLESPACES
  6  WHERE TABLESPACE_NAME='USERS';
 
TABLESPACE_NAME                SEGMEN ALLOCATIO EXTENT_MAN
------------------------------ ------ --------- ----------
USERS                          AUTO   SYSTEM    LOCAL

 

 

那么是否所有的HEADER_BLOCK都是位于段的第三个block呢?是否还跟段空间管理的方式有关呢? 我们用如下实验来探究一下:创建一个手工段空间管理(Manual Segment Space Management)的表空间。

 

SQL> CREATE TABLESPACE TBS_TEST_DATA
  2  DATAFILE '/u03/oradata/gsp/tbs_test_data_001.dbf'
  3  SIZE 20M 
  4  EXTENT MANAGEMENT LOCAL AUTOALLOCATE
  5  SEGMENT SPACE MANAGEMENT MANUAL ONLINE;
 
Tablespace created.
 
 
SQL> create user test identified by test123456
  2  default tablespace tbs_test_data;
 
User created.
 
SQL> grant connect, resource to test;
 
Grant succeeded.
 
SQL> CREATE TABLE TEST.KKK    
  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='KKK' AND OWNER='TEST'
  7  ORDER BY BLOCK_ID ASC;
 
SEGMENT_NAME                        FILE_ID   BLOCK_ID     BLOCKS
-------------------------------- ---------- ---------- ----------
KKK                                      39     427785        128
KKK                                      43     435249          8
KKK                                      43     435257          8
KKK                                      43     435265          8
KKK                                      43     435273          8
KKK                                      43     435281          8
KKK                                      43     435289          8
KKK                                      43     435297          8
KKK                                      43     435305          8
KKK                                      43     435313          8
KKK                                      43     435321          8
 
SEGMENT_NAME                        FILE_ID   BLOCK_ID     BLOCKS
-------------------------------- ---------- ---------- ----------
KKK                                      43     435329          8
KKK                                      48     436745          8
KKK                                      48     436753          8
KKK                                      48     436761          8
KKK                                      48     436769          8
KKK                                      48     436777          8
KKK                                      48     436873        128
KKK                                      40     444297        128
KKK                                      43     447241        128
KKK                                      52     449545        128
KKK                                       2     458249        128
 
22 rows selected.
 
SQL> SELECT HEADER_FILE
  2       , HEADER_BLOCK
  3       , BYTES
  4       , BLOCKS
  5       , EXTENTS 
  6  FROM DBA_SEGMENTS 
  7  WHERE OWNER='TEST' AND SEGMENT_NAME='KKK';
 
HEADER_FILE HEADER_BLOCK      BYTES     BLOCKS    EXTENTS
----------- ------------ ---------- ---------- ----------
         43       435249    7340032        896         22
 
SQL> 

 

SQL> alter system dump datafile 43 block 435249;
 
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_27792.trc

 

如下所示,块类型为DATA SEGEMENT HEADER -UNLIMITED , rdba:( segment header的块地址为)为 0x0ac6a431 .其实这是第一个块(不是以block_id大小来看),因为手工段空间管理,这种技术的具体实现方式是通过在段头(Segment Header)分配自由列表(freelist)来管理Block的使用。简单一点,你可以把自由列表想象成一个数据结构中的链表一样的数据结构,ORACLE通过一系列算法向自由列表(freelist)中加入或移出Block来实现段管理。

 

image

 

Segment Header是一个Segment的第一个extent的头块(第一个块)。在FLM管理的Segment中,header block始终是segment 的第一个块。 如下所示,在Extent Map中,第一个区间的地址为0x0ac6a432, 恰恰跟segment header的块地址 0x0ac6a431 相差为1,这意味着后面的分配是紧挨着segment header的块地址。 所以在手工段空间管理(Manual Segment Space Management)的表空间,不能以block_id的大小顺序来看区间分配顺序。也就是说FILE_ID=39 BLOCK_ID=427785的块并不是第一个区间的第一个块。这也是我在实验当中纠结了好久的地方。

 

image

 

参考资料:

 

http://blog.chinaunix.net/uid-7628732-id-119768.html

http://www.eygle.com/archives/2007/07/oracle_assm_level3_bmb.html

《循序渐进ORACLE:数据库管理、优化与备份》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【源码探索】.NET中的List,为什么即有Count属性又有Count()方法

“优秀的程序员的标准之一是&#xff1a;编写更易于扩展的代码”图片&#xff1a;奥森公园的向日葵 拍摄于2022年7月23日01—问题缘起上一篇中&#xff0c;我们知道List<T>的是基于数组实现的可变长度的列表。很多小伙伴发现&#xff0c;List<T>即有Count属性又有C…

使用ASP.NET广告控件的XML语言创建广告链接--ASP.NET

1、AdRotator广告控件的所有属性都是可选的&#xff0c;XML文件中可以包含如下表所示的属性&#xff08;XML文件的广告属性&#xff09;。 属性 说明 ImageUrl 要显示的图像的URL NavigateUrl 单击AdRotator控件时要转到的网页URL AlternateText 图像不可用时现实的问…

vim编辑和命令模式、实践

2019独角兽企业重金招聘Python工程师标准>>> 9月29日任务 5.5 进入编辑模式 5.6 vim命令模式 5.7 vim实践 Vim编辑模式 进入编辑模式 操作 说明 i 在光标所在字符前插入内容 I 在光标所在行行首插入内容 a 在光标所在字符后插入内容 A 在光标所在行行尾插入…

英语自动提取高频词_斑马英语提分营免费体验课

斑马英语电脑版是一款专业可靠的英语学习软件&#xff0c;斑马英语官方版可以帮助孩子学习纯正的英语口语发音&#xff0c;以讲故事的形式让孩子学习单词及口语练习&#xff0c;斑马英语电脑版针对儿童语言特征设计的智能口语测评系统&#xff0c;能够自动识别发音和评分&#…

【C# Personal Handbook】开篇

博客已提更一年多了&#xff0c;这段时间里&#xff0c;发生了很多事情&#xff0c;也让我对C#更加依恋&#xff0c;所以我决定重新更新博客&#xff0c;以自己的实践经验梳理C#的技术脉络&#xff0c;也欢迎大家手下留情&#xff0c;耐心指点&#xff0c;让我们共同进步吧&…

canvas特效代码详解(2)

canvas是一个就基于像素的画图h5元素。 利用canvas做一个如下描述所示的动态图形&#xff1a;当鼠标点下去时开始绘图&#xff0c;在鼠标结束时完成一个矩形&#xff0c;当再一次点击时重复第一次的绘图步骤。 1 <!DOCTYPE html>2 <html>3 <head>4 …

阿里云三维可视化使用初体验

title: 阿里云三维可视化使用初体验tags: 物联网开发BIMcategories:物联网本文主要的目标是使用阿里云的云产品 - 物联网套件三维可视化 开始 准备工作 进入下载页面下载页面&#xff0c;点击“模型编辑器下载”安装模型编辑器下载安装完毕&#xff0c;启动模型编辑器下载&…

hp laser103 属性没有配置项_(常见解决方法)UEditor报错“后端配置项没有正常加载,上传插件不能正常使用”...

&#xff08;常见解决方法&#xff09;UEditor报错“后端配置项没有正常加载&#xff0c;上传插件不能正常使用”_向来萧瑟也无畏-CSDN博客​blog.csdn.net报错信息详见此文的“排错过程&&错误信息”→ueditor无法上传图片_向来萧瑟也无畏-CSDN博客3种解决方法1.大小写…

WinForm(十二)画图

在.NET中&#xff0c;画图主要是通过Graphics类实现的&#xff0c;这个类主要通过两类方法完成画图&#xff0c;一类是DrawXXX&#xff0c;画各种线条图形&#xff1b;另一类是FillXXX,用各种形状&#xff0c;填充各种图形。Graphics是画板&#xff0c;Draw各个方法是各种盏笔&…

从4个方面简单介绍SaaS

你了解什么是SaaS吗&#xff1f;SaaS有什么优势&#xff1f;选择SaaS平台要注意哪些要素&#xff1f;在这里&#xff0c;怡海软件将针对这些问题进行简单介绍&#xff1a; 什么是SaaS&#xff1f;SaaS是Software-as-a-Service&#xff08;软件即服务&#xff09;的简称&#xf…

终于找到你!如何将前端console.log的日志保存成文件?

本篇文章来自一个需求&#xff0c;前端websocket会收到各种消息&#xff0c;但是调试的时候&#xff0c;我希望把websoekt推送过来的消息都保存到一个文件里&#xff0c;如果出问题的时候&#xff0c;我可以把这些消息的日志文件提交给后端开发区分析错误。但是在浏览器里&…

基于 .NET 6 开发的开源远程终端工具

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;有用的工具&#xff0c;不要忘记关注。今天介绍一个非常实用的工具 mRemoteNG&#xff0c;这是一个基于 .NET 6 开发的远程终端软件&#xff0c;开源免费&#xff0c;不用担心版权和软件费用…

第六次作业—例行报告

本周PSP 进度条 代码累计折线图 博文累计折线图 本周饼状图 转载于:https://www.cnblogs.com/zej87/p/7738895.html

Tomcat7/8开启WebDAV的支持

WebDAV是一种超文本传输协议&#xff0c;Tomcat默认是支持WebDAV的&#xff0c;且默认为禁用状态。 更多详细信息&#xff0c;请参考&#xff1a; https://zh.wikipedia.org/wiki/WebDAV http://www.webdav.org/ 开启步骤如下&#xff1a; 1、在Tomcat的webapps目录下新建webda…

免费分享一些.NET Core比较优秀的社区资料和微软官方资料

这次小编所分享的这套笔记手册&#xff0c;主要是分享一些.NET Core比较优秀的社区资料和微软官方资料。已经把所有的重要知识点进行了完整的归类和整理&#xff0c;可以让大家更清晰和快速的学习.NET Core&#xff0c;不浪费任何多余的时间&#xff01;全网首发&#xff01;相…

python异或运算怎么算_小强学Python+OpenCV之-1.4.4掩膜mask及位运算(与、或、非、异或)...

问题引入在小强学PythonOpenCV之&#xff0d;1.4.2裁剪一节&#xff0c;我们使用的是numpy数组切片功能实现图片区域的裁剪。那么&#xff0c;如果我们想要裁剪图像中任意形状的区域时&#xff0c;应该怎么办呢&#xff1f;答案是&#xff0c;使用掩膜(masking)。但是这一节我们…

51 Nod 1670 打怪兽

1670 打怪兽lyk在玩一个叫做“打怪兽”的游戏。游戏的规则是这样的。lyk一开始会有一个初始的能量值。每次遇到一个怪兽&#xff0c;若lyk的能量值>怪兽的能量值&#xff0c;那么怪兽将会被打败&#xff0c;lyk的能量值增加1&#xff0c;否则lyk死亡&#xff0c;游戏结束。若…

QQ协议调试器 QQDebugger

QQ协议老变&#xff0c;为了分析协议&#xff0c;单用抓包工具还是不够的&#xff0c;还是得需要很好的调试工具。在网上找了几个调试工具&#xff0c;易用性均欠佳&#xff0c;不得已自己开发了一个 QQDebugger&#xff0c;不敢专美&#xff0c;特意发布出来。QQDebugger 在功…

Uptime-Kuma 一个轻量的开源监控工具

点击蓝字 关注我们你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;有用的工具&#xff0c;不要忘记关注。今天给大家介绍一个开源的监控工具 Uptime Kuma, 主要用来监控 Web 以及网络, 和 Prometheus 相比, 它是轻量的, Uptime Kuma 是基于…

SpringBoot实战之SpringBoot自动配置原理

SpringBoot 自动配置主要通过 EnableAutoConfiguration, Conditional, EnableConfigurationProperties 或者 ConfigurationProperties 等几个注解来进行自动配置完成的。EnableAutoConfiguration 开启自动配置&#xff0c;主要作用就是调用 Spring-Core 包里的 loadFactoryName…