理解ASM(三)ASM磁盘组管理


       ㈠ ASM磁盘组管理原则

          ① 添加或删除磁盘的影响

          当发生添加/删除磁盘组中磁盘的操作时,ASM能够自动平衡           对于普通的删除操作(无force选项),被删除的磁盘在该上数据被有效处理前并不会立刻释放           同样,新增磁盘时,在重分配工作完成前,该盘也不会承担I/O负载的工作          

         ② ASM如何处理磁盘故障

          ASM磁盘组大致有二:普通组和故障组,后者与ASM的冗余方式有所关联。           普通磁盘组就是标准的存储单元,ASM可以向其可访问的磁盘组中读写数据,failure磁盘组是为了提高数据的高可用性。           ASM中的磁盘冗余策略非常简单,概要成三类:外部冗余、标准冗余和高度冗余。其中,外部冗余和failure组无关。           如果设置了标准冗余或者高度冗余,那么该磁盘组就必须要有故障组。           对于标准冗余,ASM要求该磁盘组至少要拥有两个failure磁盘组,即提供双倍镜像保护,对于同一份数据,将有主从两份镜像。           并且ASM通过算法来自动确保主、从镜像不会存在于同一份failure磁盘组,这样就保障了就算整个failure磁盘组都损坏,数据也不会丢失。           ASM中镜像单位不是磁盘,也不是块,而是一种AU的单位,该单位大小默认是1M。           至于高度冗余,它至少需要三个failure磁盘组,也就是一份AU有一主多从的镜像,理论上将更加安全。           外部冗余的话磁盘属于磁盘组,内部冗余的话,磁盘属于磁盘组的同时,还属于而且仅属于某个failure磁盘组。           如果磁盘发生损坏,那么损坏的磁盘默认自动offlice并被drop掉,不过该磁盘所在的磁盘组仍将保持MOUNT状态。           如果该组有镜像的话,那么应用不会有影响,镜像盘将自动实现接管--只要不是所有failure磁盘组都损坏掉,           否则的话,该磁盘组将自动DISMOUNT           举个例子吧,某标准冗余的failure组有6个盘(对应6个裸设备),假如说此时坏了一块盘,没关系,操作继续,坏了那块会被自动dropped,           剩下的5块盘仍然能够负担起正常的读写操作。

 

       ㈡ 磁盘组的相关操作

         ⑴ 添加磁盘组

          语法:

[sql] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">CREATE DISKGROUP diskgroup_name 
  2.  
  3.   [ { HIGH | NORMAL | EXTERNAL } REDUNDANCY ] 
  4.  
  5.   [ FAILGROUP failgroup_name ] 
  6.  
  7.   DISK [ NAME disk_name ] [ SIZE size_clause ] [ FORCE | NOFORCE ]</SPAN> 
CREATE DISKGROUP diskgroup_name

  [ { HIGH | NORMAL | EXTERNAL } REDUNDANCY ]

  [ FAILGROUP failgroup_name ]

  DISK [ NAME disk_name ] [ SIZE size_clause ] [ FORCE | NOFORCE ]

          注释:           ● 首先要指定的就是磁盘组名称(diskgroup_name);           ● 指定冗余度,有三个选择:HIGH(高度冗余>三路)、NORMAL(标准冗余--双路)和EXTERNAL(外部存储冗余);           ● 选择是否指定FAILGROUP(如果选择非external则必须指定);           ● 指定该磁盘组中的成员(对应的LUN),在指定成员时一般ASM能够自动检测出磁盘的容量,不过如果DBA基于某些方面的考虑,              希望限制ASM使用的空间的话,也可以在指定成员过程中,顺便指定大小(只要指定的大小不超出磁盘实际容量),在添加成员时,              ASM也会自动检查磁盘头以确定该磁盘是否被加入到其它的磁盘组中,当发现该盘已加入其它磁盘组的话,你可以通过FORCE选项来强制修改该盘所属磁盘组

          例子:

[sql] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">idle> create diskgroup dg1 normal redundancy 
  2.   2  failgroup f1 disk '/dev/raw/raw4'                         
  3.   3  failgroup f2 disk '/dev/raw/raw5';</SPAN> 
idle> create diskgroup dg1 normal redundancy
  2  failgroup f1 disk '/dev/raw/raw4'                        
  3  failgroup f2 disk '/dev/raw/raw5';

 

         ⑵ 修改磁盘组

            Ⅰ 添加磁盘

 

[sql] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">idle> alter diskgroup DATA add disk '/dev/raw/raw7'name data007; 
  2.  
  3. Diskgroup altered.</SPAN> 
idle> alter diskgroup DATA add disk '/dev/raw/raw7' name data007;

Diskgroup altered.

            事实上,alter diskgroup添加磁盘时,也可以使用通配符,比如添加所有raw_a0开头的设备,可执行语句如下:

[sql] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">Alter diskgroup asmdisk1 add disk '/dev/raw/raw_a0*' ;</SPAN> 
Alter diskgroup asmdisk1 add disk '/dev/raw/raw_a0*' ;

            再比如添加raw_a5,raw_a6,raw_a7,可以执行语句如下:

[sql] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">Alter diskgroup asmdisk1 add disk '/dev/raw/raw_a[567]' ;</SPAN> 
Alter diskgroup asmdisk1 add disk '/dev/raw/raw_a[567]' ;

            不过ASM需要自动平均磁盘组中的数据,这必然需要消耗一定的时间(视数据量多少),默认情况下ALTER DISKGROUP语句并不会等待所有工作全部完成才返回控制权。             如果希望ALTER DISKGROUP语句完成所有工作才返回的话,可以在执行时附加REBALANCE WAIT子句,这样该语句就会等待自动平衡的操作,直至所有操作完成才返回结果             当然在等待期间,如果你改主意了不愿意继续等待,CTRL+C中断即可获得控制权,而平衡的操作不受影响,会在后台继续进行。

 

            Ⅱ 删除磁盘

            删除跟添加还有点儿不同,就是当删除磁盘时,ASM发现怎么平衡都平衡不过来时(比如剩下的磁盘空间不足以存放所有数据时),删除操作也会失败。             这种情况要么先删数据,要么取消删除的操作。

[sql] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">idle> alter diskgroup DATA drop disk data007; 
  2.  
  3. Diskgroup altered. 
  4.  
  5. idle> alter diskgroup data undrop disks; 
  6.  
  7. Diskgroup altered.</SPAN> 
idle> alter diskgroup DATA drop disk data007;

Diskgroup altered.

idle> alter diskgroup data undrop disks;

Diskgroup altered.

 

           只要删除操作还没有真正完成,任何就会被取消,否则的话,只能再通过ADD语句将该磁盘重新加入到磁盘组了              

                     Ⅲ 修改磁盘大小

            ASM 中的磁盘大小是可被扩缩的,             扩大的话,要确保该磁盘对应的裸卷确实有足够的空间去扩大             缩小的话,要确保缩小后剩余的空间仍以放的下当前磁盘上已存在的数据

[sql] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">idle> alter diskgroup data resize disk data007 size 95m; 
  2.  
  3. Diskgroup altered.</SPAN> 
idle> alter diskgroup data resize disk data007 size 95m;

Diskgroup altered.

 

          ⑶ 手动平衡磁盘组

            一般情况下ASM都会自动对其下的磁盘组进行平衡,不过ORACLE也提供了手动平衡磁盘组的方式             前面提到过磁盘组的平衡度有0到11多个级别,默认是按照ASM_POWER_LIMIT初始化参数中设置的值,             手动平衡的话,设置的平衡度可以与初始化参数中并不相同,例如,设置磁盘组平衡度为5

[sql] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">idle> alter diskgroup data rebalance power 5; 
  2.  
  3. Diskgroup altered.</SPAN> 
idle> alter diskgroup data rebalance power 5;

Diskgroup altered.

            DBA在执行该语句时,一定要注意该操作对IO性能的影响。             另外再次强调,上述语句将很快返回diskgroup altered的提示,但这并不表示操作真正完成,它只是反馈语句提交而已             查看磁盘后台的操作,可以通过v$asm_operator视图,或者在语句执行时增加wait子句,这样ASM将会等到操作真正完成时,才返回提示信息                        

                      ⑷ mount/unmount 磁盘组

          只有被mount的磁盘组才能被数据库使用并执行add/drop等磁盘操作,ASM中的磁盘组默认会在ASM实例启动时自动加载,当然也可以手动通过命令行语句mount/unmount磁盘组           查询ASM实例中创建的磁盘组可以通过V$ASM_DISKGROUP视图查看:

[sql] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">idle> select group_number,name,state,total_mb,free_mb from v$asm_diskgroup; 
  2.  
  3. GROUP_NUMBER NAME   STATE                               TOTAL_MB    FREE_MB 
  4. ------------ ------ --------------------------------- ---------- ----------  
  5.            1 DATA   MOUNTED                                  701        540</SPAN> 
idle> select group_number,name,state,total_mb,free_mb from v$asm_diskgroup;

GROUP_NUMBER NAME   STATE                               TOTAL_MB    FREE_MB
------------ ------ --------------------------------- ---------- ----------
           1 DATA   MOUNTED                                  701        540

          当前两个磁盘组均为MOUNT状态,要将其置为UNMOUNT,执行语句如下:

[sql] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">idle> alter diskgroup data dismount; 
  2.  
  3. Diskgroup altered. 
  4.  
  5. idle> select group_number,name,state,total_mb,free_mb from v$asm_diskgroup; 
  6.  
  7. GROUP_NUMBER NAME   STATE                               TOTAL_MB    FREE_MB 
  8. ------------ ------ --------------------------------- ---------- ----------  
  9.            0 DATA   DISMOUNTED                                 0          0</SPAN> 
idle> alter diskgroup data dismount;

Diskgroup altered.

idle> select group_number,name,state,total_mb,free_mb from v$asm_diskgroup;

GROUP_NUMBER NAME   STATE                               TOTAL_MB    FREE_MB
------------ ------ --------------------------------- ---------- ----------
           0 DATA   DISMOUNTED                                 0          0

          UNMOUNT磁盘组的话务必慎重操作,要确保UNMOUNT的磁盘组中保存的文件对应的数据库当前未启动,而且该操作也会直接导致数据库SHUTDOWN。

[sql] view plaincopyprint?
  1. <SPAN style="FONT-SIZE: 18px">idle> alter diskgroup data dismount; 
  2.  
  3. Diskgroup altered. 
  4. idle> select group_number,name,state,total_mb,free_mb from v$asm_diskgroup; 
  5.  
  6. GROUP_NUMBER NAME   STATE                               TOTAL_MB    FREE_MB 
  7. ------------ ------ --------------------------------- ---------- ----------  
  8.            1 DATA   MOUNTED                                  701        540 
  9. </SPAN> 
idle> alter diskgroup data dismount;

Diskgroup altered.
idle> select group_number,name,state,total_mb,free_mb from v$asm_diskgroup;

GROUP_NUMBER NAME   STATE                               TOTAL_MB    FREE_MB
------------ ------ --------------------------------- ---------- ----------
           1 DATA   MOUNTED                                  701        540

 

 

        ⑸ 删除磁盘组

          语法:drop diskgroup gpname           如果删除的diskgroup非空的话,直接执行上述语句会报错           这时候可以通过附加including contents子句,来自动删除该磁盘组中包含的文件           删除磁盘组的操作会自动修改spfile中ASM_DISKGROUPS初始化参数的值(如果使用了SPFILE的话)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM