天天看點

Oracle ASM 翻譯系列第十三彈:ASM 進階知識 - Forcing the issueForcing the issue

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>