通過exp突然增長看錶的擴充套件

luckyfriends發表於2014-02-24

文章版權所有Jusin Haoluckyfriends),支援原創,轉載請註明。

1.問題:

系統一直能自動備份資料,但是在某一天(1月16號),備份出來的資料檔案突然增大。原來一直是100多兆,突然變成700多兆,客戶沒有任何異常操作;

備份指令碼:

cd c:\

exp nczs/nczs file=f:\databakxb\nczs_%date:~0,10%.dmp log=f:\databakxb\nczs_%date:~0,10%.log

exp iufo/iufo file=f:\databakxb\iufo_%date:~0,10%.dmp log=f:\databakxb\iufo_%date:~0,10%.log

檢視邏輯備份的匯出日誌,發現GL_UICONFIG(NC總賬介面配置)這表的資料增長很大;

clip_image002

而實際這個表在資料庫中的記錄數

1月15號是778行

1月16號是10789行

分別單獨匯出這兩日這張表的資料

1月15號是50M

1月16號是644M

exp nczs/nczs file=f:\databakxb\nczs_gl_15.dmp log=f:\databakxb\nczs_gl_15.log tables=GL_UICONFIG;

分別將兩日的資料庫備份恢復到兩個模式:

C:\>imp system/oracle@orcl file=E:\resolve_question\20100325\nczs_20

10-01-15.dmp log=d:\15.log fromuser=nczs touser=nc15

C:\>imp system/oracle@orcl file=E:\resolve_question\20100325\nczs_20

10-01-16.dmp log=d:\16.log fromuser=nczs touser=nc16

2.查詢這兩日各自資料庫中這個表的資料分配情況

資料庫的資料塊的大小是8192位元組;

SQL.> show parameter block

1) 查詢段分配的空間:位元組數,塊數,已分配的盤區數,在段建立時初始盤區要求的位元組數,分配給段的下一個盤區的位元組數,允許的最小盤區數量,允許的最大盤區數

SQL> select BYTES,BLOCKS,EXTENTS,INITIAL_EXTENT,NEXT_EXTENT,MIN_EXTENTS,MAX_EXTENTS from user_segments where segment_name='GL_UICONFIG';

15日的表查詢結果:

clip_image003

16日的表查詢結果:

clip_image004

說明16日的表進行了盤區的擴充套件(分配了新的盤區)

2)查詢某模式下某個物件段的分配的空間大小(位元組數)

SQL> select sum(bytes)/1024/1024||'MB' from dba_extents where owner='NC50' and segment_name='GL_UICONFIG';

15日的表查詢結果:

clip_image005

16日的表查詢結果:

clip_image006

3)查詢表已經使用的資料塊數(Number of used data blocks in the table)、表中從未使用的資料塊(NUMBER Number of empty (never used) data blocks in the table)

SQL> select blocks,empty_blocks from user_tables where table_name='GL_UICONFIG';

15日的表查詢結果:

clip_image007

16日的表查詢結果:

clip_image008

4)查詢兩日這個表的資料量:

15日的表查詢結果:

clip_image010

16日的表查詢結果:

clip_image012

5)查詢表的資料大小

SQL> desc gl_uiconfig

Name Type Nullable Default Comments

------------ ------------ -------- ---------------------------------------- --------

DR NUMBER(10) Y 0

EXTEND1 VARCHAR2(60) Y

EXTEND2 VARCHAR2(60) Y

EXTEND3 VARCHAR2(60) Y

EXTEND4 VARCHAR2(60) Y

EXTEND5 VARCHAR2(60) Y

ISDEFAULT CHAR(1) Y

MODULECODE VARCHAR2(60)

PARAM1 VARCHAR2(60) Y

PARAM2 VARCHAR2(60) Y

PARAM3 VARCHAR2(60) Y

PK_CORP CHAR(4)

PK_GLBOOK CHAR(20) Y

PK_GLORG CHAR(20) Y

PK_GLORGBOOK CHAR(20) Y

PK_SOB CHAR(20) Y

PK_UICONFIG CHAR(20)

PK_USER CHAR(20)

TEMPLATE BLOB Y

TS CHAR(19) Y to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')

存在有blob型別的物件

select dbms_lob.getlength(template) from gl_uiconfig;

15日的這張表中TEMPLATE 欄位的資料大小如下所示,基本上都大於66150位元組;

粗略估算表中這個欄位資料大小為:(778*66150)/1024/1024=49.08M

clip_image014

16日的這張表中TEMPLATE 欄位的資料大小如下所示,基本上都大於66150位元組;

粗略估算表中這個欄位資料大小為:(102789*61376)/1024/1024= 631.45M

clip_image016

說明這個欄位的資料量佔了這張表的主要資料量,因此exp匯出資料同樣比較大;

6)查詢lob型別資料的段

含有LOB欄位的表,其中LOB列只是儲存了一個LOCATOR (相當於C語言中的指標)

真正的資料儲存在單獨的LOB段中。

查詢user_segments表可以找到它們 (段型別為LOBSEGMENT/LOBINDEX),它們與表/列之間的關係,可以查詢USER_LOBS表;

因此下面的查詢表明

15日:gl_uiconfig的template欄位對應得資料實際儲存在段名為“SYS_LOB0000052900C00019$$”的lob段中,大小為59506688/1024./1024= 56.75M

clip_image018

clip_image020

clip_image022

16日:gl_uiconfig的template欄位對應得資料實際儲存在段名為“SYS_LOB0000055895C00019$$”的lob段中,大小為748945408/1024./1024= 714.25M

clip_image024

clip_image026

clip_image028

6)結論:

GL_UICONFIG 這個表的有image 形式的欄位(在oracle中這種型別的欄位是以blob或clob、bfile形式存放),

而我們這裡這個欄位在資料庫中就是blob型別的;

A:LONG: 可變長的字串資料,最長2G,LONG具有VARCHAR2列的特性,可以儲存長文字一個表中最多一個LONG列

LONG RAW: 可變長二進位制資料,最長2G

CLOB: 字元大物件Clob 用來儲存單位元組的字元資料

NCLOB: 用來儲存多位元組的字元資料

BLOB: 用於儲存二進位制資料

BFILE: 儲存在檔案中的二進位制資料,這個檔案中的資料只能被只讀訪。但該檔案不包含在資料庫內;bfile欄位實際的檔案儲存在檔案系統中, 欄位中儲存的是檔案定位指標.bfile對oracle來說是隻讀的,也不參與事務性控制和資料恢復,bfile並沒有存放資料,只是存放著指向資料的一個指標。

B:含有LOB欄位的表,其中LOB列只是儲存了一個LOCATOR (相當於C語言中的指標)

真正的資料儲存在單獨的LOB段中。查詢user_segments表可以找到它們 (段型別為LOBSEGMENT/LOBINDEX),它們與表/列之間的關係,可以查詢USER_LOBS表

C:Oracle對錶儲存空間的擴充套件是以盤區為單位進行;

3.Exp匯出機制

Exp 會匯出所有資料塊;

會進行全庫的掃描,將存有資料的記錄抽取出來;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14710393/viewspace-1087216/,如需轉載,請註明出處,否則將追究法律責任。

相關文章