互联网服务数据库Oracle

创建ORACLE数据文件时需要注意的地方(OS Header Block)

今天在AIX上作有关ORACLE 4K偏移量的测试,发现在SCALABLE VG上的LV即使没有了前面的LVCB的数据块,但是依然不能将LV上的所有空间用于该数据文件:1.检查VG是否SCALABLE VG# lsvg vg1VOLUME GROUP:       vg1         &nb...显示全部
今天在AIX上作有关ORACLE 4K偏移量的测试,发现在SCALABLE VG上的LV即使没有了前面的LVCB的数据块,但是依然不能将LV上的所有空间用于该数据文件:

1.检查VG是否SCALABLE VG
# lsvg vg1
VOLUME GROUP:       vg1                      VG IDENTIFIER:  0003744f00004c00000001286c0d50ae
VG STATE:           active                   PP SIZE:        4 megabyte(s)
VG PERMISSION:      read/write               TOTAL PPs:      238 (952 megabytes)
MAX LVs:            256                      FREE PPs:       204 (816 megabytes)
LVs:                4                        USED PPs:       34 (136 megabytes)
OPEN LVs:           2                        QUORUM:         2 (Enabled)
TOTAL PVs:          1                        VG DESCRIPTORS: 2
STALE PVs:          0                        STALE PPs:      0
ACTIVE PVs:         1                        AUTO ON:        yes
MAX PPs per VG:     32768                    MAX PVs:        1024
LTG size (Dynamic): 256 kilobyte(s)          AUTO SYNC:      no
HOT SPARE:          no                       BB POLICY:      relocatable
由以上属性MAX PVS=1024可以知道,该VG是SCALABLE VG

2.显示LV的容量
# lslv test
LOGICAL VOLUME:     test                   VOLUME GROUP:   vg1
LV IDENTIFIER:      0003744f00004c00000001286c0d50ae.4 PERMISSION:     read/write
VG STATE:           active/complete        LV STATE:       opened/syncd
TYPE:               jfs2                   WRITE VERIFY:   off
MAX LPs:            512                    PP SIZE:        4 megabyte(s)
COPIES:             1                      SCHED POLICY:   parallel
LPs:                4                      PPs:            4
STALE PPs:          0                      BB POLICY:      relocatable
INTER-POLICY:       minimum                RELOCATABLE:    yes
INTRA-POLICY:       middle                 UPPER BOUND:    1024
MOUNT POINT:        N/A                    LABEL:          None
MIRROR WRITE CONSISTENCY: on/ACTIVE                              
EACH LP COPY ON A SEPARATE PV ?: yes                                    
Serialize IO ?:     NO                                    
DEVICESUBTYPE : DS_LVZ
由以上输出得知该LV=4×4=16M

3.在LV上创建16M的数据文件
SQL> create tablespace testtbs datafile '/dev/rtest' size 16M;
create tablespace testtbs datafile '/dev/rtest' size 16M
*
ERROR at line 1:
ORA-01119: error in creating database file '/dev/rtest'
ORA-27042: not enough space on raw partition to fullfill request
Additional information: 1
Additional information: 1
提示没还有足够的空间来创建16M的数据文件;明明是16M的,怎么说空间不足呢?
试试在FS下创建数据文件看看

4.在FS上创建1000K的数据文件
SQL> create tablespace ricky datafile '/oracle/oradata/myoracle/ricky01.dbf' size 1000k;
Tablespace created.
SQL> commit;
Commit complete.

检查该数据文件的大小
SQL> host ls -l /oracle/oradata/myoracle/ricky01.dbf
-rw-r-----    1 oracle   dba         1032192 May 09 15:01 /oracle/oradata/myoracle/ricky01.dbf
1032192/1024=1008K
我明明创建的是1000K的数据文件啊,怎么占用了我1008K的空间呢?
原来这是因为建立数据文件时,ORACLE会在文件头另加一个“Oracle OS Header Block”,用来保存有这个文件的逻辑块大小和文件块数等信息;而这个BLOCK就等于db_block_size
SQL> show parameter block
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_buffers                     integer     0
db_block_checking                    string      FALSE
db_block_checksum                    string      TRUE
db_block_size                        integer     8192
db_file_multiblock_read_count        integer     16

1008-8刚好等于1000K
那么,在RAW上创建的数据文件,是否也需要这额外的8K呢?答案是肯定的
刚才我创建16M不成功,我们尝试创建一个比16M少7K的数据文件试试
16M就是1024*16=16384k
比16M少7K即是=16377k

SQL> create tablespace testtbs datafile '/dev/rtest' size 16377k;
create tablespace testtbs datafile '/dev/rtest' size 16377k
*
ERROR at line 1:
ORA-01119: error in creating database file '/dev/rtest'
ORA-27042: not enough space on raw partition to fullfill request
Additional information: 1
Additional information: 1

依然提示空间不够
那么尝试创建比16M少8K的数据文件呢?
SQL> create tablespace testtbs datafile '/dev/rtest' size 16376k;
Tablespace created.


great!

结论
因在ORACLE上创建数据文件后,实际的DATAFILE大小将比创建命令中SIZE指定的大小要大一个db_block_size;所以尤其在RAW环境中,需要注意DATAFILE的SIZE要小于该LV的SIZE。
如果是普通vg,那么记得减去db_block_size和4K OFFSET后,才是您想要创建的DATAFILE大小;
如果是BIG VG(MKLV时使用了-T O参数使ORACLE从0开始读写的的情况下)和SCALABLE VG则无需计算这4K的偏移量,因为ORACLE不再SKIP 4K了。收起
参与10

查看其它 9 个回答hehestr的回答

hehestrhehestr工程师inspur
说的很有道理啊!系统本来就是用来跑应用,仅仅只谈系统那系统就失去了存在的意义了。而且往往系统出问题都是和应用相关联的,仅仅只谈应用或者仅仅只谈系统,可能问题永远也解决不了。
IT分销/经销 · 2010-05-10
浏览1846

回答者

hehestr
工程师inspur

hehestr 最近回答过的问题

回答状态

  • 发布时间:2010-05-10
  • 关注会员:0 人
  • 回答浏览:1846
  • X社区推广