Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2885579
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2012-08-18 08:31:23

 
 
我一般查询文件大小的时候用到如下表或者视图file$,v$datafile,v$datafile_header,dba_data_files。
这几个图显示的文件大小是某些时候是有区别的。
 
一、文件信息的来源
 
1、file$表
 
对于本地管理的表空间 表file$其实只是记录了文件初始创建的大小,一旦文件被RESIZE过,那么FILE$表中显示的文件大小就和实际不符合了,
这个时候需要查询表sys.x$ktfbhc(表的含义Kernel Tablespace File Bitmap Header Control)来得到文件的实际大小。

点击(此处)折叠或打开

  1. SQL> create tablespace filetest datafile '/u01/app/oracle/oradata/huateng/file01.dbf' size 8192000;

  2. Tablespace created.


  3. SQL> select file#,blocks,spare1 from file$;

  4.      FILE# BLOCKS SPARE1

  5. ---------- ---------- ----------

  6.          1 64000 4194306
  7.          2 51200 8388610
  8.          3 3200 12582914
  9.          4 640 16777218
  10.          5 12800 20971522
  11.          6 1280 25165826
  12.          7 1000 29360130


  13. 7 rows selected.


  14. SQL> select KTFBHCAFNO,KTFBHCSZ from sys.x$ktfbhc;

  15. KTFBHCAFNO KTFBHCSZ
  16. ---------- ----------

  17.          1 88320
  18.          2 62720
  19.          3 10880
  20.          4 640
  21.          5 12800
  22.          6 5120
  23.          7 1000

  24. 7 rows selected.


  25. SQL> select 2000*8192 from dual;

  26.  2000*8192
  27. ----------

  28.   16384000



  29. SQL> alter database datafile 7 resize 16384000;

  30. Database altered.


  31. SQL> select file#,blocks,spare1 from file$;

  32.      FILE# BLOCKS SPARE1
  33. ---------- ---------- ----------

  34.          1 64000 4194306
  35.          2 51200 8388610
  36.          3 3200 12582914
  37.          4 640 16777218
  38.          5 12800 20971522
  39.          6 1280 25165826
  40.          7 1000 29360130

  41. 7 rows selected.


  42. SQL> select KTFBHCAFNO,KTFBHCSZ from sys.x$ktfbhc;

  43. KTFBHCAFNO KTFBHCSZ

  44. ---------- ----------

  45.          1 88320
  46.          2 62720
  47.          3 10880
  48.          4 640
  49.          5 12800
  50.          6 5120
  51.          7 2000

  52. 7 rows selected.

2、V$DATAFILE_HEADER视图
 
This view displays datafile information from the datafile headers.
这个视图的信息来自数据文件头。这个视图实际是基于X$KCVFH创建的。
kcvfh是描述数据文件头的一个C结构体,BBED可以查看
 

点击(此处)折叠或打开

  1. BBED>
  2. BBED> map /v
  3.  File: /u01/app/oracle/oradata/huateng/htyansp01.dbf (0)
  4.  Block: 1 Dba:0x00000000
  5. ------------------------------------------------------------

  6.  Data File Header

  7.  struct kcvfh, 860 bytes @0
  8.     struct kcvfhbfh, 20 bytes @0
  9.     struct kcvfhhdr, 76 bytes @20
  10.     ub4 kcvfhrdb @96
  11.     struct kcvfhcrs, 8 bytes @100
  12.     ub4 kcvfhcrt @108
  13.     ub4 kcvfhrlc @112
  14.     struct kcvfhrls, 8 bytes @116
  15.     ub4 kcvfhbti @124
  16.     struct kcvfhbsc, 8 bytes @128
  17.     ub2 kcvfhbth @136
  18.     ub2 kcvfhsta @138
  19.     struct kcvfhckp, 36 bytes @484
  20.     ub4 kcvfhcpc @140
  21.     ub4 kcvfhrts @144
  22.     ub4 kcvfhccc @148
  23.     struct kcvfhbcp, 36 bytes @152
  24.     ub4 kcvfhbhz @312
  25. ................................
  26. ...............................
  27. 省略其他。

因此这里显示的文件大小实际是来自文件头记录的文件大小。
如下:
 

点击(此处)折叠或打开

  1. SQL> set autot traceonly exp
  2. SQL> select * from v$datafile_header;

  3. Execution Plan
  4. ----------------------------------------------------------

  5. Plan hash value: 2441152905

  6. ----------------------------------------------------------------------------

  7. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  8. ----------------------------------------------------------------------------

  9. | 0 | SELECT STATEMENT | | 1 | 533 | 0 (0)| 00:00:01 |
  10. |* 1 | FIXED TABLE FULL| X$KCVFH | 1 | 533 | 0 (0)| 00:00:01 |
  11. ----------------------------------------------------------------------------


  12. Predicate Information (identified by operation id):
  13. ---------------------------------------------------


  14.    1 - filter("INST_ID"=USERENV('INSTANCE'))

  15. SQL> set autot off
  16. SQL> select hxfil,fhfsz from x$kcvfh;

  17.      HXFIL FHFSZ
  18. ---------- ----------

  19.          1 88320
  20.          2 62720
  21.          3 10880
  22.          4 640
  23.          5 12800
  24.          6 5120
  25.          7 2000

  26. 7 rows selected.

3、V$DATAFILE视图
 
This view contains datafile information from the control file.
联机文档说这部分信息来自控制文件。
其实这个说法并不完全对,至少文件大小也是来自文件头x$kcvfh表。
通过这个视图的建立语句就可以得到视图的blocks来自fh.fhfsz(fh是x$kcvfh的别名)
 

点击(此处)折叠或打开

  1. select fe.inst_id,fe.fenum,to_number(fe.fecrc_scn), to_date(fe.fecrc_tim,'MM/DD/RR HH24:MI:SS','NLS_CALENDAR=Gregorian'), fe.fetsn,fe.ferfn, decode(fe.fetsn,0,decode

  2. (bitand(fe.festa,2),0,'SYSOFF','SYSTEM'), decode(bitand(fe.festa,18),0,'OFFLINE',2,'ONLINE','RECOVER')), decode(fe.fedor,2,'READ ONLY
  3. ', decode(bitand(fe.festa, 12), 0,'DISABLED',4,'READ ONLY',12,'READ WRITE','UNKNOWN')), to_number(fe.fecps), to_date(fe.fecpt,'MM/DD/RR

  4. HH24:MI:SS','NLS_CALENDAR=Gregorian'), to_number(fe.feurs), to_date(fe.feurt,'MM/DD/RR HH24:MI:SS','NLS_CALENDAR=Gregorian'), to_number(fe.fests), decode(fe.f
  5. ests,NULL,to_date(NULL), to_date(fe.festt,'MM/DD/RR HH24:MI:SS','NLS_CALENDAR=Gregorian')), to_number(fe.feofs),to_number(fe.feonc_scn), to_date

  6. (fe.feonc_tim,'MM/DD/RR HH24:MI:SS','NLS_CALENDAR=Gregorian'), fh.fhfsz*fe.febsz,fh.fhfsz,fe.fecsz*fe.febsz,fe.febsz,fn.fnnam, fe.fefdb, fn.fnbof, decode(
  7. fe.fepax, 0, 'UNKNOWN', 65535, 'NONE', fnaux.fnnam), to_number(fh.fhfirstunrecscn), to_date(fh.fhfirstunrectime,'MM/DD/RR

  8. HH24:MI:SS','NLS_CALENDAR=Gregorian'), fe.fepdi, fe.fefcrs, fe.fefcrt, decode(fe.fefdb, 1, 'YES', 'NO'), fe.feplus, fe.feprls, fe.feprlt fr
  9. om x$kccfe fe, x$kccfn fn, x$kccfn fnaux, x$kcvfh fh where ((fe.fepax!=65535 and fe.fepax!=0 and

  10. fe.fepax=fnaux.fnnum) or ((fe.fepax=65535 or fe.fepax=0) and fe.fenum=fnaux.fnfno and fnaux.fntyp=4 and
  11.  fnaux.fnnam is not null and bitand(fnaux.fnflg, 4) != 4 and fe.fefnh=fnaux.fnnum))

  12.                                  and fn.fnfno=fe.fenum and fn.fnfno=fh.hxfil and fe.fefnh=fn.fnnum and fe.fedup!=0 and
  13.  fn.fntyp=4 and fn.fnnam is not null and bitand(fn.fnflg, 4) != 4 order by fe.fenum

4、DBA_DATA_FILES视图

这个视图的信息是2部分UNION ALL起来的,也就是字典管理表空间和本地管理表空间2部分。
这个表的创建视图如下:
 

点击(此处)折叠或打开

  1. select v.name, f.file#, ts.name,

  2.        ts.blocksize * f.blocks, f.blocks,

  3.        decode(f.status$, 1, 'INVALID', 2, 'AVAILABLE', 'UNDEFINED'),

  4.        f.relfile#, decode(f.inc, 0, 'NO', 'YES'),

  5.        ts.blocksize * f.maxextend, f.maxextend, f.inc,

  6.        ts.blocksize * (f.blocks - 1), f.blocks - 1,

  7.        decode(fe.fetsn, 0, decode(bitand(fe.festa, 2), 0, 'SYSOFF', 'SYSTEM'),

  8.          decode(bitand(fe.festa, 18), 0, 'OFFLINE', 2, 'ONLINE', 'RECOVER'))

  9. from sys.file$ f, sys.ts$ ts, sys.v$dbfile v, x$kccfe fe

  10. where v.file# = f.file#

  11.   and f.spare1 is NULL

  12.   and f.ts# = ts.ts#

  13.   and fe.fenum = f.file#

  14. union all

  15. select

  16.        v.name,f.file#, ts.name,

  17.        decode(hc.ktfbhccval, 0, ts.blocksize * hc.ktfbhcsz, NULL),

  18.        decode(hc.ktfbhccval, 0, hc.ktfbhcsz, NULL),

  19.        decode(f.status$, 1, 'INVALID', 2, 'AVAILABLE', 'UNDEFINED'),

  20.        f.relfile#,

  21.        decode(hc.ktfbhccval, 0, decode(hc.ktfbhcinc, 0, 'NO', 'YES'), NULL),

  22.        decode(hc.ktfbhccval, 0, ts.blocksize * hc.ktfbhcmaxsz, NULL),

  23.        decode(hc.ktfbhccval, 0, hc.ktfbhcmaxsz, NULL),

  24.        decode(hc.ktfbhccval, 0, hc.ktfbhcinc, NULL),

  25.        decode(hc.ktfbhccval, 0, hc.ktfbhcusz * ts.blocksize, NULL),

  26.        decode(hc.ktfbhccval, 0, hc.ktfbhcusz, NULL),

  27.        decode(fe.fetsn, 0, decode(bitand(fe.festa, 2), 0, 'SYSOFF', 'SYSTEM'),

  28.          decode(bitand(fe.festa, 18), 0, 'OFFLINE', 2, 'ONLINE', 'RECOVER'))

  29. from sys.v$dbfile v, sys.file$ f, sys.x$ktfbhc hc, sys.ts$ ts, x$kccfe fe

  30. where v.file# = f.file#

  31.   and f.spare1 is NOT NULL

  32.   and v.file# = hc.ktfbhcafno

  33.   and hc.ktfbhctsn = ts.ts#

  34.   and fe.fenum = f.file#;


对于本地管理的表空间,视图显示的文件大小信息来自sys.x$ktfbhc表。
二、文件离线或者表空间离线对查询文件大小的影响
 

点击(此处)折叠或打开

  1. SQL> alter database datafile 6 offline;

  2. Database altered.

  3. SQL> select file#,blocks from file$ where file#=6;

  4.      FILE# BLOCKS
  5. ---------- ----------

  6.          6 1280

  7. SQL> select file#,blocks from v$datafile where file#=6;

  8.      FILE# BLOCKS
  9. ---------- ----------

  10.          6 5120


  11. SQL> select file#,blocks from v$datafile_header where file#=6;

  12.      FILE# BLOCKS
  13. ---------- ----------

  14.          6 5120

  15. SQL> select file_id,blocks from dba_data_files where file_id=6;

  16.    FILE_ID BLOCKS
  17. ---------- ----------

  18.          6

  19. SQL> select KTFBHCAFNO,KTFBHCSZ from sys.x$ktfbhc where KTFBHCAFNO=6;

  20. KTFBHCAFNO KTFBHCSZ
  21. ---------- ----------

  22.          6 1280

文件离线将会导致sys.x$ktfbhc查询的文件大小为创建时候的大小,dba_data_files显示文件大小为NULL,其他视图也不受影响。
 

点击(此处)折叠或打开

  1. SQL> alter database datafile 6 online;
  2. alter database datafile 6 online
  3. *
  4. ERROR at line 1:
  5. ORA-01113: file 6 needs media recovery
  6. ORA-01110: data file 6: '/u01/app/oracle/oradata/huateng/htyansp01.dbf'


  7. SQL> recover datafile 6;
  8. Media recovery complete.
  9. SQL> alter database datafile 6 online;

  10. Database altered.

  11. SQL> alter tablespace htyansp online;

  12. Tablespace altered.

  13. SQL> alter tablespace htyansp offline;

  14. Tablespace altered.

  15. SQL> select file#,blocks from file$ where file#=6;

  16.      FILE# BLOCKS
  17. ---------- ----------

  18.          6 1280

  19. 1 row selected.

  20. SQL> select file#,blocks from v$datafile where file#=6;

  21.      FILE# BLOCKS
  22. ---------- ----------

  23.          6 0

  24. 1 row selected.

  25. SQL> select file#,blocks from v$datafile_header where file#=6;

  26.      FILE# BLOCKS
  27. ---------- ----------

  28.          6 0

  29. 1 row selected.

  30. SQL> select file_id,blocks from dba_data_files where file_id=6;

  31.    FILE_ID BLOCKS
  32. ---------- ----------

  33.          6

  34. 1 row selected.

  35. SQL> select KTFBHCAFNO,KTFBHCSZ from sys.x$ktfbhc where KTFBHCAFNO=6;

  36. KTFBHCAFNO KTFBHCSZ
  37. ---------- ----------

  38.          6 1280

可以看到表空间离线导致大部分视图查询结果的为0,那么此时我们需要查询文件大小要从哪里查呢?
阅读(1896) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~