今天同事在review change的时候看到有个给表空间加数据文件的,发现加的数据文件竟然超过了32G,按照原来的思维,在9i中,非bigfile的单个数据文件单个大小不能超过32G。这个加32G数据文件的change是不是有误?查了一下原来的表空间情况,发现已经存在127.99G的数据文件了。该数据库不是9i,且该表空间下含多个数据文件。
我们先来看一下该表空间的信息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
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一个看看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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: 0x05000003,这是datafile中data block的地址,该值得取值范围从0x00000000到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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
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只是一个默认情况,知其然,知其所以然,才能更好的了解数据库。
8条评论
经典,Nice article.
作为一个接触了运维了数据库这么多年的人,还写这样层次的文章,博主应该检讨一下
非常精辟的文章
如果能顺带讲解一下为什么要把BLOCK SIZE设置成32K,或者设置成不同的BLOCK SIZE的影响就完美了
re c111:让你见笑了,不好意思。下次努力憋点深度的文章出来。
深度不深度无所谓,适用就是好文章。
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的原因。
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
re Sidney: 谢谢指出。你是对的。rdba是后后22位表示block number。后面的22位最大是1111111111111111111111,即4194303, 8k×4194303=32G。我会修改我的文章。非常高兴你指出我的错误。