今天,查看一個數據庫時,發現這個數據庫沒有使用到powerpath提供的多路徑盤上。
這個數據庫使用EMC的存儲,操作系統是Linux,使用了asm lib包。
查看/dev/oracleasm/disks下的盤時:
#cd /dev/oracleasm/disks
#ls -l
admin@dbrac1:/dev/oracleasm/disks>ls -l
total 0
brw-rw―- 1 oracle dba 65, 17 Jun 18 16:44 ASM_VOL1
brw-rw―- 1 oracle dba 65, 1 Jun 18 16:44 ASM_VOL10
brw-rw―- 1 oracle dba 65, 33 Jun 18 16:44 ASM_VOL11
brw-rw―- 1 oracle dba 8, 113 Jun 18 16:44 ASM_VOL12
brw-rw―- 1 oracle dba 8, 225 Jun 18 16:44 ASM_VOL13
brw-rw―- 1 oracle dba 8, 129 Jun 18 16:44 ASM_VOL14
brw-rw―- 1 oracle dba 8, 81 Jun 18 16:44 ASM_VOL15
#cd /dev
#ls -l |grep “65, ”
admin@dbrac1:/dev>ls -l |grep “65, ”
brw-r―- 1 root disk 65, 0 Jun 19 00:42 sdq
brw-r―- 1 root disk 65, 1 Jun 18 16:44 sdq1
brw-r―- 1 root disk 65, 16 Jun 19 00:42 sdr
brw-r―- 1 root disk 65, 17 Jun 18 16:43 sdr1
發現/dev/oracleasm/disks下面的盤居然不是對應到/dev/emcpowerXX盤,
由此基本確定了asm lib沒有使用多路徑的盤,原先創建asm disk明明是使用
/dev/emcpower盤建立的:
/usr/sbin/asmtool -C -l /dev/oracleasm -n ASM_VOL1 -s /dev/emcpowera1
現在為何不是了?
通過分析asm lib的原理,基本清楚原因是這樣的:
asm lib包只是對盤起一個名字,如“ASM_VOL1″,然後把這個名字存入磁盤的內容的頭部。
下次機器自動啟動時,會自動運行/etc/rc.d/init.d/oracleasm start,這時會自動掃描硬盤,
掃描過程中,是會讀前面我們寫入名稱,由於使用了多路徑,那麼在/dev/下會有幾個設備名對
應著同一個硬盤,其中/dev/sdXX的是各個路徑盤,/dev/emcpowerXX是把這些路徑合並了一個
盤,正常情況下我們都會要求asmlib使用/dev/emcpowerXX盤,但asm lib的掃描規則是使用最先掃描到的盤,
後面再掃描到的設備,只要上面的名稱與前面相同,就使用前面的設備名,不管再次掃描到的了。
而一般情況下,asm lib都會先掃描到/dev/sdXX盤,而不是/dev/emcpowerXX的盤,由此導致了
此問題的發生。
其實oracle的官方網站也說了此問題:
http://www.oracle.com/technology/tech/linux/asmlib/multipath.html
解決方法就是修改配置文件中asm lib的掃描順序,在/etc/sysconfig/oracleasm中配置如下內容:
ORACLEASM_SCANORDER=”emc sd”
這樣掃描時會先掃描/dev/下emc開頭的文件,然後才會是/dev下sd開頭的文件。
這個問題很隱蔽,在安裝asm lib時,沒有任何地方提示需要配置這個掃描順序,
當用/usr/sbin/asmtool -C -l /dev/oracleasm -n ASM_VOL1 -s /dev/emcpowera1建asm lib盤時,
也會正確建立在多路徑盤上,但當機器重新啟動後,asm lib重新掃描磁盤時,就會掃到錯誤的盤上。