9i中单个数据文件超过32G?


今天同事在review change的时候看到有个给表空间加数据文件的,发现加的数据文件竟然超过了32G,按照原来的思维,在9i中,非bigfile的单个数据文件单个大小不能超过32G。这个加32G数据文件的change是不是有误?查了一下原来的表空间情况,发现已经存在127.99G的数据文件了。该数据库不是9i,且该表空间下含多个数据文件。

我们先来看一下该表空间的信息:

SQL> l
 
1* select file_name,BYTES,RELATIVE_FNO,MAXBYTES,AUTOEXTENSIBLE from dba_data_files where tablespace_name='TS_OLB_TOPX_DATA_1'
SQL> /
 
FILE_NAME                                             BYTES RELATIVE_FNO   MAXBYTES AUT
-------------------------------------------
-- ------------- ------------ ---------- ---
/
ora/RPOLAP0/data001/olb_topx_data_1_01.dbf    137438887936           20          0 NO
/
ora/RPOLAP0/data003/olb_topx_data_1_02.dbf     26214400000          110          0 NO
......
 
14 rows selected.
 
SQL>
 
SQL> select 137438887936/1024/1024/1024 size_GB from dual;
 
  
SIZE_GB
--------
--
127.999939

 
SQL>

明确看到datafile id为20的数据文件大小为127.99G。为什么会有这样的情况?难道9i可以有超过32G的单个数据文件?

答案是可以的。首先我们要明白这个32G是怎么来的。

在9i数据库中,默认的数据块是8k,在一个数据文件最多能容纳多少个数据块?
我们随便dump一个看看:

Dump file /ora/admin/RPOLAP0/udump/rpolap02_ora_7129.trc
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production
ORACLE_HOME = /ora/product/v920
System name:    SunOS
Node name:      au10qap9p0tels2
Release:        5.9
Version:        Generic_118558-39
Machine:        sun4u
Instance name: RPOLAP02
Redo thread mounted by this instance: 2
Oracle process number: 42
Unix process pid: 7129, image: oracle@au10qap9p0tels2 (TNS V1-V3)
 
*** 2012-02-06 17:38:05.674
*** SESSION ID:(79.76) 2012-02-06 17:38:05.673
Start dump data blocks tsn: 20 file#: 20 minblk 3 maxblk 3
buffer tsn: 20 rdba: 0x05000003 (20/3)
scn: 0x0008.e31dbd61 seq: 0x01 flg: 0x04 tail: 0xbd611e01
frmt: 0x02 chkval: 0x839b type: 0x1e=KTFB Bitmapped File Space Bitmap
File Space Bitmap Block:
BitMap Control:
RelFno: 20, BeginBlock: 5, Flag: 0, First: 63261, Free: 165991

我们看到这里的rdba: 0×05000003,这是datafile中data block的地址,该值得取值范围从0×00000000到0xffffffff,,而转换成二进制后的前十位表示file id,后22位表示block id,也就是说,一个datafile中最多有1111111111111111111111(二进制)个数据块,即4194303个数据块。 也就是说,一个datafile最大的大小受到该值的约束。

当在9i的数据库中,默认block size为8k时,我们将0xffffffff转换成十进制即为4294967295:8k×4294967295=32G。(感谢指出 Sidney,这句话有误。) 在9i的数据库中,默认block size为8k时,我们将8k×4194303=32G,即最大32G。

那么对于刚刚系统中的那个数据文件,我们来看看。我们先dump出file header:

DATA FILE #20:
  (name #39) /ora/RPOLAP0/data001/olb_topx_data_1_01.dbf
creation size=96000 block size=32768 status=0xe head=39 tail=39 dup=1
 tablespace 20, index=21 krfil=20 prev_file=0
 unrecoverable scn: 0x0008.e31d155c 02/05/2012 18:30:26
 Checkpoint cnt:57541 scn: 0x0008.e35ff322 02/06/2012 17:21:01
 Stop scn: 0xffff.ffffffff 01/15/2011 20:58:14
 Creation Checkpointed at scn:  0x0000.000207a7 11/30/2007 17:16:22
 thread:1 rba:(0x50.92.10)
 enabled  threads:  01000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000
 Offline scn: 0x0000.00000000 prev_range: 0
 Online Checkpointed at scn:  0x0000.00000000
 thread:0 rba:(0x0.0.0)
 enabled  threads:  00000000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000
 Hot Backup end marker scn: 0x0000.00000000
 aux_file is NOT DEFINED
 FILE HEADER:
        Software vsn=153092096=0x9200000, Compatibility Vsn=134217728=0x8000000
        Db ID=3761053674=0xe02d1fea, Db Name='RPOLAP0'
        Activation ID=0=0x0
        Control Seq=7251317=0x6ea575, File size=4194302=0x3ffffe
        File Number=20, Blksiz=32768, File Type=3 DATA
Tablespace #20 - TS_OLB_TOPX_DATA_1  rel_fn:20
Creation   at   scn: 0x0000.000207a7 11/30/2007 17:16:22
Backup taken at scn: 0x0008.e324e3b4 02/06/2012 00:41:11 thread:2
 reset logs count:0x2625dcea scn: 0x0000.00000001 recovered at 07/04/2010 15:59:05
 status:0x4 root dba:0x00000000 chkpt cnt: 57541 ctl cnt:57540
begin-hot-backup file size: 4194302
Checkpointed at scn:  0x0008.e35ff322 02/06/2012 17:21:01
 thread:2 rba:(0x189da.2.10)
 enabled  threads:  01110000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000
Backup Checkpointed at scn:  0x0008.e324e3b4 02/06/2012 00:41:11
 thread:2 rba:(0x189be.ae.10)
 enabled  threads:  01110000 00000000 00000000 00000000 00000000 00000000
  00000000 00000000
External cache id: 0x0 0x0 0x0 0x0
Absolute fuzzy scn: 0x0000.00000000
Recovery fuzzy scn: 0x0000.00000000 01/01/1988 00:00:00
Terminal Recovery Stamp scn: 0x0000.00000000 01/01/1988 00:00:00

我们看到block size的大小为32k,那么32k每个block,乘以4294967295(感谢指出 Sidney,这句话有误。) 4194303个,即为128G了。即在我们这个系统中,这个该表空间的单个数据文件最大可到128G。

最后,我们来看看这个表空间的DDL,我们也会发现它指定了block size为32k:

SQL> l
  1* SELECT DBMS_METADATA.GET_DDL('TABLESPACE','TS_OLB_TOPX_DATA_1') FROM DUAL
SQL> /
 
DBMS_METADATA.GET_DDL('TABLESPACE','TS_OLB_TOPX_DATA_1')
--------------------------------------------------------------------------------
 
  CREATE TABLESPACE "TS_OLB_TOPX_DATA_1" DATAFILE
  '/ora/RPOLAP0/data001/olb_topx_data_1_01.dbf' SIZE 3145728000 REUSE
  AUTOEXTEND ON NEXT 524288000 MAXSIZE UNLIMITED,
  '/ora/RPOLAP0/data003/olb_topx_data_1_02.dbf' SIZE 1048576000 REUSE
  AUTOEXTEND ON NEXT 104857600 MAXSIZE UNLIMITED,
  '/ora/RPOLAP0/data003/olb_topx_data_1_03.dbf' SIZE 1048576000 REUSE
  AUTOEXTEND ON NEXT 104857600 MAXSIZE UNLIMITED,
  '/ora/RPOLAP0/data003/olb_topx_data_1_04.dbf' SIZE 104857600 REUSE
  AUTOEXTEND ON NEXT 104857600 MAXSIZE UNLIMITED,
  '/ora/RPOLAP0/data004/olb_topx_data_1_05.dbf' SIZE 26214400000 REUSE ,
  '/ora/RPOLAP0/data004/olb_topx_data_1_06.dbf' SIZE 26214400000 REUSE ,
  '/ora/RPOLAP0/data003/olb_topx_data_1_07.dbf' SIZE 20971520000 REUSE ,
  '/ora/RPOLAP0/data005/olb_topx_data_1_08.dbf' SIZE 20971520000 REUSE ,
  '/ora/RPOLAP0/data005/olb_topx_data_1_09.dbf' SIZE 20971520000 REUSE ,
  '/ora/RPOLAP0/data005/olb_topx_data_1_10.dbf' SIZE 20971520000 REUSE ,
  '/ora/RPOLAP0/data005/olb_topx_data_1_11.dbf' SIZE 26214400000 REUSE ,
  '/ora/RPOLAP0/data005/olb_topx_data_1_13.dbf' SIZE 26214400000 REUSE ,
  '/ora/RPOLAP0/data005/olb_topx_data_1_14.dbf' SIZE 5242880000 REUSE ,
  '/ora/RPOLAP0/data005/olb_topx_data_1_12.dbf' SIZE 26214400000 REUSE
  LOGGING ONLINE PERMANENT BLOCKSIZE 32768
  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1048576 SEGMENT SPACE MANAGEMENT AUTO
 
 
 
SQL>

所以,单个数据文件最大32G只是一个默认情况,知其然,知其所以然,才能更好的了解数据库。


· 【文章发布信息】发表于: 2012-02-06 @ 15:22:53 · ||分类: ..experience, Working case

· 【分享或收藏】:

8 条评论 »

  1. robinma 于 2012-02-07 @ 16:35:35 留言

    经典,Nice article.

  2. cc111 于 2012-02-07 @ 21:36:43 留言

    作为一个接触了运维了数据库这么多年的人,还写这样层次的文章,博主应该检讨一下

  3. zs21cn 于 2012-02-09 @ 06:15:48 留言

    非常精辟的文章
    如果能顺带讲解一下为什么要把BLOCK SIZE设置成32K,或者设置成不同的BLOCK SIZE的影响就完美了

  4. 小荷 于 2012-02-10 @ 16:13:28 留言

    re c111:让你见笑了,不好意思。下次努力憋点深度的文章出来。

  5. yanshoupeng 于 2012-02-11 @ 16:38:22 留言

    深度不深度无所谓,适用就是好文章。

  6. 小荷 于 2012-02-15 @ 15:53:54 留言

    re zs21cn: 设置大的block size的tablespace,主要用在数据仓库类型的数据库,因为在单块读取时,大的block size能减少IO消耗。如做insert操作,如果要插入512k的数据,每次读取一个块,
    如果tablespace block 8k,就要读取64次,即64个IO消耗,如果tablespace block 16k,就读取32次,即32个IO消耗。
    但是大的block size的tablespace也有缺点,会让比较多的数据集中在一个块上引起争用。这也就是为什么适合在数据仓库而不是OLTP的原因。

  7. Sidney 于 2012-02-16 @ 22:33:43 留言

    hi 小何
    这篇文章的结论是对的,但是过程有误。

    首先这一句的计算
    当在9i的数据库中,默认block size为8k时,我们将0xffffffff转换成十进制即为4294967295:8k×4294967295=32G。

    正确的结果是
    sid@CS11GR2> select 8 * 1024 * 4294967295 / 1024 / 1024 / 1024 “GB” from dual;

    GB
    ———-
    32768

    这是32768GB,而不是32GB. 单个8K块的数据文件真的可以这么大吗?
    问题在于32位的RDBA并不是全部拿来表示block number,前面10位表示relative file number, 后面22为表示block number.
    RDBA is 32 bit length, the format is: {relative_file_number[10]} {block number[22]}.

    8K块数据文件大小上限32G,32K数据块大小上限128G是因为:

    sid@CS11GR2> select power(2,22) * 8 * 1024 / 1024 / 1024 / 1024 “8K_FILE_GB” from dual;

    8K_FILE_GB
    ———-
    32

    sid@CS11GR2> select power(2,22) * 32 * 1024 / 1024 / 1024 / 1024 “32K_FILE_GB” from dual;

    32K_FILE_GB
    ———-
    128

  8. 小荷 于 2012-02-17 @ 10:29:27 留言

    re Sidney: 谢谢指出。你是对的。rdba是后后22位表示block number。后面的22位最大是1111111111111111111111,即4194303, 8k×4194303=32G。我会修改我的文章。非常高兴你指出我的错误。

RSS 为此帖反馈评论 · 反向跟踪 网站

留条评论