例項演示oracle資料塊狀態檢視v$bh的用法一 獲取oracle物件所佔用的資料塊
1,建立一個測試表,test,並且插入10000行資料;
SQL> create table test (id int);
SQL> begin
2 for i in 1..10000 loop
3 insert into test values(i)
4 end loop;
5 end;
6 /
SQL> commit;
2,建立一個儲存過程SHOW_SPACE:
|
|
create or replace procedure show_space
( p_segname in varchar2,
p_owner in varchar2 default user,
p_type in varchar2 default 'TABLE',
p_partition in varchar2 default NULL )
as
l_total_blocks number;
l_total_bytes number;
l_unused_blocks number;
l_unused_bytes number;
l_LastUsedExtFileId number;
l_LastUsedExtBlockId number;
l_last_used_block number;
procedure p( p_label in varchar2, p_num in number )
is
begin
dbms_output.put_line( rpad(p_label,40,'.') ||
p_num );
end;
begin
dbms_space.unused_space
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
partition_name => p_partition,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
last_used_extent_file_id => l_LastUsedExtFileId,
last_used_extent_block_id => l_LastUsedExtBlockId,
last_used_block => l_last_used_block );
p( 'Total Blocks', l_total_blocks );
p( 'Total Bytes', l_total_bytes );
p( 'Unused Blocks', l_unused_blocks );
p( 'Unused Bytes', l_unused_bytes );
p( 'Last Used Ext FileId', l_LastUsedExtFileId );
p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
p( 'Last Used Block', l_last_used_block );
end;
/
3,檢查表test的空間使用情況:
SQL> exec show_space('TEST');
Total Blocks............................24
Total Bytes.............................196608
Unused Blocks...........................3
Unused Bytes............................24576
Last Used Ext FileId....................1
Last Used Ext BlockId...................62177
Last Used Block.........................5
由上可知,該表test共佔用了24個資料塊,196608位元組,檔案ID為1
4, 獲得表test在資料塊中的分佈情況:
SQL> select f,b from (
2 select dbms_rowid.rowid_relative_fno(rowid) f,
3 dbms_rowid.rowid_block_number(rowid) b
4 from test) group by f,b order by b;
F B
---------- ----------
1 62162
1 62163
1 62164
1 62165
1 62166
1 62167
1 62168
1 62169
1 62170
1 62171
1 62172
1 62173
1 62174
1 62175
1 62176
1 62177
16 rows selected.
由此可見,表test中的資料共佔用了16個資料塊,但是前面第三步中,發現該表佔用了24個資料塊。這是正常的,因為oracle本身會使用8個資料塊來記錄段頭、點陣圖塊等額外的資訊。我們現在只需要瞭解到,表test共佔用了24個資料塊,其中16個是資料,8個是表資訊。
5,檢查x$bh和v$bh的更新:
SQL> select file#,dbablk,tch from x$bh where bj=
2 (select data_object_id from dba_objects
3 where wner='SYS' and object_name='TEST')
4 order by dbablk;
FILE# DBABLK TCH
---------- ---------- ----------
1 62161 6
1 62162 3
1 62163 3
1 62164 3
1 62165 3
1 62166 3
1 62167 3
1 62168 3
1 62169 3
1 62170 3
1 62171 3
1 62172 3
1 62173 3
1 62174 3
1 62175 3
1 62176 3
1 62177 3
1 62178 3
1 62179 3
1 62180 3
1 62181 3
21 rows selected.
SQL> select file#,block#,status from v$bh where bjd=
2 (select data_object_id from dba_objects
3 where wner='SYS' and object_name='TEST')
4 order by block#;
FILE# BLOCK# STATUS
---------- ---------- -------
1 62161 xcur
1 62162 xcur
1 62163 xcur
1 62164 xcur
1 62165 xcur
1 62166 xcur
1 62167 xcur
1 62168 xcur
1 62169 xcur
1 62170 xcur
1 62171 xcur
1 62172 xcur
1 62173 xcur
1 62174 xcur
1 62175 xcur
1 62176 xcur
1 62177 xcur
1 62178 xcur
1 62179 xcur
1 62180 xcur
1 62181 xcur
21 rows selected.
這裡可以看到,在v$bh和x$bh中得到的資料塊,是從62161~62181的21條記錄,但是在第四步中,我們知道資料是佔用了62162~62177的16個資料庫,這裡,62161資料塊裡面存放的是段頭資訊,可以透過如下命令進行驗證:
SQL> select header_file,header_block from dba_segments
2 where wner='SYS' and segment_name='TEST';
HEADER_FILE HEADER_BLOCK
----------- ------------
1 62161
在v$bh檢視中,我們可以看到這21個資料塊都是xcur狀態,表示這些資料塊都是排斥狀態,正在被使用,該欄位還有其他的型別,請參見資料塊的狀態型別。
(
oracle緩衝塊(data block)狀態型別
|
)
6,清空資料快取:
SQL> alter system flush buffer_cache;
(在Oracle9i裡,Oracle提供了一個內部事件,用以強制重新整理Buffer Cache,其語法為:
alter session set events 'immediate trace name flush_cache level 1';
或者:
alter session set events = 'immediate trace name flush_cache';
類似的也可以使用alter system系統級設定:
alter system set events = 'immediate trace name flush_cache';
在Oracle10g中,Oracle提供一個新的特性,可以透過如下命令重新整理Buffer Cache:
alter system flush buffer_cache;
)
7,重新檢查v$bh和x$bh的內容:
SQL> select file#,dbablk,tch from x$bh where bj=
2 (select data_object_id from dba_objects
3 where wner='SYS' and object_name='TEST')
4 order by dbablk;
FILE# DBABLK TCH
---------- ---------- ----------
1 62161 0
1 62162 0
1 62163 0
1 62164 0
1 62165 0
1 62166 0
1 62167 0
1 62168 0
1 62169 0
1 62170 0
1 62171 0
1 62172 0
1 62173 0
1 62174 0
1 62175 0
1 62176 0
1 62177 0
1 62178 0
1 62179 0
1 62180 0
1 62181 0
21 rows selected.
SQL> select file#,block#,status from v$bh where bjd=
2 (select data_object_id from dba_objects
3 where wner='SYS' and object_name='TEST')
4 order by block#;
FILE# BLOCK# STATUS
---------- ---------- -------
1 62161 free
1 62162 free
1 62163 free
1 62164 free
1 62165 free
1 62166 free
1 62167 free
1 62168 free
1 62169 free
1 62170 free
1 62171 free
1 62172 free
1 62173 free
1 62174 free
1 62175 free
1 62176 free
1 62177 free
1 62178 free
1 62179 free
1 62180 free
1 62181 free
21 rows selected.
這時候我們可以看到,x$bh中的tch欄位,已經由原來的3變成了0,同時v$bh檢視的資料塊狀態也變成了free,但是記錄的資料塊並沒有發生變化,還是在62161~62181這些資料塊中,這就是說,雖然資料已經被寫到了磁碟中,但是資料庫記錄的指標並沒有清空,僅僅是其狀態發生了改變。<SPAN
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31520497/viewspace-2156871/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 檢視Oracle各組成部份(如資料塊頭)的大小Oracle
- Oracle資料塊格式Oracle
- oracle資料庫與oracle例項Oracle資料庫
- Jtti:linux怎麼檢視oracle資料庫的執行狀態JttiLinuxOracle資料庫
- Oracle獲取資料庫中的物件建立語句Oracle資料庫物件
- ORACLE 資料塊格式深入解析Oracle
- Oracle OCP(27):使用資料字典檢視管理物件Oracle物件
- 如何檢視ORACLE的LOB(BLOB和CLOB)物件佔用的大小Oracle物件
- Oracle資料庫壞塊典型案例分析Oracle資料庫
- oracle asm 資料塊重構恢復OracleASM
- 3.4.4 檢視例項的靜默狀態
- oracle資料庫建立資料庫例項-九五小龐Oracle資料庫
- Oracle相關資料字典檢視Oracle
- Oracle DG資料庫狀態轉換Oracle資料庫
- 一次ORACLE資料庫undo壞塊處理Oracle資料庫
- 達夢資料庫例項的狀態和模式資料庫模式
- Oracle資料庫壞塊典型案例擴充Oracle資料庫
- oracle 11g 單例項資料庫的安裝Oracle單例資料庫
- MySQL和Oracle的後設資料抽取例項分析KRGXMySqlOracle
- 檢視oracle資料庫真實大小Oracle資料庫
- 【資料庫資料恢復】ASM例項不能掛載的Oracle資料庫資料恢復案例資料庫資料恢復ASMOracle
- 【資料庫資料恢復】Oracle ASM例項無法掛載的資料恢復案例資料庫資料恢復OracleASM
- python使用cx_Oracle連線oracle資料庫獲取常用資訊PythonOracle資料庫
- oracle 普通表空間資料檔案壞塊Oracle
- Oracle 資料庫巡檢指令碼 單例項 RAC 輸出HTML格式Oracle資料庫指令碼單例HTML
- 檢視oracle資料庫的連線數以及使用者檢視Oracle資料庫
- 如何處理Oracle資料庫中的壞塊問題(轉)Oracle資料庫
- Oracle minus用法詳解及應用例項Oracle
- Oracle:重複資料去重,只取最新的一條資料Oracle
- 12、Oracle中的其它資料庫物件Oracle資料庫物件
- sqlserver讀取oracle資料庫資料SQLServerOracle資料庫
- 【資料庫資料恢復】Oracle資料庫檔案出現壞塊報錯的資料恢復案例資料庫資料恢復Oracle
- ORACLE資料庫檢視ACQ(ACTIVE CHECKPOINT QUEUE)資訊Oracle資料庫
- 例項演示:Excel實現資料更新獲取,並根據公式計算後展示Excel公式
- Oracle BLOB型別的資料如何檢視和下載?Oracle型別
- oracle資料庫檢視鎖表的sql語句整理Oracle資料庫SQL
- 檢視資料庫佔用磁碟空間的方法資料庫
- 【TUNE_ORACLE】檢視錶的總塊數SQL參考OracleSQL