通过exp突然增长看表的扩展

本文针对Oracle数据库备份过程中出现的数据文件异常增大的问题进行详细分析,包括备份脚本、表数据变化、数据块分配及LOB字段处理等内容。

文章版权所有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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/14710393/viewspace-1087216/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值