ASM有几个容易让人迷糊的概念,ASM磁盘,故障组,磁盘组, DISK就是我们的磁盘,这个磁盘一般都是做raid以后看到的磁盘,当然在windows下,也可以用perl格式化几个raw的文件来做asm disk,本文就以后者来举例.故障组(FAILGROUP),这个概念是最令人迷惑的,实际上故障组就是ASM DISK的一个逻辑组合,如果不指定哪些ASM DISK属于哪个FAILGROUP,那么可以理解每个ASM DISK都是一个FAILGROUP,磁盘组比较好理解,就是ASM DISK的组合,那么磁盘组和故障组又有什么关系呢,磁盘组有3种镜像的方式:External redundancy, Normal redundancy, High redundancy.这三种镜像的方式,就是针对故障组来说,如果有2个故障组,就是Normal方式镜像,如果有3个故障组就是High方式镜像.
现在让我们体验这3个概念:
我们可以从DBCA看到我们未划入磁盘组的磁盘,在这个之前我们需要到ASM下,设置好ASM磁盘搜索的路径:
1
|
Cocuments and Settingsoracle>
set
ORACLE_SID=+ASM
|
Cocuments and Settingsoracle>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 – Production on星期二5月27 13:58:22 2008
Copyright (c) 1982, 2007, Oracle.
All Rights Reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 – Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
1
2
3
4
5
6
|
SQL>
set
linesize 120
SQL> show parameter asm_disks
NAME
TYPE VALUE
------------------------------------ ---------------------- ------------------------------
asm_diskstring string d:asm diskDISK_file_disk*
SQL>
|
或者我们进入DBCA进行修改:
我们可以看到已经有3个磁盘组,我们选择新建->更改搜索路径,改成磁盘所在的路径,这时我们可以看到我们已经出现的候选磁盘
因为这里默认新建磁盘组是常规方式,所以才出现故障组这列.这个时候,我们可以在这个列上为故障组起名字,如果希望把前两个磁盘划到一个故障组,后面的划到一个故障组,就起相同的名字:
如果我们不起名字,而选择默认,那么故障组的名字和磁盘的名字将是一样,同时,会形成四个故障组.我们可以看之前,我已经创建的磁盘组,FAILGROUP名字与ASM 磁盘名字一样:
关于ASM故障组可以参考:
-
http://www.dbcloud.info/?p=57
我们查看这个四个磁盘是什么状态呢:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
SQL>
select
group_number,disk_number,
name
,failgroup,create_date,path
from
v$asm_disk;
group
disk
number number
NAME
FAILGROUP CREATE_DATE PATH
------ ------ -------------------- -------------------- ------------------- -------------------------------
0 0 D:ASM DISKDISK_FILE_DISK10
0 1 D:ASM DISKDISK_FILE_DISK7
0 2 D:ASM DISKDISK_FILE_DISK8
0 3 D:ASM DISKDISK_FILE_DISK9
1 0 DISK_GROUP1_0000 DISK_GROUP1_0000 2007-09-04 22:15:18 D:ASM DISKDISK_FILE_DISK1
1 1 DISK_GROUP1_0001 DISK_GROUP1_0001 2007-09-04 22:15:18 D:ASM DISKDISK_FILE_DISK2
2 0 DISK_GROUP2_0000 DISK_GROUP2_0000 2007-09-04 23:00:23 D:ASM DISKDISK_FILE_DISK3
2 1 DISK_GROUP2_0001 DISK_GROUP2_0001 2007-09-04 23:00:23 D:ASM DISKDISK_FILE_DISK4
3 0 RMAN_GROUP_0000 RMAN_GROUP_0000 2008-05-20 14:48:25 D:ASM DISKDISK_FILE_DISK5
3 1 RMAN_GROUP_0001 RMAN_GROUP_0001 2008-05-20 14:48:25 D:ASM DISKDISK_FILE_DISK6
已选择10行。
|
我们可以看到以前的磁盘的FAILGROUP和他们的磁盘一个名字,而这四个候选的磁盘还没有被划分.
如果这个我们选择磁盘组高冗余的方式,是否可以呢?
我们可以看到,由于我们把每2个磁盘划为1个故障组,这个时候,不能创建高冗余方式的磁盘组.
那么我们是否可以创建冗余的方式呢,我们可以用DBCA和命令创建
我们可以通过EM获取命令,当然也可以直接写:
我们可以看到和DBCA的效果是一样的:
这个磁盘名,就是为磁盘设备指定一个别名,我们填写完以后,选择显示SQL
确认:
1
2
3
4
5
6
7
|
SQL>
CREATE
DISKGROUP DISK_GROUP4 NORMAL REDUNDANCY
FAILGROUP FAILGROUP2 DISK
'D:ASM DISKDISK_FILE_DISK8'
NAME
DISK8
SIZE
16 M ,
'D:ASM DISKDISK_FILE_DISK9'
NAME
DISK9
SIZE
16 M
FAILGROUP FAILGROUP1 DISK
'D:ASM DISKDISK_FILE_DISK10'
NAME
DISK10
SIZE
16 M ,
'D:ASM DISKDISK_FILE_DISK7'
NAME
DISK7
SIZE
16 M ;
*
ERROR
at
line 1:
ORA-15018: diskgroup cannot be created
ORA-15041: diskgroup
space
exhausted
|
磁盘组的空间不够大.
我又新建了4个50M的磁盘文件,重新创建磁盘组:
1
2
3
|
SQL>
CREATE
DISKGROUP DISK_GROUP4 NORMAL REDUNDANCY FAILGROUP FG2 DISK
'D:ASM DISKDISK_FILE_DISK13'
NAME
DISK13
SIZE
50 M ,
'D:ASM DISKDISK_FILE_DISK14'
NAME
DISK14
SIZE
50 M FAILGROUP FG1 DISK
'D:ASM DISKDISK_FILE_DISK11'
NAME
DISK11
SIZE
50 M ,
'D:ASM DISKDISK_FILE_DISK12'
NAME
DISK12
SIZE
50 M ;
磁盘组已创建。
|
我们可以看到两个故障组内,磁盘的数据大小一致.
1
2
3
|
ASMCMD> lsdg disk_group4
State Type Rebal Unbal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Name
MOUNTED NORMAL N N 512 4096 1048576 200 94 50 22 0 DISK_GROUP4/
|
我们看到这个磁盘组还没有存储数据,就占用了106M的空间.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
SQL>
select
group_number,
name
,type,total_mb,free_mb
from
v$asm_diskgroup;
GROUP_NUMBER
NAME
TYPE TOTAL_MB FREE_MB
------------ ----------------- ------------ ---------- ----------
1 DISK_GROUP1 EXTERN 6144 4790
2 DISK_GROUP2 EXTERN 6144 4884
3 RMAN_GROUP EXTERN 2046 421
4 DISK_GROUP4 NORMAL 200 94
SQL>
select
group_number,disk_number,
name
,failgroup,create_date,path
from
v$asm_disk
where
group_number=4;
GROUP_NUMBER DISK_NUMBER
NAME
FAILGROUP CREATE_DATE PATH
------------ ----------- ----------------- --------- ------------------- ----------------------------------------
4 2 DISK11 FG1 2008-05-27 14:52:26 D:ASM DISKDISK_FILE_DISK11
4 3 DISK12 FG1 2008-05-27 14:52:26 D:ASM DISKDISK_FILE_DISK12
4 0 DISK13 FG2 2008-05-27 14:52:26 D:ASM DISKDISK_FILE_DISK13
4 1 DISK14 FG2 2008-05-27 14:52:26 D:ASM DISKDISK_FILE_DISK14
|
尝试把之前的四个磁盘加进来:
因为上面的四个磁盘被格式化过,可能需要强制使用打划,就是加force参数
因为增加了新的磁盘,磁盘组需要重新平衡,加大asm_power_limit参数到3
先尝试不加force
01
02
03
04
05
06
07
08
09
10
11
|
SQL>
ALTER
DISKGROUP DISK_GROUP4
ADD
FAILGROUP FG4 DISK
'D:ASM DISKDISK_FILE_DISK8'
NAME
DISK8
SIZE
16 M ,
'D:ASM DISKDISK_FILE_DISK9'
NAME
DISK9
SIZE
16 M FAILGROUP FG3 DISK
'D:ASM DISKDISK_FILE_DISK10'
NAME
DISK10
SIZE
16 M ,
'D:ASM DISKDISK_FILE_DISK7'
NAME
DISK7
SIZE
16 M REBALANCE POWER 1;
磁盘组已变更。
SQL>
Select
group_number,operation,state,power,actual,sofar,est_work,est_rate,est_minutes
from
v$asm_operation;
GROUP_NUMBER OPERATION STATE POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES
------------ ---------- -------- ---------- ---------- ---------- ---------- ---------- -----------
4 REBAL RUN 1 1 2 68 60 1
SQL>
SQL> /
未选定行
|
重新平衡执行完毕.
1
2
3
4
5
6
7
|
SQL>
select
group_number,
name
,type,total_mb,free_mb
from
v$asm_diskgroup;
GROUP_NUMBER
NAME
TYPE TOTAL_MB FREE_MB
------------ ----------- ------------ ---------- ----------
1 DISK_GROUP1 EXTERN 6144 4790
2 DISK_GROUP2 EXTERN 6144 4884
3 RMAN_GROUP EXTERN 2046 421
4 DISK_GROUP4 NORMAL 264 101
|
这个时候,这个磁盘组有3个故障组,FG1 ,FG2 ,FG3
我们是否可以删除其中一个盘:
SQL> alter diskgroup disk_group4 drop disk disk7;
磁盘组已变更。
我们从EM发现这个ASM DISK是HUNG状态,并没有删除
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
SQL>
alter
diskgroup disk_group4 undrop disks;
磁盘组已变更。
SQL>
select
group_number,disk_number,
name
,failgroup,create_date,state
from
v$asm_disk
where
group_number=4
GROUP_NUMBER DISK_NUMBER
NAME
FAILGR CREATE_DATE STATE
------------ ----------- ----------- ------ ------------------- ----------------
4 6 DISK10 FG3 2008-05-27 15:22:16 NORMAL
4 7 DISK7 FG3 2008-05-27 15:22:16 NORMAL
4 4 DISK8 FG4 2008-05-27 15:22:16 NORMAL
4 5 DISK9 FG4 2008-05-27 15:22:16 NORMAL
4 2 DISK11 FG1 2008-05-27 14:52:26 NORMAL
4 3 DISK12 FG1 2008-05-27 14:52:26 NORMAL
4 0 DISK13 FG2 2008-05-27 14:52:26 NORMAL
4 1 DISK14 FG2 2008-05-27 14:52:26 NORMAL
已选择8行
|
磁盘7,10又是一样的大小
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
SQL>
alter
diskgroup disk_group4
add
failgroup fg3 disk
'D:ASM DISKDISK_file_disk15'
name
disk15
2
drop
disk disk7;
磁盘组已变更。
SQL>
select
group_number,disk_number,
name
,failgroup,create_date,state
from
v$asm_disk
where
group_number=4;
GROUP_NUMBER DISK_NUMBER
NAME
FAILGR CREATE_DATE STATE
------------ ----------- ----------- ------ ------------------- ----------------
4 6 DISK10 FG3 2008-05-27 15:22:16 NORMAL
4 7 DISK7 FG3 2008-05-27 15:22:16 DROPPING
4 4 DISK8 FG4 2008-05-27 15:22:16 NORMAL
4 5 DISK9 FG4 2008-05-27 15:22:16 NORMAL
4 2 DISK11 FG1 2008-05-27 14:52:26 NORMAL
4 3 DISK12 FG1 2008-05-27 14:52:26 NORMAL
4 0 DISK13 FG2 2008-05-27 14:52:26 NORMAL
4 1 DISK14 FG2 2008-05-27 14:52:26 NORMAL
4 8 DISK15 FG3 2008-05-27 15:45:38 NORMAL
已选择9行。
SQL>
Select
group_number,operation,state,power,actual,sofar,est_work,est_rate,est_minutes
from
v$asm_operation;
GROUP_NUMBER OPERATION STATE POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES
------------ ---------- -------- ---------- ---------- ---------- ---------- ---------- -----------
4 REBAL RUN 1 1 1 47 60 0
SQL>
SQL>
select
group_number,disk_number,
name
,failgroup,create_date,state
from
v$asm_disk
where
group_number=4;
GROUP_NUMBER DISK_NUMBER
NAME
FAILGR CREATE_DATE STATE
------------ ----------- ----------- ------ ------------------- ----------------
4 6 DISK10 FG3 2008-05-27 15:22:16 NORMAL
4 4 DISK8 FG4 2008-05-27 15:22:16 NORMAL
4 5 DISK9 FG4 2008-05-27 15:22:16 NORMAL
4 2 DISK11 FG1 2008-05-27 14:52:26 NORMAL
4 3 DISK12 FG1 2008-05-27 14:52:26 NORMAL
4 0 DISK13 FG2 2008-05-27 14:52:26 NORMAL
4 1 DISK14 FG2 2008-05-27 14:52:26 NORMAL
4 8 DISK15 FG3 2008-05-27 15:45:38 NORMAL
已选择8行。
|
这个时候,我们发现DISK7已经被删除,DISK15被加上,因为我们指定两个磁盘做为FAILGROUP,而且是NORMAL方式,至少要2个磁盘,所以我们删除单1磁盘会失败.