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磁盘搜索的路径:
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
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.acougdba.com/?p=57
我们查看这个四个磁盘是什么状态呢:
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
确认:
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的磁盘文件,重新创建磁盘组:
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 ; 磁盘组已创建。
我们可以看到两个故障组内,磁盘的数据大小一致.
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的空间.
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
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> / 未选定行
重新平衡执行完毕.
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状态,并没有删除
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又是一样的大小
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磁盘会失败.