天天看点

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>