9i中单个数据文件超过32G?
今天同事在review change的时候看到有个给表空间加数据文件的,发现加的数据文件竟然超过了32G,按照原来的思维,在9i中,非bigfile的单个数据文件单个大小不能超过32G。这个加32G数据文件的change是不是有误?查了一下原来的表空间情况,发现已经存在127.99G的数据文件了。该数据库不是9i,且该表空间下含多个数据文件。
我们先来看一下该表空间的信息:
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一个看看:
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:
(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:
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
· 【分享或收藏】:



CopyRight ©
robinma 于 2012-02-07 @ 16:35:35 留言 :
经典,Nice article.
cc111 于 2012-02-07 @ 21:36:43 留言 :
作为一个接触了运维了数据库这么多年的人,还写这样层次的文章,博主应该检讨一下
zs21cn 于 2012-02-09 @ 06:15:48 留言 :
非常精辟的文章
如果能顺带讲解一下为什么要把BLOCK SIZE设置成32K,或者设置成不同的BLOCK SIZE的影响就完美了
小荷 于 2012-02-10 @ 16:13:28 留言 :
re c111:让你见笑了,不好意思。下次努力憋点深度的文章出来。
yanshoupeng 于 2012-02-11 @ 16:38:22 留言 :
深度不深度无所谓,适用就是好文章。
小荷 于 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的原因。
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
小荷 于 2012-02-17 @ 10:29:27 留言 :
re Sidney: 谢谢指出。你是对的。rdba是后后22位表示block number。后面的22位最大是1111111111111111111111,即4194303, 8k×4194303=32G。我会修改我的文章。非常高兴你指出我的错误。