今天朋友在aix 5.3系統上安裝oracle 10g 建庫是用裸設備時候,dbca建庫到2%報錯退出,觀察alert日誌發現是temp表空間空間不足導致。查看該表空間數據文件所在的裸設備容量爲512M,建庫時候給出的數據文件大小也是512M。也許是因爲aix系統以1000進制計算,而oracle數據庫計算容量是以1024進制導致差距,隨即將oracle數據文件大小改爲500M,則正常通過。
但是,在alert日誌中不斷爆出warning提示:WARNING: You are creating datafile /dev/temp01.
WARNING: Oracle recommends creating new datafiles on devices with zero offset. The command "/usr/sbin/mklv -y LVname -T O -w n -s n -r n VGname NumPPs" can be used. Please contact Oracle customer support for more details。通過查詢資料以及朋友的幫助,終於找到了問題原因並得到解決方法。
AIX在創建vg時有3中vg類型可選,分別是 Original Volume Group,Big Volume Group和Scalable Volume Group
對於普通的VG(Original Volume Group),不管你使用什麼命令創建lv,都是普通的DS_LV類型的LV。
對於Big VG,是唯一允許同時存在這兩種LV類型的VG,如果我們指定-T O(注意,這裏是大寫的字母O),則創建DS_LVZ類型的LV,否則,創建普通類型的LV。如
/usr/sbin/mklv -y LVname -T O -w n -s n -r n VGname NumPPs。
對於Scalable-type VG類型的VG,不管你使用什麼方式的命令創建lv,都是擴展的DS_LVZ類型的LV。
由Oracle的警告日誌可以看出,Oracle 使用raw設備時,建議設置不帶4k的lv。
AIX將這4k偏移量稱之爲lvcb(logical volume control block),它將佔用4k的前512個字節,它類似於Oracle數據文件頭,保留有lv的創建時間,鏡像拷貝信息,文件系統掛載點等。
從2個方面可以查看lv是否有4k偏移量
1、主機層面
沒有4k偏移量:
引用
#lslv jfkdb_2G_044
LOGICAL VOLUME: jfkdb_2G_044 VOLUME GROUP: jfk_dbvg_01
LV IDENTIFIER: 00c3dff400004c00000001217a9d839e.84 PERMISSION: read/write
VG STATE: active/complete LV STATE: closed/syncd
TYPE: raw WRITE VERIFY: off
MAX LPs: 1024 PP SIZE: 32 megabyte(s)
COPIES: 1 SCHED POLICY: parallel
LPs: 64 PPs: 64
STALE PPs: 0 BB POLICY: relocatable
INTER-POLICY: maximum 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
有4k偏移量:
引用
[root@jfk_p560q /]# lslv jfkdb_2G_044
LOGICAL VOLUME: jfkdb_2G_044 VOLUME GROUP: jfk_db_vg01
LV IDENTIFIER: 00ce76de00004c00000001134ee6bc51.84 PERMISSION: read/write
VG STATE: active/complete LV STATE: opened/syncd
TYPE: raw WRITE VERIFY: off
MAX LPs: 1024 PP SIZE: 32 megabyte(s)
COPIES: 1 SCHED POLICY: parallel
LPs: 64 PPs: 64
STALE PPs: 0 BB POLICY: relocatable
INTER-POLICY: maximum RELOCATABLE: yes
INTRA-POLICY: middle UPPER BOUND: 16
MOUNT POINT: N/A LABEL: None
MIRROR WRITE CONSISTENCY: on/ACTIVE
EACH LP COPY ON A SEPARATE PV ?: yes
Serialize IO ?: NO
(2)Oracle層面:
Oracle提供了一小工具dbfsize(在$ORACLE_HOME/bin下)用於觀察lv是否有4k偏移量
無4k偏移量:
引用
$ dbfsize /dev/rlvsysaux_1g
Database file: /dev/rlvsysaux_1g
Database file type: raw device without 4K starting offset
Database file size: 40960 8192 byte blocks
有4k偏移量:
引用
[oracle@jfk_p560q /dev]$ dbfsize /dev/rjfkdb_2G_054
Database file: /dev/rjfkdb_2G_054
Database file type: raw device
Database file size: 262016 8192 byte blocks
如果數據庫使用block size爲16k,創建跨pv帶有4k偏移的lv,條帶塊大小爲64k。這樣將導致第4個block橫跨2個pv(條帶化操作,把lvcb也計算進條帶塊中)。這樣會導致
條帶塊的第4個Oracle block跨磁盤,撇開性能方面考慮,如果系統異常宕機,或者存儲異常宕機,極易引起數據庫塊損壞,引起ora-01578錯誤。(metalink ID 261460.1)
引用
$ oerr ora 01578
01578, 00000, "ORACLE data block corrupted (file # %s, block # %s)"
// *Cause: The data block indicated was corrupted, mostly due to software
// errors.
// *Action: Try to restore the segment containing the block indicated. This
// may involve dropping the segment and recreating it. If there
// is a trace file, report the errors in it to your ORACLE
// representative.
也就是說,使用Original Volume Group時候無法通過參數來取消4k offerset,唯一的辦法就是將oracle數據庫db_block_size設置爲4k。(不推薦使用)
而使用big VG的時候,可以通過創建LV加入-T -O參數來實現創建DS_LVZ類型的LV,從而取消前面4K的偏移量。(但傳說big vg有已知的bug,顧不推薦使用)。
而Scalable-type VG類型的VG,無論如何創建LV都是不帶4K偏移量的,且支持的pp更多,支持單個文件容量最大。(強烈推薦使用)