oracle dump數據庫


最近正在看老白的《DBA的思想天空》,了解數據塊結構,想通過dump data block驗證oracle對於行尾的NULL,是不占用存儲空間的。

我們先來看一下怎樣dump數據塊:

1.在數據庫級別dump數據庫,oracle提供了命令支持

ALTER SYSETM DUMP DATAFILE absolute_file_number
BLOCK block_number;
ALTER SYSETM DUMP DATAFILE absolute_file_number
BLOCK MIN minimum_block_number
BLOCK MAX maximum_block_number;
ALTER SYSETM DUMP DATAFILE 'file_name' BLOCK block_number;

如果需要強制dump出來的數據以十六進制顯示,需要設置event 10289

ALTER SESSION SET EVENTS
'10289 trace name context forever, level 1';

然后再dump數據塊,使用下列命令關閉10289

ALTER SESSION SET EVENTS
'10289 trace name context off';

需要注意的是:

  • dump是,如果忽略block參數,將dump整個數據文件
  • 使用文件號(absolute_file_number)是,數據庫必須處於OPEN狀態,並且數據文件也要求ONLINE;
  • 使用文件號,dump信息來自Buffer Cache,而不是磁盤
  • 使用文件名,dump信息來自磁盤,因此實例在NOMOUNT狀態也可以dump

2.通過操作系統工具dump

dd if=/s01/app/oracle/oradata/MYAPP/users01.dbf of=b527.dmp bs=8192 skip=527 count=1

OK,補充了dump的知識,讓我們來跟隨老白的實驗,驗證null是不占用存儲空間的。

CREATE TABLE TEST1 (A INTEGER,B VARCHAR2(100),C VARCHAR2(100);
INSERT INTO TEST1 VALUES (1,null,'aaaa');
INSERT INTO TEST1 VALUES (2,null,'bbbb');
INSERT INTO TEST1 VALUES (1,'11111',null);

然后查找這個extent所在的位置:
SELECT extent_id,file_id,block_id from dba_extents where segment_name='TEST1' and owner='SCOTT';

EXTENT_ID FILE_ID BLOCK_ID
---------- ---------- ----------
0               4             520

然后我們查詢TEST1表的ROWID

SQL> select dbms_rowid.rowid_block_number('AAASwvAAEAAAAIPAAA') block# from dual;

BLOCK#
---------------------------------------------------
527

通過dd命令可以看到這三條數據。

選中部分2C 01 02:02代表長度。這里也可以驗證數據塊里的數據是從下往上分布的。

或者alter system dump datafile:

block_row_dump:
tab 0, row 0, @0x1f8c
tl: 12 fb: --H-FL-- lb: 0x1  cc: 3
col  0: [ 2]  c1 02
col  1: *NULL*
col  2: [ 4]  61 61 61 61
tab 0, row 1, @0x1f80
tl: 12 fb: --H-FL-- lb: 0x1  cc: 3
col  0: [ 2]  c1 03
col  1: *NULL*
col  2: [ 4]  62 62 62 62
tab 0, row 2, @0x1f74
tl: 12 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 02
col  1: [ 5]  31 31 31 31 31
end_of_block_dump
End dump data blocks tsn: 4 file#: 4 minblk 527 maxblk 527

可以看到 INSERT INTO TEST1 VALUES (1,'11111',null); dump出來只有兩列數據,NULL是不占用空間的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM