12C/11g asmlib导致ocr丢失恢复的全过程

一、问题背景

客户一套12C的数据库,CRS无法启动,经过简单的查看发现OCR的磁盘出现了问题。客户使用ASMLIB包实现将物理磁盘转换成Oracle能识别的ASM的磁盘。为了达到冗余的目的,客户使用了3块2G的物理盘用于创建OCR。默认情况下通过ASMLIB包绑定后,我们是应该可以看到可用的3个ASM磁盘的,但是不知道是什么原因,导致只能看到一个磁盘。

[10:21:17][email protected]:/dev/oracleasm/disks> ls -l
[10:21:17]total 0
[10:21:17]brw-rw---- 1 grid asmadmin 8,  81 Jan 20 19:05 ASMDATA1
[10:21:17]brw-rw---- 1 grid asmadmin 8,  82 Jan 20 19:05 ASMDATA2
[10:21:17]brw-rw---- 1 grid asmadmin 8,  83 Jan 20 19:05 ASMDATA3
[10:21:17]brw-rw---- 1 grid asmadmin 8,  84 Jan 20 19:05 ASMDATA4
[10:21:17]brw-rw---- 1 grid asmadmin 8,  85 Jan 20 19:05 ASMDATA5
[10:21:17]brw-rw---- 1 grid asmadmin 8, 144 Jan 20 19:05 ASMOCR2G3

可以看到本来应该有ASMOCR2G1, ASMOCR2G2, ASMOCR2G3三个磁盘的,而现在只有ASMOCR2G3了。那么是不是磁盘头发生了损坏,导致我们不能识别呢?

[10:39:11]oracle12c01:~ # /oracle/app/12.1.0/grid/bin/kfed read /dev/mapper/emc2G01
[10:39:12]kfbh.endian:                          1 ; 0x000: 0x01
[10:39:12]kfbh.hard:                          130 ; 0x001: 0x82
[10:39:12]kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEAD
[10:39:12]kfbh.datfmt:                          1 ; 0x003: 0x01
[10:39:12]kfbh.block.blk:                       0 ; 0x004: blk=0
[10:39:12]kfbh.block.obj:              2147483648 ; 0x008: disk=0

[10:39:37]oracle12c01:~ # /oracle/app/12.1.0/grid/bin/kfed read /dev/mapper/emc2G02
[10:39:37]kfbh.endian:                          1 ; 0x000: 0x01
[10:39:37]kfbh.hard:                          130 ; 0x001: 0x82
[10:39:37]kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEAD
[10:39:37]kfbh.datfmt:                          1 ; 0x003: 0x01
[10:39:37]kfbh.block.blk:                       0 ; 0x004: blk=0
[10:39:37]kfbh.block.obj:              2147483649 ; 0x008: disk=1

[10:35:46]oracle12c01:~ # /oracle/app/12.1.0/grid/bin/kfed read /dev/mapper/emc2G03
[10:35:49]kfbh.endian:                          0 ; 0x000: 0x00
[10:35:49]kfbh.hard:                            0 ; 0x001: 0x00
[10:35:49]kfbh.type:                            0 ; 0x002: KFBTYP_INVALID
[10:35:49]kfbh.datfmt:                          0 ; 0x003: 0x00
[10:35:49]kfbh.block.blk:                       0 ; 0x004: blk=0
[10:35:49]kfbh.block.obj:                       0 ; 0x008: file=0

通过kfed工具我们发现其实ASMOCR2G1和ASMOCR2G2的磁盘头都是正常的。而ASMLIB能识别的ASMOCR2G3确显示磁盘头是无效的。针对这种问题,我觉得一大部分原因可以归咎到ASMLIB上去,网上也有很多关于它和udev优缺点的讨论。那么我们探讨的是出现这种问题如何恢复。

二、故障解决

那么首先我们考虑的是以前的备份,如果以前OCR的备份是好的,那么我们直接恢复就可以了,但是问题在于你不清楚这些备份是不是好的。如果备份是无效的,那么我们还可以重建OCR。从风险和难易程度上来看,我们先用备份来恢复吧。

[11:04:56]oracle12c01:/oracle/app/12.1.0/grid/bin # ./ocrconfig –showbackup
[11:05:02]PROT-26: Oracle Cluster Registry backup locations were retrieved from a local copy
[11:05:02]oracle12c01     2015/01/20 17:22:43     /oracle/app/12.1.0/grid/cdata/oracle1-cluster/backup00.ocr
[11:05:02]oracle12c01     2015/01/20 13:22:43     /oracle/app/12.1.0/grid/cdata/oracle1-cluster/backup01.ocr
[11:05:02]oracle12c01     2015/01/20 09:22:42     /oracle/app/12.1.0/grid/cdata/oracle1-cluster/backup02.ocr

[11:09:03]oracle12c01:/oracle/app/12.1.0/grid/bin # ./ocrconfig -restore  /oracle/app/12.1.0/grid/cdata/oracle1-cluster/backup00.ocr
[11:09:03]PROT-35: The configured OCR locations are not accessible

直接就报了这种错误,restore的时候OCR路径不可访问。那么这个情况是因为我们的asmlib下面看不到盘,所以我们要重新解决asmlib识别盘的问题。

[11:32:32]oracle12c01:/oracle/app/12.1.0/grid/bin # dd if=/dev/mapper/emc2G01 of=/tmp/ocr01.ocr bs=8192 count=10000000
[11:36:32]oracle12c01:/oracle/app/12.1.0/grid/bin # dd if=/dev/zero of=/dev/mapper/emc2G01 bs=8192 count=100000000
[11:37:03]oracle12c01:/oracle/app/12.1.0/grid/bin #  /etc/init.d/oracleasm createdisk ASMOCR2G1 /dev/mapper/emc2G01
[11:37:03]Marking disk "ASMOCR2G1" as an ASM disk:                                                                                                                               done

按照上面的操作把emc2G01,emc2G02,emc2G03都备份了一遍,然后格式掉后,重新用asmlib成功进行了绑定。绑定完成之后继续restore,发现还是报同样的错误。

[11:46:42]oracle12c01:/oracle/app/12.1.0/grid/bin # ./ocrconfig -restore /oracle/app/12.1.0/grid/cdata/oracle1-cluster/backup01.ocr
[11:46:42]PROT-35: The configured OCR locations are not accessible

可以看到仍然和以前错误一样的。所以,我们还是去Metalink上搜一搜这种情况,究竟该怎么restore。我们可以参考metalink上的文档: How to restore ASM based OCR after complete loss of the CRS diskgroup on Linux/Unix systems (
文档
ID 1062983.1)


1.
停止CRS软件,两个节点都要停掉

[13:44:11]oracle12c01:/oracle/app/12.1.0/grid/bin # ./crsctl stop crs –f


2.
启动CRS到exclusive mode

[13:44:50]oracle12c01:/oracle/app/12.1.0/grid/bin # ./crsctl start crs -excl -nocrs

文档中作完这一步就是重新使用asmlib包去标记物理磁盘,而这一步骤我们前面已经做过了,所以剩下的步骤就是在sqlplus里面创建磁盘组。


3.
使用sqlplus创建crs磁盘组

[14:12:53][email protected]:~> sqlplus / as sysasm
[14:12:53]SQL*Plus: Release 12.1.0.1.0 Production on Wed Jan 21 14:16:54 2015
[14:12:53]Copyright (c) 1982, 2013, Oracle.  All rights reserved.
[14:12:53]Connected to:
[14:12:53]Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
[14:12:53]With the Real Application Clusters and Automatic Storage Management options
[14:17:38]SQL> create diskgroup OCRDG external redundancy disk '/dev/oracleasm/disks/ASMOCR2G1', '/dev/oracleasm/disks/ASMOCR2G2', '/dev/oracleasm/disks/ASMOCR2G3'  attribute 'COMPATIBLE.ASM' = '12.1.0.0.0';
[14:17:53]Diskgroup created.

这里我们使用grid账号操作登陆到sqlplus里面进行操作,因为我是12.1.0.1.0的数据库,所以这里的asm兼容性参数也设置成了12.1.0.0.0.


4.Restore ocr
备份

切换到root用户下面执行ocr的还原,这次很顺利还原成功。

[14:18:49]oracle12c01:/oracle/app/12.1.0/grid/bin # ./ocrconfig -restore  /oracle/app/12.1.0/grid/cdata/oracle1-cluster/backup01.ocr
[14:20:53]oracle12c01:/oracle/app/12.1.0/grid/bin # ./ocrcheck
[14:20:53]Status of Oracle Cluster Registry is as follows :
[14:20:53]         Version                  :          4
[14:20:53]         Total space (kbytes)     :     409568
[14:20:53]         Used space (kbytes)      :       1460
[14:20:53]         Available space (kbytes) :     408108
[14:20:53]         ID                       : 1063957750
[14:20:53]         Device/File Name         :     +OCRDG
[14:20:53]                                    Device/File integrity check succeeded
[14:20:53]                                    Device/File not configured
[14:20:53]                                    Device/File not configured
[14:20:53]                                    Device/File not configured
[14:20:53]                                    Device/File not configured
[14:20:53]         Cluster registry integrity check succeeded
[14:20:55]         Logical corruption check succeeded


5.
重新创建Voteing Disk

[14:21:10]oracle12c01:/oracle/app/12.1.0/grid/bin # ./crsctl replace votedisk +OCRDG
[14:21:12]CRS-4602: Failed 27 to add voting file aa67b0c44b724f92bfc2e2a1d88f6b28.
[14:21:12]Failed to replace voting disk group with +OCRDG.
[14:21:12]CRS-4000: Command Replace failed, or completed with errors.

原本以为可以一路的顺畅到底,没想到啊,在创建votedisk的时候遇到了CRS-4602错误。这个问题根据文档: CRS-4256 CRS-4602 While Replacing Voting Disk (
文档
ID 1475588.1)
的描述,总共有4种可能性。

  • 这个命令必须是使用root用户执行;
  • ASM diskgroup 不是online或者空间不足;
  • ASM compatible attribute 不正确;
  • asm_diskstring参数没设置。

第一条和第三条,不存在这种问题。我们的问题可能是问题二和问题四。

SQL> select group_number  "Group"
,disk_number   "Disk"
,header_status "Header"
,mode_status   "Mode"
,state         "State"
,redundancy    "Redundancy"
,total_mb      "Total MB"
,free_mb       "Free MB"
,name          "Disk Name"
,failgroup     "Failure Group"
,path          "Path"
from   v$asm_disk
order by group_number
,disk_number
/
[14:47:37]Group Disk Header Mode    State    Redunda   Total MB  Free MB Disk Name  Failure Group   Path
[14:47:37]----- ---- -------------- -------- ------- --------------------------------------------   -----
[14:47:37]    1    0 MEMBER ONLINE  NORMAL   UNKNOWN       1024  949 OCRDG_0000     OCRDG_0000      /dev/oracleasm/disks/ASMOCR2G1
[14:47:37]    1    1 MEMBER ONLINE  NORMAL   UNKNOWN       1024  947 OCRDG_0001     OCRDG_0001      /dev/oracleasm/disks/ASMOCR2G2
[14:47:37]    1    2 MEMBER ONLINE  NORMAL   UNKNOWN       1024  951 OCRDG_0002     OCRDG_0002      /dev/oracleasm/disks/ASMOCR2G3

可以看到我们的磁盘组是刚刚创建的,空间也是足够的。然后检查asm_diskstring的值,发现是空的。

[15:05:01]SQL> show parameter disk
[15:05:01]
[15:05:01]NAME                                 TYPE        VALUE
[15:05:01]------------------------------------ ----------- ------------------------------
[15:05:01]asm_diskgroups                       string      OCRDG
[15:05:01]asm_diskstring                       string

于是只能重新配置参数。在ASM的alert日志里面找了一份历史的启动参数做了一个pfile文件。

[15:11:55][email protected]:/oracle/app/12.1.0/grid/dbs> sqlplus / as sysasm
[15:11:55]SQL*Plus: Release 12.1.0.1.0 Production on Wed Jan 21 15:15:57 2015
[15:11:55]Copyright (c) 1982, 2013, Oracle.  All rights reserved.
[15:11:55]Connected to an idle instance.
[15:12:36]SQL> startup pfile='/oracle/app/12.1.0/grid/dbs/initasm.ora';
[15:12:41]ASM instance started
[15:12:41]Total System Global Area 1135747072 bytes
[15:12:41]Fixed Size                  2297344 bytes
[15:12:41]Variable Size            1108283904 bytes
[15:12:41]ASM Cache                  25165824 bytes
[15:12:48]ASM diskgroups mounted
[15:12:48]ASM diskgroups volume enabled
[15:13:57]SQL> show parameter asm
[15:13:57]NAME                                 TYPE        VALUE
[15:13:57]------------------------------------ ----------- ------------------------------
[15:13:57]asm_diskgroups                       string
[15:13:57]asm_diskstring                       string      /dev/oracleasm/disks/*
[15:13:57]asm_power_limit                      integer     1
[15:13:57]asm_preferred_read_failure_groups    string

再次执行创建votedisk的操作,执行成功。

[15:14:30][email protected]:/oracle/app/12.1.0/grid/dbs> crsctl replace votedisk +OCRDG
[15:14:33]Successful addition of voting disk 08d0bf0676724fe7bf189d454cdfe158.
[15:14:33]Successfully replaced voting disk group with +OCRDG.
[15:14:33]CRS-4266: Voting file(s) successfully replaced

完成这一步后可以按照metalink文档重新创建asm的spfile并存放到ocr中,我这里没有创建,我发现也可以。只不过asm_diskstrings参数是空白的,官方文档对于这一步的操作也是可选的。

6.
重启CRS

以上操作完成之后,重启CRS到正常模式即可。这里建议最好按照官方文档的命令做一下asmlib的scandisk的操作。

[15:18:22]oracle12c01:/oracle/app/12.1.0/grid/bin # ./crsctl stop crs –f
[15:19:04]oracle12c01:/oracle/app/12.1.0/grid/bin # /usr/sbin/oracleasm scandisks
[15:19:05]Reloading disk partitions: done
[15:19:05]Cleaning any stale ASM disks...
[15:19:05]Scanning system for ASM disks...
[15:19:13]oracle12c01:/oracle/app/12.1.0/grid/bin # ./crsctl start crs
[15:19:21]CRS-4123: Oracle High Availability Services has been started.

[15:23:20]SQL> select name,state from v$asm_disk;
[15:23:20]
[15:23:20]NAME                           STATE
[15:23:20]------------------------------ --------
[15:23:20]OCRDG_0002                     NORMAL
[15:23:20]OCRDG_0001                     NORMAL
[15:23:20]OCRDG_0000                     NORMAL
[15:23:20]DATADG1_0001                   NORMAL
[15:23:20]DATADG2_0002                   NORMAL
[15:23:20]DATADG2_0001                   NORMAL
[15:23:20]DATADG2_0000                   NORMAL
[15:23:20]DATADG1_0000                   NORMAL


参考文档:


How to restore ASM based OCR after complete loss of the CRS diskgroup on Linux/Unix systems (
文档
ID 1062983.1)


CRS-4256 CRS-4602 While Replacing Voting Disk (
文档
ID 1475588.1)

稿源:Buddy Yuan (源链) | 关于 | 阅读提示

本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » 后端存储 » 12C/11g asmlib导致ocr丢失恢复的全过程

喜欢 (0)or分享给?

专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录