2.1 添加磁盘组
DBCA 中创建磁盘组想必大家都很熟悉了,对,不过是点两下鼠标,SQL*PLUS下操作也很简单,主要是使用CREATE DISKGROUP语句,该语句的语法如下:
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选项来强制修改该盘所属磁盘组。
2.2 修改磁盘组
事物总是在变化中前进,这是事物的一般规 律,磁盘组也不例外,在其创建完之后,保不齐什么时候可能就需要加或删个磁盘,或者修改某个盘的大小(如果还有机会改的话)。这时候你就需要 ALTER DISKGROUP语句了,ALTER DISKGROUP语句的语法太简单(灵活)了,因此这里三思就不列了,后面通过几个实际应用的示例 来说明其语法规则。
ASM 最好的一点就是,不管你是加还是删磁盘组中的磁盘,它都能自动进行平衡,确保该磁盘组中每块盘存储的数据量平均,以实现最优化的IO性能,并且这一过程不会对数据造成影响
2.2.1 添加磁盘
比如,添加一个磁盘到磁盘组asmdisk1,语句如下:
SQL> Alter diskgroup asmdisk2 add disk '/dev/raw/raw7' name asmdisk2_0002;
Diskgroup altered.
事实上,alter diskgroup添加磁盘时,也可以使用通配符,比如添加所有raw_a0开头的设备,可执行语句如下:
Alter diskgroup asmdisk1 add disk '/dev/raw/raw_a0*' ;
再比如添加raw_a5,raw_a6,raw_a7,可以执行语句如下:
Alter diskgroup asmdisk1 add disk '/dev/raw/raw_a[567]' ;
总之非常灵活,大家可以根据实际情况自行尝试以简化操作。这也属于优化着干活的范畴嘛。
注意哟,语句虽然执行了,不过ASM需要自动平均磁盘组中的数据,这必然需要消耗一定的时间(视数据量多少),默认情况下ALTER DISKGROUP语句并不会等待所有工作全部完成才返回控制权,
要监控后台进行的操作,可以通过V$ASM_OPERATION视图查询。
如果希望ALTER DISKGROUP语句完成所有工作才返回的话,可以在执行时附加REBALANCE WAIT子句,这样该语句就会等待自动平衡 的操作,直接所有操作完成才返回结果,当然在等待期间,如果你改主意了不愿意继续等待,CTRL+C中断即可获得控制权,而平衡的操作不受影响,会在后台 继续进行。
2.2.2 删除磁盘
虽然删除磁盘也涉及到数据库的重新平衡,因此删除跟添加还有点儿不同,就是当删除磁盘时,当ASM发现怎么平衡都平衡不过来时(比如剩下的磁盘空间不足以存放所有数据时),删除操作也会失败。这种情况要么先删数据,要么取消删除的操作。
简单举个例子,比如说删除asmdisk2磁盘组中的asmdisk2_0001磁盘,操作如下:
SQL> alter diskgroup asmdisk2 drop disk asmdisk2_0001;
Diskgroup altered.
不知道算不算是优点,由于前面提到的ASM自动平衡的特性,上述语句返回后并不代表磁盘已经被删除,此时后台可能由于正忙碌地执行着IO重平衡的工作, 因此如果在这个当口,DBA忽然意识到操作失误,其实磁盘并不需要被删除,那也可以马上通过 alter diskgroup dgname undrop disks语句来取消删除的操作,例如:
SQL> alter diskgroup asmdisk2 undrop disks;
Diskgroup altered.
只要删除操作还没有真正完成,任何就会被取消,否则的话,上述语句也挽回不了什么了,如果希望挽回,那DBA只能再通过ADD语句将该磁盘重新加入到磁盘组了。
2.2.3 修改磁盘大小
ASM 中的磁盘也可以被RESIZE--扩大或缩小,不过需要注意的是,扩大的话,要确保该磁盘对应的裸卷确实有足够的空间去扩大(比如该卷原有20g,创建时仅用了10g,则最大可扩大到20g-块头占用的nM空间);缩小的话,要确保缩小后剩余的空间仍以放的下当前磁盘上已存在的数据,不然操作就会报错。
具体的操作是很简单的,例如将磁盘组asmdisk2的磁盘asmdisk2_0000的磁盘空间调整为1000m(原为8189m),操作如下:
SQL> alter diskgroup asmdisk2 resize disk asmdisk2_0000 size 1000m;
Diskgroup altered.
2.2.4 手动平衡磁盘组
一般情况下ASM都会自动对其下的磁盘组进行平衡,不过ORACLE也提供了手动平衡磁盘组的方式,通过 alter diskgroup ... power 语句。前面提到过磁盘组的平衡度有0到11多个级别,默认是按照ASM_POWER_LIMIT初始化参数中设置的值,手动平衡的话,设置的平衡度可以与初始化参数中并不相同,例如,设置磁盘组平衡度为5,语句如下:
SQL> alter diskgroup asmdisk2 rebalance power 5;
Diskgroup altered.
手动平衡磁盘组可能涉及大量的工作,该操作可能费时较久,因此DBA在执行该语句时,一定要注意该操作对IO性能的影响。
另外再次强调,上述语句将很快返回diskgroup altered的提示,但这并不表示操作真正完成,它只是反馈语句提交而已,查看磁盘后台的操作,可以通过v$asm_operator视图,或者在语句执行时增加wait子句,这样ASM将会等到操作真正完成时,才返回提示信息。