ASM是一个黑盒子,黑盒子的好处就是里面的东西我们不用费脑细胞管,坏处就是你想费脑细胞也没机会。
先看个示例:
登入数据库实例
创建一个自己的表空间,创建一个用户,创建一个表
SQL> create tablespace ts_test datafile '+DGROUP1' size 200M;
Tablespace created.
SQL> create user kamus identified by pass default tablespace ts_test;
User created.
SQL> grant dba to kamus;
Grant succeeded.
SQL> conn kamus/pass
Connected.
SQL> create table t_test as select * from dba_objects;
Table created.
SQL> select count(*) from t_test;
COUNT(*)
------------------------
10319
从中可以看出,与原来创建表空间时需要指定datafile路径与名字不同,这里只要指出想让此表空间去哪个ASM组就行了。
具体oracle怎么分配这(些)datafile,怎么避免热点,就些就不用我们操心了。
ASM提供了3种冗余方法。
external redundancy表示Oracle不帮你管理镜像,功能由外部存储系统实现,比如通过RAID技术。
normal redundancy(默认方式)表示Oracle提供2路镜像来保护数据。
high redundancy表示Oracle提供3路镜像来保护数据。
ASM可以动态增加和删减硬盘,假设ASM的diskgroup A为normal,假设原本的diskgroup 有2块盘,当增加2块盘进入后,原来分布于2块盘上的数据将由oracle自动平均分布到4块盘上,达到避免热点,均衡I/O的效果。(不知道normal下是不是必须是偶数块硬盘) 当删除一块时,不会有影响,重新插入后就能自动写上去。
11G下默认拔出硬盘3.5小时内oracle是不会认为你要重写的,即当3.5小时后再插入,硬盘数据将被重写。10G下不知道。
测试ASM数据库的automatic rebalance功能 添加两个虚拟硬盘,分别是sdf和sdg,大小500M 启动系统,启动ASM实例,启动数据库 实例
创建ASM磁盘
#/etc/init.d/oracleasm createdisk VOL5 /dev/sdf
#/etc/init.d/oracleasm createdisk VOL6 /dev/sdg
登入ASM实例检查v$asm_disk视图,发现这两个新加的硬盘已经找到了 将硬盘添加到磁盘组中
SQL> ALTER DISKGROUP DGROUP1 ADD FAILGROUP FGROUP1 DISK 'ORCL:VOL5' FAILGROUP FGROUP2 DISK 'ORCL:VOL6';
Diskgroup altered.
检查数据库的auto rebalance工作进度,数据库正在将原来分布在两个磁盘上的数据平均分配到三个磁盘上
SQL> SELECT group_number, operation, state, est_work, sofar, est_rate, est_minutes FROM v$asm_operation;
SQL> /
GROUP_NUMBER OPERATION STATE EST_WORK SOFAR EST_RATE EST_MINUTES
------------ ---------- -------- ---------- ---------- ---------- -----------
1 REBAL RUN 275 39 148
1
以上表示数据重新分配的工作已经成功完成
SQL> select name,allocation_unit_size,total_mb from v$asm_diskgroup;
NAME ALLOCATION_UNIT_SIZE TOTAL_MB
------------------------------ -------------------- ----------
DGROUP1 1048576 5120
登入ASM实例,将磁盘从磁盘组中删除
SQL> alter diskgroup dgroup1 drop disk VOL4;
Diskgroup altered.
SQL> SELECT group_number, operation, state, est_work, sofar, est_rate, est_minutes FROM v$asm_operation;
GROUP_NUMBER OPERATION STATE EST_WORK SOFAR EST_RATE EST_MINUTES
------------ ---------- -------- ---------- ---------- ---------- -----------
1 REBAL RUN 566 46 151
3
SQL> select name,allocation_unit_size,total_mb from v$asm_diskgroup;
NAME ALLOCATION_UNIT_SIZE TOTAL_MB
------------------------------ -------------------- ----------
DGROUP1 1048576 4096
Executed in 0.13 seconds
SQL> select label,failgroup from v$asm_disk;
LABEL AILGROUP
------------------------------- -----------------------------------------
VOL1 FGROUP1
VOL2 FGROUP1
VOL3 FGROUP2
VOL5 FGROUP1
VOL6 FGROUP2
可以看到磁盘组的总容量已经减少了,磁盘数目也减少了