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.pswp.cn/news/282015.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282015.shtml
英文地址,請注明出處:http://en.pswp.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;啟動模型編輯器下載&…

同時綁定onpropertychange 和 oninput 事件,實時檢測 input、textarea輸入改變事件,支持低版本IE,支持復制粘貼...

實時檢測 input、textarea輸入改變事件&#xff0c;支持低版本IE&#xff0c;支持復制粘貼 檢測input、textarea輸入改變事件有以下幾種&#xff1a; 1、onkeyup/onkeydown 捕獲用戶鍵盤輸入事件。缺陷&#xff1a;復制粘貼時無法檢測2、onchenge缺陷&#xff1a;要滿足觸發條件…

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…

騰訊的一筆畫游戲--巧妙解法

根據這個圖形我們可以發現圖中的規律。 所有數據的和 所有邊長的和-最后一個形狀的一個邊-除最后一個邊之外所有邊的一半。 知道了這個規律后我們就很容易去實現代碼了&#xff1a; 這里的解決關鍵點為——“余弦定理”&#xff0c;因為角度我們可以用&#xff08;n-2&#xf…

Map value類型不同的寫法

Map value類型不同的寫法 Map<String, Object> accountMapnew HashMap<String, Object>(); int userId data.get("userId").getAsInt(); int accType data.get("accType").getAsInt();String name data.get("accType").getAsStr…

mysql中局部變量說法正確的是_mysql全局變量和局部變量

全局變量和局部變量在服務器啟動時&#xff0c;會將每個全局變量初始化為其默認值(可以通過命令行或選項文件中指定的選項更改這些默認值)。然后服務器還為每個連接的客戶端維護一組會話變量&#xff0c;客戶端的會話變量在連接時使用相應全局變量的當前值初始化。舉一個例子&a…

Web應用架構-Full-text Search Service

Elasticsearch轉載于:https://www.cnblogs.com/zhitianji/p/9728016.html

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

本篇文章來自一個需求&#xff0c;前端websocket會收到各種消息&#xff0c;但是調試的時候&#xff0c;我希望把websoekt推送過來的消息都保存到一個文件里&#xff0c;如果出問題的時候&#xff0c;我可以把這些消息的日志文件提交給后端開發區分析錯誤。但是在瀏覽器里&…

基于 .NET 6 開發的開源遠程終端工具

你好&#xff0c;這里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;有用的工具&#xff0c;不要忘記關注。今天介紹一個非常實用的工具 mRemoteNG&#xff0c;這是一個基于 .NET 6 開發的遠程終端軟件&#xff0c;開源免費&#xff0c;不用擔心版權和軟件費用…

mysql 行列轉換 動態_mysql 行列動態轉換的實現(列聯表,交叉表)

(1)動態&#xff0c;適用于列不確定情況create table table_name(id int primary key,col1 char(2),col2 char(2),col3 int);insert into table_name values(1 ,A1,B1,9),(2 ,A2,B1,7),(3 ,A3,B1,4),(4 ,A4,B1,2),(5 ,A1,B2,2),(6 ,A2,B2,9),(7 ,A3,B2,8),(8 ,A4,B2,5),(9 ,A1,…

第六次作業—例行報告

本周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…