一. 准备知识
RAC ASM由于其高度的封装性,使得我们很难知道窥探其内部的原理。ASM如果一旦出现问题,通常都很难处理。即便在有很完备的RMAN备份的情况下,恢复起来都可能需要很长的时间。
而ASM 中最为脆弱的又是ASM disk header。如果disk header逻辑损坏了,即corrupt了,整个disk group将不能够mount,依赖于ASM实例的database也将不能够startup。
在RAC中增删节点后asm的disk header就很容易出现问题。如果是因为disk header的原因而需要重建整个diskgroup,进而用RMAN恢复就会浪费很多时间,所以最好的方法就是需要定期对ASM diskheader进行dd备份。
Oracle ASM 系列小结
http://blog.csdn.net/tianlesoftware/article/details/6364422
Oracle ASM详解
http://blog.csdn.net/tianlesoftware/article/details/5314541
官网的说明:
Introduction to Automatic StorageManagement (ASM)
http://download.oracle.com/docs/cd/B28359_01/server.111/b31107/asmcon.htm
1.1 什么是ASM(Automatic StorageManagement )
ASM是一个管理卷组或者文件系统的软件。它是通过ASM instance 来实现对磁盘的管理。 这个和Oracle instance 很类似。 ASM instance 也有SGA和background processes组成. 但是ASM 相对的task 很少,所以它的SGA 相对较小。
1.1.1 ASM instance
1
2
3
4
5
6
|
ASM instance 维护以下ASMmetadata:
(
1
)The disks that belong to a disk group
(
2
)The amount of space that is available in a disk group
(
3
)The filenames of the files in a disk group
(
4
)The location of disk group datafile dataextents
(
5
)A redo log that records information about atomically changing datablocks
|
ASM instace 通过维护asm metadata 来在file layout层面上对database instance提供支持。 一个ASM instance 可以对应多个database instance。
准确的说ASM 的Metadata 可以分为3种:
1
2
3
4
|
(
1
)diskgroup metadata: files
with
NUMBER_KFFIL <
256
ASM metadataandASMlog files. These files have high redundancy (
3
copies)
and
block size=4KB.
1
)ASM log filesare used
for
ASM instance
and
crash recovery when a crash happens
with
metadataoperations (seebelow COD
and
ACD)
2
)
at
diskgroupcreation
6
files withmetadata are visible
from
x$kffil(
2
)disk metadata: disk headers (typically the
first
2
AU ofeach disk)are
not
listed
in
x$kffil (they appear
as
file number
0
in
x$kfdat).Containdisk membership information. This part of the disk has to be
'zeroedout'
before
the disk can be added to ASM diskgroup
as
a
new
disk.
(
3
)file metadata:
3
mirrored extents
with
file metadata,visible fromx$kffxp
and
x$kfdat
|
1.1.2 ASM Disk groups
Diskgroups 由多个disks 组成,每个disk 就是我们的的一个分区。 ASM disk groups包含的metadata信息就是ASM instance 管理的信息。
大多数情况只需要创建很少的disk groups,一般是2个groups,很少有3个。
为了保护disks 上的数据,Oracle 对disk groups 有3种冗余方式:
(1)external redundancy表示Oracle不帮你管理镜像,功能由外部存储系统实现,比如通过RAID技术。 (2)normalredundancy(默认方式)表示Oracle提供2路镜像来保护数据。
(3)high redundancy表示Oracle提供3路镜像来保护数据。
如果使用ASM 的冗余,就是通过 ASMfailure group 来实现。ASM使用的镜像算法并不是镜像整个disk,而是作extent级的镜像。所以很明显如果为各个failure group使用不同容量的disk是不明智的,因为这样在Oracle分配下一个extent的时候可能就会出现问题。
在normal redundancy模式下,ASM环境中每分配一个extent都会有一个primary copy和一个second copy,ASM的算法保证了second copy和primary copy一定是在不同的failure group中,这就是failure group的意义。通过这个算法,ASM保证了即使一个failuregroup中的所有disk都损坏了,数据也是毫发无伤的。
Oracle在分配extent的时候,所有failure group中的这个将拥有相同数据的extent称为一个extent set,当Oracle将数据写入文件的时候,primary copy可能在任何一个failure group中,而second copy则在另外的failure group中,当Oracle读取数据的时候,除非是primary copy不可用,否则将优先从primary copy中读取数据,通过这种写入无序,读取有序的算法,Oracle保证了数据读取尽量分布在多个disk中。
因为公用一个硬件模块的磁盘很可能会同时损坏或者失效,所以通常我们在设计failuregroup时,应该把一个大的盘阵中在一个tray中的磁盘放在一个failuregroup中,这样我们就可以拿走一个tray,失效这个failure group,然后换上新的tray和磁盘,这跟RAID的思想是一样的。
ASM的冗余方式是在创建disk groups时指定的,一经设定就无法更改,如果我们想把normal redundancy改为high redundancy就只能是创建一个新的failure group,然后把旧failure group中的文件通过RMAN或者DBMS_FILE_TRANSFER的方法移动到新failure group中去。
如果在创建disk groups时,如果没有创建failure groups,即使没有显式指定,failure groups也是始终会创建的。在这种情况下,每个disk都属于一个failure group,在创建磁盘组的时候,failure group也会默认创建,名称就是disk的名字。
在我的blog:
Oracle ASM 相关的 视图(V$)和 数据字典(X$)
http://blog.csdn.net/tianlesoftware/article/details/6733039
里面提到了一些与ASM 相关的视图,可以通过v$asm_diskgroup 来查看groups 的信息。
SYS@+ASM2(rac2)> desc v$asm_diskgroup
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
Name Null? Type
------------------------------------------------- ----------------------------
GROUP_NUMBER NUMBER
NAME VARCHAR2(
30
)
SECTOR_SIZE NUMBER
BLOCK_SIZE NUMBER
ALLOCATION_UNIT_SIZE NUMBER
STATE VARCHAR2(
11
)
TYPE VARCHAR2(
6
)
TOTAL_MB NUMBER
FREE_MB NUMBER
REQUIRED_MIRROR_FREE_MB NUMBER
USABLE_FILE_MB NUMBER
OFFLINE_DISKS NUMBER
UNBALANCED VARCHAR2(
1
)
COMPATIBILITY VARCHAR2(
60
)
DATABASE_COMPATIBILITY VARCHAR2(
60
)
|
SYS@+ASM2(rac2)> select group_number,name,allocation_unit_size,total_mb from v$asm_diskgroup;
1
2
3
4
|
GROUP_NUMBER NAME ALLOCATION_UNIT_SIZE TOTAL_MB
------------ -------------------------------------------------- ----------
1
DATA
1048576
11993
2
FRA
1048576
7993
|
这里我们分配了2个disk groups,启动AU 大小为1M。 即默认值,关于AU 下节有说明。
1.1.3 ASM Disks
ASM disk 组成disk group,在OS 上的表现就是每个disk 对应一个分区。 ASM disks 由extent 组成,而每个extent 又由一个或者多个AU 组成。
1
2
3
|
Allocation Units
Every ASM disk is divided
into
allocation units (AU). An AU is the fundamental unitof allocation within a disk group. A file extent consists of one
or
more AU. AnASM file consists of one
or
more file extents.
When you create a disk group, you can setthe ASM AU size to be between
1
MB
and
64
MB
in
powers of two, such
as
,
1
,
2
,
4
,
8
,
16
,
32
,
or
64.
Larger AU sizes typically provide performance advantages fordata warehouse applications that use large sequential reads.
|
默认的AU 大小是1M。 这个在上节通过v$asm_diskgroup 视图可以查看,而已可以查看指定AU的参数:_asm_ausize
关于这个参数具体查看方法,参考:
Oracle ASM 相关的 视图(V$)和 数据字典(X$)
http://blog.csdn.net/tianlesoftware/article/details/6733039
中的第八小节。
我们也可以通过v$asm_disk视图来查看disk 的信息:
SYS@+ASM2(rac2)> desc v$asm_disk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
Name Null? Type
------------------------------------------------- ----------------------------
GROUP_NUMBER NUMBER
DISK_NUMBER NUMBER
COMPOUND_INDEX NUMBER
INCARNATION NUMBER
MOUNT_STATUS VARCHAR2(
7
)
HEADER_STATUS VARCHAR2(
12
)
MODE_STATUS VARCHAR2(
7
)
STATE VARCHAR2(
8
)
REDUNDANCY VARCHAR2(
7
)
LIBRARY VARCHAR2(
64
)
TOTAL_MB NUMBER
FREE_MB NUMBER
NAME VARCHAR2(
30
)
FAILGROUP VARCHAR2(
30
)
LABEL VARCHAR2(
31
)
PATH VARCHAR2(
256
)
UDID VARCHAR2(
64
)
PRODUCT VARCHAR2(
32
)
CREATE_DATE DATE
MOUNT_DATE DATE
REPAIR_TIMER NUMBER
READS NUMBER
WRITES NUMBER
READ_ERRS NUMBER
WRITE_ERRS NUMBER
READ_TIME NUMBER
WRITE_TIME NUMBER
BYTES_READ NUMBER
BYTES_WRITTEN NUMBER
|
SYS@+ASM2(rac2)> select group_number,disk_number,name,path from v$asm_disk;
1
2
3
4
|
GROUP_NUMBER DISK_NUMBER NAME PATH
------------ ----------------------------------------- ------------------------
1
0
DATA /dev/mapper/datap1
2
0
FRA_0000 /dev/mapper/frap1
|
1.1.4 ASM 文件的命名规则说明
ASM文件名字的格式是固定的:+group/dbname/file type/tag.file.incarnation
在创建db时系统自动创建的几个表空间(system,undotbs,sysaux,users)对应的都是真实的数据文件,即ASM 文件默认的命名格式。而且这个信息都写到了控制文件里。 如果我们使用别名的话,会方便很多。 对于这些创建数据库时自动创建的表空间,我们要他们使用别名,除了手工创建对应别名外,还需要重建控制文件,并且在重建时,datafile 里写别名的信息。 这样数据库也就使用别名了。
SYS@anqing2(rac2)> select file_id,file_name,AUTOEXTENSIBLE from dba_data_files order by 1;
1
2
3
4
5
6
7
8
9
10
|
FILE_ID FILE_NAME AUTOEXTENS
-------------------------------------------------- ----------
1
+DATA/anqing/datafile/system01.dbf YES
2
+DATA/anqing/datafile/undotbs01.dbf YES
3
+DATA/anqing/datafile/sysaux01.dbf YES
4
+DATA/anqing/datafile/users
.273.75154823
YES
5
+DATA/anqing/datafile/undotbs02.dbf YES
6
+DATA/anqing/datafile/system02.dbf YES
7
+DATA/anqing/datafile/dave01.dbf YES
8
+DATA/anqing/datafile/test01.dbf YES
|
这里我使用了别名,所以只有user 表空间是默认的ASM名称,我们用ASMCMD 命令来验证一下这个:
[oracle@rac2 ~]$ export ORACLE_SID=+ASM2
[oracle@rac2 ~]$ asmcmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
ASMCMD> ls
DATA/
FRA/
ASMCMD> cd DATA
ASMCMD> ls
ANQING/
DAVE/
DB_UNKNOWN/
RAC/
ASMCMD> cd ANQING
ASMCMD> ls
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
ASMCMD> cd DATAFILE
ASMCMD> pwd
+DATA/ANQING/DATAFILE
ASMCMD> ls
DAVE
.285.755349075
SYSAUX
.275.751548237
SYSTEM
.276.751548261
SYSTEM
.280.755038499
TEST
.286.755567335
UNDOTBS1
.274.751548233
UNDOTBS2
.281.751559213
USERS
.273.751548233
dave01.dbf
sysaux01.dbf
system01.dbf
system02.dbf
test01.dbf
undotbs01.dbf
undotbs02.dbf
|
从上面的结果我们可以看到别名和原始名称的对应关系。
连上ASM 实例,用sqlplus的查询进一步确认一下:
[oracle@rac2 ~]$ exportORACLE_SID=+ASM2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
[oracle@rac2 ~]$ sqlplus /
as
sysdba;
SQL*Plus: Release
10.2.
0.4.
0
- Productionon Tue Aug
30
15
:
31
:
03
2011
Copyright (c)
1982
,
2007
, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise EditionRelease
10.2.
0.4.
0
- Production
With the Partitioning, Real ApplicationClusters, OLAP, Data Mining
and
Real Application Testing options
SYS@+ASM2(rac2)> select name,file_numberfrom v$asm_alias order by
2
;
NAME FILE_NUMBER
-----------------------------------------------------------
SYSTEM
.256.746634087
256
Current
.256.746634203
256
SYSAUX
.257.746634087
257
group_1
.257.746989321
257
UNDOTBS1
.258.746634089
258
group_2
.258.746989329
258
group_3
.259.746989339
259
USERS
.259.746634089
259
Current
.260.746634201
260
group_4
.260.746989347
260
group_1
.261.746989315
261
|
以上内容简单的说明了一下什么是ASM,以及ASM 文件的分配。即:
ASMinstance 管理ASM Diskgroups,disk groups 由disk 组成,每个disk 由多个extent 组成,每个extent又由多个AU组成。
这个就是ASM 层面上的一个组成。 那么对于DB instance,它只能看到disk groups 这个层面。 当我们创建datafile 的时候,就是放到对应的asm disk groups里。 至于disk group 内部的balance 和 stripe 就交给ASM instance 来处理。
1.2 ASM disk header 具体内容
在1.1 节里,我们知道了asm disk 与asm 的关系。 ASM 中最脆弱的就是ASM disk header。如果disk header逻辑损坏了,即corrupt了,整个disk group将不能够mount,依赖于ASM实例的database也将不能够startup。
可以使用KFED 命令或者BBED 命令来查看asm disk header 里的具体内容:
Oracle KFED 和 KFOD 工具说明
http://blog.csdn.net/tianlesoftware/article/details/6729950
Oracle BBED 工具 说明
http://blog.csdn.net/tianlesoftware/article/details/5006580
Oracle bbed 五个 实用示例
http://blog.csdn.net/tianlesoftware/article/details/6684505
使用如下语句查看:
SYS@+ASM2(rac2)> select group_kfdatgroup#,FNUM_KFDAT file#, sum(1) AU_used from x$kfdat where v_kfdat='V' group bygroup_kfdat,FNUM_KFDAT,v_kfdat;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
GROUP# FILE# AU_USED
---------- ---------- ----------
1
0
2
--这里保存的就是我们的disk header
1
1
2
1
2
1
1
3
85
1
4
2
1
5
1
1
6
1
1
256
522
1
257
602
1
258
337
1
259
8
......
1
286
51
1
1048575
103
2
0
2
--这里保存的就是我们的disk header
2
1
2
2
2
1
2
3
85
2
4
2
GROUP# FILE# AU_USED
---------- ---------- ----------
2
5
1
2
6
1
2
400
15
2
256
16
2
257
56
......
2
429
8
2
1048575
71
74
rows selected.
|
以上SQL 显示,在每个disk groups 上,都有file# 从0-6 的信息,并且显示了该File 占用的AU 大小。这里的信息就是我们需要关注的信息。 关于这7个File#的说明如下:
1
2
3
4
5
6
7
8
9
10
|
(
1
). File#
0
, AU=
0
: disk header (disk name, etc), Allocation Table (AT)andFree Space Table (FST)
(
2
). File#
0
, AU=
1
: PartnerStatus Table (PST)
(
3
). File#
1
: File Directory(files
and
their extent pointers)
(
4
). File#
2
: Disk Directory
(
5
). File#
3
: Active ChangeDirectory (ACD) The ACD is analogous to a redolog,
where
changes to themetadata are logged. Size=42MB * number of instances
(
6
). File#
4
: Continuing OperationDirectory (COD). The COD is analogousto an undo tablespace. It maintains thestate of active ASM operations such asdisk
or
datafile drop/add. The COD logrecord is either committed
or
rolledback based
on
the success of the operation.
(
7
). File#
5
: Template directory
(
8
). File#
6
: Alias directory
(
9
). 11g, File#
9
: AttributeDirectory
(
10
). 11g, File#
12
:Stalenessregistry, created when needed to track offline disks
|
这里的相关术语解释如下:
1
2
3
4
5
6
7
8
9
10
11
|
(
1
). PST - Partner StatusTable. Maintains info
on
disk-to-diskgroupmembership.
(
2
). COD - ContinuingOperation Directory. The COD structuremaintains the state of active ASMoperations
or
changes, such
as
disk ordatafile drop/add. The COD log record iseither committed
or
rolled back basedon the success of the operation. (source Oraclewhitepaper)
(
3
). ACD - Active ChangeDirectory. The ACD is analogous to a redolog,
where
changes to the metadata arelogged. The ACD log record is used todetermine point of recovery
in
the case ofASM operation failures
or
instancefailures. (source Oracle whitepaper)
(
4
). OSM Oracle StorageManager, legacy name, synonymous of ASM
(
5
). CSS ClusterSynchronization Services. Part of Oracleclusterware, mandatory
with
ASM even insingle instance. CSS is used toheartbeat the health of the ASM instances.
(
6
). RBAL - Oraclebackgroud process. In an ASM instance coordinatedrebalancing operations. In aDB instance, opens
and
mount diskgroups
from
thelocal ASM instance.
(
7
). ARBx - Oraclebackgroud processes. In an ASM instance, a slavefor rebalancing operations
(
8
). PSPx - Oraclebackgroud processes. In an ASM instance, ProcessSpawners
(
9
). GMON - Oraclebackgroud processes. In an ASM instance,diskgroup monitor.
(
10
). ASMB - Oraclebackgroudprocess. In an DB instance, keeps a (bequeath) persistent DB connectionto thelocal ASM instance. Provides hearthbeat
and
ASM statistics. During adiskgrouprebalancing operation ASM communicates to the DB AU changes via thisconnection.
(
11
). O00x - Oraclebackgroudprocesses. Slaves used to connected
from
the DB to the ASM instancefor
'shortoperations'
.
|
可以使用KFED 命令来查看disk header的具体内容。 这个在我之前有关KFED的blog里有示例:
Oracle KFED 和 KFOD 工具说明
http://blog.csdn.net/tianlesoftware/article/details/6729950
这里截取部分内容:
[oracle@rac2 ~]$ kfedread /dev/mapper/datap1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
kfbh.endian:
1
;
0x000
:
0x01
kfbh.hard:
130
;
0x001
:
0x82
kfbh.type:
1
;
0x002
:KFBTYP_DISKHEAD
kfbh.datfmt:
1
;
0x003
:
0x01
kfbh.block.blk:
0
;
0x004
: T=
0
NUMB=
0x0
kfbh.block.obj:
2147483648
;
0x008
: TYPE=0x8NUMB=
0x0
kfbh.check:
1508168608
;
0x00c
:
0x59e4d3a0
kfbh.fcn.base:
0
;
0x010
:
0x00000000
kfbh.fcn.wrap:
0
;
0x014
:
0x00000000
kfbh.spare1:
0
;
0x018
:
0x00000000
kfbh.spare2:
0
;
0x01c
:
0x00000000
kfdhdb.driver.provstr: ORCLDISKDATA ;
0x000
: length=
12
-->磁盘卷名
kfdhdb.driver.reserved[
0
]:
1096040772
;
0x008
:
0x41544144
kfdhdb.driver.reserved[
1
]:
0
;
0x00c
:
0x00000000
kfdhdb.driver.reserved[
2
]:
0
;
0x010
:
0x00000000
kfdhdb.driver.reserved[
3
]:
0
;
0x014
:
0x00000000
kfdhdb.driver.reserved[
4
]:
0
;
0x018
:
0x00000000
kfdhdb.driver.reserved[
5
]:
0
;
0x01c
:
0x00000000
kfdhdb.compat:
168820736
;
0x020
:
0x0a100000
kfdhdb.dsknum:
0
;
0x024
:
0x0000
kfdhdb.grptyp:
1
;
0x026
:KFDGTP_EXTERNAL
--> ThisindicatesRedundancy
for
Group.Check TYPE
in
query output.
kfdhdb.hdrsts:
3
;
0x027
:KFDHDR_MEMBER
--> This indicatesDiskHeader status. Here it indicates it is member of Group.
kfdhdb.dskname: DATA ;
0x028
: length=
4
--> This indicatesDisk Name
kfdhdb.grpname: DATA ;
0x048
: length=
4
--> This indicates theGroupName
for
the disk.
kfdhdb.fgname: DATA ;
0x068
: length=
4
--> This indicatestheFailure Group Name.
|
使用BBED 命令查看disk header 参考:
Oracle 使用BBED 查看 ASMDisk Header 内容
http://blog.csdn.net/tianlesoftware/article/details/6739369
二. 使用DD 命令进行asmdisk 备份与恢复
2.1 DD 备份需要多少个bytes?
我们通过KFED命令可以查看到最后一个bytes的信息:
kfdhdb.acdb.ub2spare: 0 ; 0x1de: 0x0000
这里的0x1de 转成十进制是478.即这个disk header 占用了478个bytes。 但是我们用dd 备份disk header需要备份4096个bytes,即4k。 为什么是4k?
这是受隐含参数控制的:_asm_blksize=4096。 即一个block的大小。
可以通过all_parameters 视图查看该隐含参数的值:
Oracle all_parameters 视图
http://blog.csdn.net/tianlesoftware/article/details/6641281
SYS@anqing2(rac2)> select name,valuefrom all_parameters where name='_asm_blksize';
1
2
3
|
NAME VALUE
------------------------------------------------
_asm_blksize
4096
|
在disk header 中某些状态位和效验位是会发生变化,但是基本信息是固定的。 使用这些固定信息就可以进行恢复。
还有一个重要的一点:dd 备份最好停机做,kfed 可以在线做。
2.2 如何清理ASMDisk
有时候一个ASM Disk由于故障,导致我们删也删不掉,加也加不进去,通常现象是磁盘的headerstatus状态不正确但是diskheader中仍然保留了部分磁盘组的信息。此时我们就需要clear这个磁盘的diskheader,然后再将它重新加入磁盘组中。
清理操作的命令如下:
ddif=<device name> of=<backup file> bs=4096 count=1 dd if=/dev/zeroof=<device name> bs=4096 count=1
强调一点:慎用该命令。
2.3 开始DD 备份
SYS@anqing2(rac2)> select name,path fromv$asm_disk;
1
2
3
4
|
NAME PATH
-------------------------------------------------------------------------------
DATA /dev/mapper/datap1
FRA_0000 /dev/mapper/frap1
|
[oracle@rac2 ~]$ dd if=/dev/mapper/datap1 of=/u01/datap1header bs=4096 count=1
1
2
3
|
1
+
0
records
in
1
+
0
records out
4096
bytes (
4.1
kB) copied,
0.
000122762seconds,
33.4
MB/s
|
[oracle@rac2 ~]$ dd if=/dev/mapper/frap1 of=/u01/fraheader bs=4096 count=1;
1
2
3
|
1
+
0
records in
1
+
0
records out
4096
bytes (
4.1
kB) copied,
0
.000325073seconds,
12.6
MB/s
|
2.4 停掉ASM 实例
SYS@anqing2(rac2)> select name,state,type from v$asm_diskgroup;
1
2
3
4
|
NAME STATE TYPE
--------------- ----------- ------
DATA CONNECTED EXTERN
FRA CONNECTED EXTERN
|
[oracle@rac2 u01]$ sh crs_stat.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Name Target State Host
------------------------------ ------------------- -------
ora.anqing.anqing1.inst ONLINE ONLINE rac1
ora.anqing.anqing2.inst ONLINE ONLINE rac2
ora.anqing.db ONLINE ONLINE rac1
ora.rac1.ASM1.asm ONLINE ONLINE rac1
ora.rac1.LISTENER_RAC1.lsnr ONLINE ONLINE rac1
ora.rac1.gsd ONLINE ONLINE rac1
ora.rac1.ons ONLINE ONLINE rac1
ora.rac1.vip ONLINE ONLINE rac1
ora.rac2.ASM2.asm ONLINE ONLINE rac2
ora.rac2.LISTENER_RAC2.lsnr ONLINE ONLINE rac2
ora.rac2.gsd ONLINE ONLINE rac2
ora.rac2.ons ONLINE ONLINE rac2
ora.rac2.vip ONLINE ONLINE rac2
|
[oracle@rac2 u01]$ srvctl stop database -danqing
[oracle@rac2 u01]$ sh crs_stat.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Name Target State Host
------------------------------ ------------------- -------
ora.anqing.anqing1.inst OFFLINE OFFLINE
ora.anqing.anqing2.inst OFFLINE OFFLINE
ora.anqing.db OFFLINE OFFLINE
ora.rac1.ASM1.asm ONLINE ONLINE rac1
ora.rac1.LISTENER_RAC1.lsnr ONLINE ONLINE rac1
ora.rac1.gsd ONLINE ONLINE rac1
ora.rac1.ons ONLINE ONLINE rac1
ora.rac1.vip ONLINE ONLINE rac1
ora.rac2.ASM2.asm ONLINE ONLINE rac2
ora.rac2.LISTENER_RAC2.lsnr ONLINE ONLINE rac2
ora.rac2.gsd ONLINE ONLINE rac2
ora.rac2.ons ONLINE ONLINE rac2
ora.rac2.vip ONLINE ONLINE rac2
|
[oracle@rac2 u01]$ srvctl stop asm -n rac1
[oracle@rac2 u01]$ srvctl stop asm -n rac2
[oracle@rac2 u01]$ sh crs_stat.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Name Target State Host
------------------------------ ------------------- -------
ora.anqing.anqing1.inst OFFLINE OFFLINE
ora.anqing.anqing2.inst OFFLINE OFFLINE
ora.anqing.db OFFLINE OFFLINE
ora.rac1.ASM1.asm OFFLINE OFFLINE
ora.rac1.LISTENER_RAC1.lsnr ONLINE ONLINE rac1
ora.rac1.gsd ONLINE ONLINE rac1
ora.rac1.ons ONLINE ONLINE rac1
ora.rac1.vip ONLINE ONLINE rac1
ora.rac2.ASM2.asm OFFLINE OFFLINE
ora.rac2.LISTENER_RAC2.lsnr ONLINE ONLINE rac2
ora.rac2.gsd ONLINE ONLINE rac2
ora.rac2.ons ONLINE ONLINE rac2
ora.rac2.vip ONLINE ONLINE rac2
|
2.5 模拟diskheader 故障
使用2.2中的方法。
[oracle@rac2 u01]$ dd if=/dev/zero of=/dev/mapper/datap1 bs=4096 count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.00558218seconds, 734 kB/s
2.6 用KFED 查看此时的diskheader
[oracle@rac2 u01]$ kfed read /dev/mapper/datap1
1
2
3
4
5
6
7
8
9
10
11
|
kfbh.endian:
0
;
0x000
:
0x00
kfbh.hard:
0
;
0x001
:
0x00
kfbh.type:
0
;
0x002
:KFBTYP_INVALID
kfbh.datfmt:
0
;
0x003
:
0x00
kfbh.block.blk:
0
;
0x004
: T=
0
NUMB=
0x0
kfbh.block.obj:
0
;
0x008
: TYPE=0x0NUMB=
0x0
kfbh.check:
0
;
0x00c
:
0x00000000
kfbh.fcn.base:
0
;
0x010
:
0x00000000
kfbh.fcn.wrap:
0
;
0x014
:
0x00000000
kfbh.spare1:
0
;
0x018
:
0x00000000
kfbh.spare2:
0
;
0x01c
:
0x00000000
|
2.7 启动ASM 实例
[oracle@rac2 u01]$ export ORACLE_SID=+ASM2
1
2
3
4
5
6
7
8
9
10
11
|
[oracle@rac2 u01]$ sqlplus /
as
sysdba;
SQL*Plus: Release
10.2.
0.4.
0
- Productionon Thu Sep
1
16
:
35
:
06
2011
Copyright (c)
1982
,
2007
, Oracle. All Rights Reserved.
Connected to an idle instance.
SQL> startup
ASM instance started
Total System Global Area
92274688
bytes
Fixed Size
1265960
bytes
Variable Size
65842904
bytes
ASM Cache
25165824
bytes
|
ORA-15032: not all alterations performed
ORA-15063: ASM discoveredan insufficient number of disks for diskgroup "DATA"
这里提示DATAdiskgroup 不能mout,ASM 实例不能启动
2.8 用之前的备份恢复
[oracle@rac2 u01]$ dd if=/u01/datap1header of=/dev/mapper/datap1 bs=4096 count=1
1+0 records in
1+0 records out
4096 bytes (4.1 kB) copied, 0.00666105seconds, 615 kB/s
2.9 用KFED 验证diskheader
[oracle@rac2 u01]$ kfed read /dev/mapper/datap1
1
2
3
4
5
6
7
8
9
10
11
12
|
kfbh.endian:
1
;
0x000
:
0x01
kfbh.hard:
130
;
0x001
:
0x82
kfbh.type:
1
;
0x002
:KFBTYP_DISKHEAD
kfbh.datfmt:
1
;
0x003
:
0x01
kfbh.block.blk:
0
;
0x004
: T=
0
NUMB=
0x0
kfbh.block.obj:
2147483648
;
0x008
: TYPE=0x8NUMB=
0x0
kfbh.check:
1508168608
;
0x00c
:
0x59e4d3a0
kfbh.fcn.base:
0
;
0x010
:
0x00000000
kfbh.fcn.wrap:
0
;
0x014
:
0x00000000
kfbh.spare1:
0
;
0x018
:
0x00000000
kfbh.spare2:
0
;
0x01c
:
0x00000000
....
|
现在恢复正常!
2.10 将Data diskgroup mount 上去
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
SYS@+ASM2(rac2)> select name,state,typefrom v$asm_diskgroup;
NAME STATE TYPE
------------------------------ -----------------
DATA DISMOUNTED
FRA MOUNTED EXTERN
SYS@+ASM2(rac2)> alter diskgroup DATAmount;
Diskgroup altered.
SYS@+ASM2(rac2)> select name,state,typefrom v$asm_diskgroup;
NAME STATE TYPE
------------------------------ -----------------
DATA MOUNTED EXTERN
FRA MOUNTED EXTERN
|
mout 成功,现在RAC 可以正常启动了。
[oracle@rac2 u01]$ sh crs_stat.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Name Target State Host
------------------------------ ------------------- -------
ora.anqing.anqing1.inst ONLINE ONLINE rac1
ora.anqing.anqing2.inst ONLINE ONLINE rac2
ora.anqing.db ONLINE ONLINE rac2
ora.rac1.ASM1.asm ONLINE ONLINE rac1
ora.rac1.LISTENER_RAC1.lsnr ONLINE ONLINE rac1
ora.rac1.gsd ONLINE ONLINE rac1
ora.rac1.ons ONLINE ONLINE rac1
ora.rac1.vip ONLINE ONLINE rac1
ora.rac2.ASM2.asm ONLINE ONLINE rac2
ora.rac2.LISTENER_RAC2.lsnr ONLINE ONLINE rac2
ora.rac2.gsd ONLINE ONLINE rac2
ora.rac2.ons ONLINE ONLINE rac2
ora.rac2.vip ONLINE ONLINE rac2
|
--未完,待续!