SQL> show parameter db_block_size
NAME TYPE VALUE
-------------- ----------- ------
db_block_size integer 8192
SQL> SELECT file_name, file_id, tablespace_name, BYTES, blocks, status, relative_fno, maxbytes, maxblocks, online_status FROM dba_data_files;
FILE_NAME FILE_ID TABLESPACE_NAME BYTES BLOCKS STATUS RELATIVE_FNO MAXBYTES MAXBLOCKS ONLINE_
---------------------------------------------- ---------- -------------------- ---------- ---------- --------- ------------ ---------------------- ---------- -------
/u01/app/oracle11g/oradata/test/system01.dbf 1 SYSTEM 807403520 98560 AVAILABLE 1 34359721984 4194302 SYSTEM
/u01/app/oracle11g/oradata/test/sysaux01.dbf 2 SYSAUX 880803840 107520 AVAILABLE 2 34359721984 4194302 ONLINE
/u01/app/oracle11g/oradata/test/undotbs01.dbf 3 UNDOTBS1 1073741824 131072 AVAILABLE 3 34359721984 4194302 ONLINE
/u01/app/oracle11g/oradata/test/users01.dbf 4 USERS 687865856 83968 AVAILABLE 4 34359721984 4194302 ONLINE
/u01/app/oracle11g/oradata/test/example01.dbf 5 EXAMPLE 104857600 12800 AVAILABLE 5 34359721984 4194302 ONLINE
/u01/app/oracle11g/oradata/test/rman01.dbf 6 RMAN 67108864 8192 AVAILABLE 6 34359721984 4194302 ONLINE
/u01/app/oracle11g/oradata/test/tools01.dbf 7 TOOLS 67108864 8192 AVAILABLE 7 34359721984 4194302 ONLINE
/u01/app/oracle11g/oradata/test/test01.dbf 8 TEST 67108864 8192 AVAILABLE 8 34359721984 4194302 ONLINE
8 rows selected.
--我使用的数据文件都是smallfile,可以发现最大文件大小MAXBYTES=34359721984,最大允许的块MAXBLOCKS=4194302。
--4194302 *8192 正好等于 34359721984。
而
SQL> select 34359721984/1024/1024/1024 from dual ;
34359721984/1024/1024/1024
--------------------------
31.9999847
并没有达到32G。为什么呢?
主要是由于在Oracle的Rowid中使用22位来代表Block号,这22位最多只能代表2^22-1(4194303)个数据块.
[补充一点,每个数据文件的第一个块(block 0 )是OS block header,在数据库中查询不到信息,记录的是OS信息,以及文件大小的等信息]
$ ls -l /u01/app/oracle11g/oradata/test/test01.dbf
-rw-r----- 1 oracle11g oinstall 67117056 Nov 14 00:06 /u01/app/oracle11g/oradata/test/test01.dbf
--可以发现ls -l看到的与dba_data_files查询到的存在差异! 67117056 - 67108864 = 8192.正好相差1个块。
--也就是如果你建立一个64M的数据文件,实际上的os看文件的大小是64*1024*1024+8192=67117056.
--从v$datafile视图也可以发现:
SQL> SELECT block1_offset,name FROM v$datafile;
BLOCK1_OFFSET NAME
------------- --------------------------------------------------
8192 /u01/app/oracle11g/oradata/test/system01.dbf
8192 /u01/app/oracle11g/oradata/test/sysaux01.dbf
8192 /u01/app/oracle11g/oradata/test/undotbs01.dbf
8192 /u01/app/oracle11g/oradata/test/users01.dbf
8192 /u01/app/oracle11g/oradata/test/example01.dbf
8192 /u01/app/oracle11g/oradata/test/rman01.dbf
8192 /u01/app/oracle11g/oradata/test/tools01.dbf
8192 /u01/app/oracle11g/oradata/test/test01.dbf
8 rows selected.
这样实际上2^22-2=4194302.也就是最大允许的数据块是4194302。实际8k数据块数据文件最大从OS看就是34359721984+8192=34359730176.