今天在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) |