asm中有部分的指令提供了force選項,它允許管理者不以預設的行為來做某些操作。在一些操作上使用force選項是十分安全且必要的,但一些操作上去使用就可能會緻使磁盤組不可用,本文會針對具體的情況做詳細說明。
在對一個磁盤組做mount操作時,如果磁盤組的磁盤成員中有磁盤不可用時,就會需要使用到force選項。這是前面所提到“十分安全且必要”的使用場景之一。假定不是太多磁盤不可用,帶force選項的mount磁盤組一般都會成功。根本上,要滿足故障磁盤的每一個具有partnership關系的盤都必須是可用的。
接下來我們建立一個名稱為play的normal備援的磁盤組,它包含了三個磁盤,如果不指定failgroup,每一個磁盤其實都是一個獨立的failgroup:
sql> create diskgroup play disk '/dev/asmplay01','/dev/asmplay02','/dev/asmplay03';
diskgroup created.
之後,我們對磁盤組進行了dismount,然後删除了路徑為/dev/asmplay01磁盤。再次mount磁盤組時,asm就會有磁盤不可用的報錯。
sql> alter diskgroup play mount;
alter diskgroup play mount
*
error at line 1:
ora-15032: not all alterations performed
ora-15040: diskgroup is incomplete
ora-15042: asm disk "0" is missing from group number "2"
因為我們隻有一個磁盤不可用(normal備援的磁盤組),可以使用force選項來mount磁盤組。
sql> alter diskgroup play mount force;
diskgroup altered.
這個指令執行後,asm會在背景做一些清除操作,例如它會将不可用的磁盤辨別為offline,最終這個磁盤會從磁盤組中drop。這些操作會被記錄在asm的alert日志中。
sql> alter diskgroup play mount force
note: cache registered group play number=2 incarn=0xb71d3834
note: cache began mount (first) of group play number=2 incarn=0xb71d3834
note: assigning number (2,2) to disk (/dev/asmplay03)
note: assigning number (2,1) to disk (/dev/asmplay02)
...
note: process _user5733_+asm (5733) initiating offline of disk 0.3916286251 () with
mask 0x7e in group 2
note: checking pst: grp = 2
gmon checking disk modes for group 2 at 29 for pid 19, osid 5733
note: checking pst for grp 2 done.
warning: disk 0 () in group 2 mode 0x7f is now being offlined
success: diskgroup play was mounted
success: alter diskgroup play mount force
warning: pst-initiated drop of 1 disk(s) in group 2(.3072145460))
sql> alter diskgroup play drop disk play_0000 force /* asm server */
note: starting rebalance of group 2/0xb71d3834 (play) at power 1
starting background process arb0
success: alter diskgroup play drop disk play_0000 force /* asm server */
arb0 started with pid=21, os id=5762
note: assigning arb0 to group 2/0xb71d3834 (play) with 1 parallel i/o
success: pst-initiated drop disk in group 2(3072145460))
note: f1x0 copy 1 relocating from 0:2 to 2:2 for diskgroup 2 (play)
note: f1x0 copy 3 relocating from 2:2 to 65534:4294967294 for diskgroup 2 (play)
note: attempting voting file refresh on diskgroup play
note: stopping process arb0
success: rebalance completed for group 2/0xb71d3834 (play)
success: grp 2 disk _dropped_0000_play going offline
非常有趣的是,我們隻是做了磁盤組的force mount,從日志中看到了asm其實還使用force選項進行磁盤的drop操作。後面會有關于這點的詳細說明。
在叢集中,隻有第一個mount該磁盤組的asm執行個體,才能成功進行帶有force選項的mount操作。
從asm版本11.2.0.3開始,在exadata和oracle database appliance環境中,帶磁盤組force選項的mount行為會有一點變化:不使用force選項也能mount磁盤組,這隻要normal備援的磁盤組不多于一個failgroup或者high備援的磁盤組不多于兩個failgroup不可用。
需要注意的是本節的讨論僅針對normal和high備援的磁盤組。如果是external備援的磁盤組有不可用磁盤,不能使用force來将其mount。
create diskgroup指令沒有force選項。但如果建立磁盤組時,磁盤的狀态不是candidate, provisioned 或 former這三者之一,需要在磁盤裝置名後面加上force選項。舉例如下:
sql> create diskgroup play disk
'/dev/asmplay01','/dev/asmplay02','/dev/asmplay03';
create diskgroup play disk '/dev/asmplay01','/dev/asmplay02','/dev/asmplay03'
ora-15018: diskgroup cannot be created
ora-15033: disk '/dev/asmplay01' belongs to diskgroup "play"
sql> select disk_number, path, header_status from v$asm_disk where path like
'%play%';
disk_number path header_status
----------- ---------------- ----------------
0 /dev/asmplay01 member
2 /dev/asmplay02 former
1 /dev/asmplay03 former
sql>
如果是百分百确認使用/dev/asmplay01磁盤是安全的,可以在create diskgroup語句中磁盤裝置名後面加上force選項。
'/dev/asmplay01' force,
'/dev/asmplay02',
'/dev/asmplay03';
再次強調。對磁盤的重用必須是百分百确認的,任何未經确認的操作都是不允許且風險極大的,這将會破壞磁盤上的内容,同時不再屬于原來的磁盤組。
對alter diskgroup指令的add disk操作其實遵循相同的原則,如果添加到磁盤組中的磁盤的狀态不是candidate, provisioned 或 former這三項之一,需要在磁盤裝置名後面加force選項。
這樣的操作過程是有時候是有趣且耗時的,在一台包含168個磁盤全配置的exadata上建立一個磁盤組,本來應該隻是一個很小的操作,建立磁盤組的語句如下:
create diskgroup reco
disk 'o/*/reco*'
attribute
'compatible.asm'='11.2.0.0.0',
'compatible.rdbms'='11.2.0.0.0',
'au_size'='4m',
'cell.smart_scan_capable'='true';
由于一些與本節無關的原因,exadata的一部分磁盤的磁盤頭被辨別為member,另外一部分是former。是以先要拼出一份所有磁盤的完整清單,再在create diskgroup語句中指定每塊磁盤,并確定在每一個member磁盤頭的裝置名邊上加上force選項,在任意一個former磁盤頭的裝置名邊上沒有(不能有,否則會報錯)force選項。類似的建立語句如下:
create diskgroup reco disk
'o/192.168.10.1/reco_cd_00_exacel01',
'o/192.168.10.1/reco_cd_01_exacel01',
'o/192.168.10.1/reco_cd_02_exacel01',
'o/192.168.10.1/reco_cd_03_exacel01',
'o/192.168.10.1/reco_cd_04_exacel01' force,
'o/192.168.10.1/reco_cd_05_exacel01',
'o/192.168.10.1/reco_cd_06_exacel01',
'o/192.168.10.1/reco_cd_07_exacel01',
'o/192.168.10.1/reco_cd_08_exacel01',
'o/192.168.10.1/reco_cd_09_exacel01',
'o/192.168.10.1/reco_cd_10_exacel01',
'o/192.168.10.1/reco_cd_11_exacel01' force,
'o/192.168.10.2/reco_cd_00_exacel02',
'o/192.168.10.2/reco_cd_01_exacel02',
'o/192.168.10.2/reco_cd_02_exacel02',
'o/192.168.10.2/reco_cd_03_exacel02' force,
'o/192.168.10.2/reco_cd_04_exacel02' force,
'o/192.168.10.2/reco_cd_05_exacel02',
'o/192.168.10.2/reco_cd_06_exacel02',
'o/192.168.10.2/reco_cd_07_exacel02' force,
'o/192.168.10.2/reco_cd_08_exacel02',
'o/192.168.10.2/reco_cd_09_exacel02',
'o/192.168.10.2/reco_cd_10_exacel02',
'o/192.168.10.2/reco_cd_11_exacel02',
'o/192.168.10.3/reco_cd_00_exacel03',
'o/192.168.10.3/reco_cd_01_exacel03',
'o/192.168.10.3/reco_cd_02_exacel03' force,
'o/192.168.10.3/reco_cd_03_exacel03',
'o/192.168.10.14/reco_cd_11_exacel14'
在前面的asm的alert log中可以看到,當磁盤故障或者因某種原因不能被asm所通路時,asm就會對其進行帶有force選項的drop操作。當不帶有force選項的alter diskgroup ... drop disk 指令執行時,asm會把被drop磁盤上的資料遷移磁盤組中可用的磁盤上去,然後将這塊磁盤辨別為former,更新pst表,最後drop磁盤。
如果asm不能通路這個磁盤(将被drop的),就必需使用帶有force選項drop操作。這種情況下,asm将會從它的partner磁盤上拷貝資料。一旦備援級别重新恢複,就會更新pst表來說明磁盤不再是磁盤組的成員。由于asm不能通路這個磁盤,它就不能把磁盤辨別為former。
譯者注:drop force選項磁盤頭不會有任何變化,也就是說如果這塊盤後面可以通路到了,它的磁盤頭的狀态依然是member,但是之前磁盤組的pst資訊裡已經沒有這個磁盤的資訊。這塊盤後續如果要繼續添加到其它磁盤組,需要在添加磁盤時指定force選項。
對于asm來說,如果要drop一個磁盤組,需要它處于mount狀态。如果磁盤組由于某些原因不能mount起來,但是必需drop,可以通過帶force選項的drop diskgroup指令,指令如下:
sql> drop diskgroup play force including contents;
diskgroup dropped.
如果asm偵測到磁盤組在其他位置節點上處于mount狀态(比如在叢集環境中),這個操作會失敗。
譯者注:正常情況下,執行磁盤組的drop操作,磁盤組的狀态隻有在執行drop操作的執行個體上需要為mount,其他執行個體都必須dismount。
如果磁盤組在使用當中,asm不允許dismount磁盤組。但是可以使用force選項來對磁盤組進行dismount(即使有檔案在磁盤組中仍然處于打開狀态),舉例如下:
sql> alter diskgroup play dismount;
alter diskgroup play dismount
ora-15027: active use of diskgroup "play" precludes its dismount
從報錯中可以得到,有資料庫正在使用play磁盤組。
sql> select group_number, db_name, status from v$asm_client;
group_number db_name status
------------ -------- ------------
1 br connected
2 br connected
我們使用帶force選項的dismount指令強行對play磁盤組做dismount操作:
sql> alter diskgroup play dismount force;
note that the forced disk group dismount will cause all datafiles in that database to go offline, which means they will need recovery (and restore if i drop disk group play).
注意對磁盤組的強行dismount操作會導緻資料庫的所有資料檔案offline,這意味着它們在下次啟動時需要進行recovery。
alter diskgroup指令的undrop disks子句會取消本磁盤組中所有處于pending狀态的drop磁盤的操作。但是undrop disks不能被用來恢複drop diskgroup語句執行後被drop的磁盤和帶有force選項drop掉的磁盤。
force選項在asmcmd指令行中等同于 -f 辨別和xml配置檔案中的force關鍵字。
asmcmd指令行的一個增強功能也與本節的内容相關。asmcmd lsdsk指令加上-m辨別能顯示出對所有活動的asm執行個體僅部分可見的磁盤。asmcmd相關的幫助指令如下:
$ asmcmd help lsdsk
lsdsk
list oracle asm disks.
lsdsk [-kptgmi][-g diskgroup ] [--suppressheader] [ --member|--candidate] [--discovery][--statistics][pattern]
lsdsk指令的-m參數解釋如下:
-m -展示了對一些執行個體可見對另一些執行個體不可見的asm磁盤,如果這些磁盤對于某個執行個體不可見,那麼在這些執行個體中就會導緻mount磁盤組失敗。
了解force選項的強大功能非常重要,在使用它時必需萬分小心,如果你對它在各個操作中的含義還不甚了解,那麼使用它将可能會非常危險。
<b>本文來自雲栖社群合作夥伴“dbgeek”</b>