Chinaunix首页 | 论坛 | 博客
  • 博客访问: 147118
  • 博文数量: 23
  • 博客积分: 1536
  • 博客等级: 上尉
  • 技术积分: 271
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-26 20:01
文章分类

全部博文(23)

文章存档

2010年(13)

2009年(10)

我的朋友

分类: Oracle

2010-05-09 15:46:36

今天在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了。
 
 
 
阅读(3329) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~