文章版权所有Jusin Hao(luckyfriends),支持原创,转载请注明。
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总账界面配置)这表的数据增长很大;
而实际这个表在数据库中的记录数
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日的表查询结果:
16日的表查询结果:
说明16日的表进行了盘区的扩展(分配了新的盘区)
2)查询某模式下某个对象段的分配的空间大小(字节数)
SQL> select sum(bytes)/1024/1024||'MB' from dba_extents where owner='NC50' and segment_name='GL_UICONFIG';
15日的表查询结果:
16日的表查询结果:
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日的表查询结果:
16日的表查询结果:
4)查询两日这个表的数据量:
15日的表查询结果:
16日的表查询结果:
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
16日的这张表中TEMPLATE 字段的数据大小如下所示,基本上都大于66150字节;
粗略估算表中这个字段数据大小为:(102789*61376)/1024/1024= 631.45M
说明这个字段的数据量占了这张表的主要数据量,因此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
16日:gl_uiconfig的template字段对应得数据实际存储在段名为“SYS_LOB0000055895C00019$$”的lob段中,大小为748945408/1024./1024= 714.25M
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 会导出所有数据块;
会进行全库的扫描,将存有数据的记录抽取出来;