asm相关
!--查看asm磁盘组对应的物理磁盘
如果是用oracleasm createdisk创建的disk可以用命令
/etc/init.d/oracleasm querydisk
比如
/etc/init.d/oracleasm querydisk -v /dev/sd* 2>&1 | grep VOL
如果是直接用raw device来添加的
可以查询v$asm_disk的path和mount_status 字段。
linux 32bit oracle 10.2.0.5.0 asm,以下操作在ORACLE_SID=+ASM的实例进行。
(1)在oracle和asm的instance里,查相出视图结果不同
--v$asm_disk;
set lines 200
col label for a10
col name for a10
col path for a20
select group_number,disk_number,mount_status,header_status,state,redundancy,name,path,total_mb,free_mb,failgroup,label
from v$asm_disk;
--要注意,不属于任何一个disk_group的asm_disk的group_number列为0;
在asm中mount_status=cached,header_status=member,free_mb=正常值,failgroup=自已所在磁盘
在oracle中,mount_status=opened,header_status=unknown,free_mb为0,failgroup=null
--v$asm_diskgroup
col database_compatibility for a20
set lines 200
select group_number,name,sector_size,block_size,allocation_unit_size,state,type,total_mb,free_mb,database_compatibility
from v$asm_diskgroup;
(2)--增加删除磁盘的方法(这些操作在dbca里图形化也可以操作,且稳定)
1、通过/etc/init.d/oracleasm createdisk VOLn /dev/sdbx 增加asmdisk
2、在type=asm的instance里:(默认的rebalance为1,最慢,最大11,会对io性能有影响)
alter diskgroup mydata add disk 'ORCL:VOLn' rebalance power 1;--这里的ORCL:VOLn指的path
--删除:
alter diskgroup mydata drop disk 'VOLn' rebalance power 1;--这里的VOLn指的label或是name
--这种方式可能也行(但添加的去name,mount_status状态不对)
alter diskgroup DATA add disk '/dev/raw/raw3' name data007;
(3)--手动平衡磁盘组
一般情况下ASM都会自动对其下的磁盘组进行平衡,不过ORACLE也提供了手动平衡磁盘组的方式
手动平衡的话,设置的平衡度可以与初始化参数中并不相同,例如,设置磁盘组平衡度为5
alter diskgroup data rebalance power 5;
另外再次强调,上述语句将很快返回diskgroup altered的提示,但这并不表示操作真正完成,它只是反馈语句提交而已
查看磁盘后台的操作,可以通过v$asm_operation视图,或者在语句执行时增加wait子句,这样ASM将会等到操作真正完成时,才返回提示信息
(4)mount/unmount 磁盘组
只有被mount的磁盘组才能被数据库使用并执行add/drop等磁盘操作,ASM中的磁盘组默认会在ASM实例启动时自动加载,当然也可以手动通过命令行语句mount/unmount磁盘组
查询ASM实例中创建的磁盘组可以通过V$ASM_DISKGROUP视图查看:
select group_number,name,state,total_mb,free_mb from v$asm_diskgroup;
当前两个磁盘组均为MOUNT状态,要将其置为UNMOUNT,执行语句如下:
alter diskgroup mydata dismount;
UNMOUNT磁盘组的话务必慎重操作,要确保UNMOUNT的磁盘组中保存的文件对应的数据库当前未启动,而且该操作也会直接导致数据库SHUTDOWN。
(5) 删除磁盘组
语法:drop diskgroup mydata;
如果删除的diskgroup非空的话,直接执行上述语句会报错
这时候可以通过附加including contents子句,来自动删除该磁盘组中包含的文件
删除磁盘组的操作会自动修改spfile中ASM_DISKGROUPS初始化参数的值(如果使用了SPFILE的话)
(6)测试在EXTERNAL的模式下,只要有一个asm_disk坏掉,整个磁盘组就会dismount(这些创建磁盘组,添加删除磁盘组磁盘的都可以在dbca下进行,且稳定)
CREATE DISKGROUP diskgroup_name [ { HIGH | NORMAL | EXTERNAL } REDUNDANCY ]
[ FAILGROUP failgroup_name ]
DISK [ NAME disk_name ] [ SIZE size_clause ] [ FORCE | NOFORCE ]
例子如下:ORCL:VOL3对应/dev/sdb6
create diskgroup disk2 EXTERNAL REDUNDANCY disk 'ORCL:VOL3';
[root@node01 bin]# dd if=/dev/zero of=/dev/sdb6
dd: 正在写入 “/dev/sdb6”: 设备上没有空间
112393+0 records in
112392+0 records out
57544704 bytes (58 MB) copied, 0.680422 seconds, 84.6 MB/s
以上dd命令破坏了asm_disk的header
SQL> col database_compatibility for a20 SQL> set lines 200 SQL> select group_number,name,sector_size,block_size,allocation_unit_size,state,type,total_mb,free_mb,database_compatibility 2 from v$asm_diskgroup; GROUP_NUMBER NAME SECTOR_SIZE BLOCK_SIZE ALLOCATION_UNIT_SIZE STATE TYPE TOTAL_MB FREE_MB DATABASE_COMPATIBILI ------------ ---------- ----------- ---------- -------------------- ----------- ------ ---------- ---------- -------------------- 1 MYDATA 512 4096 1048576 MOUNTED EXTERN 3826 2849 10.1.0.0.0 2 DISK2 512 4096 1048576 MOUNTED EXTERN 0 0 10.1.0.0.0
我们发现此时这个磁盘组还是处于mount状态,但是total_mb和free_mb都变成了0,即虽然仍然被加载,但不可用。下面查年一下v$asm_disk:
SQL> select group_number,disk_number,mount_status,header_status,state,redundancy,name,path,total_mb,free_mb,failgroup,label 2 from v$asm_disk; GROUP_NUMBER DISK_NUMBER MOUNT_S HEADER_STATU STATE REDUNDA NAME PATH TOTAL_MB FREE_MB FAILGROUP LABEL ------------ ----------- ------- ------------ -------- ------- ---------- -------------------- ---------- ---------- ------------------------------ ---------- 1 0 CACHED MEMBER NORMAL UNKNOWN VOL1 ORCL:VOL1 1913 1425 VOL1 VOL1 1 1 CACHED MEMBER NORMAL UNKNOWN VOL2 ORCL:VOL2 1913 1424 VOL2 VOL2 2 0 CACHED CANDIDATE NORMAL UNKNOWN VOL3 ORCL:VOL3 54 4 VOL3 VOL3
我们发现在v$asm_disk中,空间正常,但是这个极重要的asm的header_status由原来的member变成了Candidate。
我们将这个data2的diskgroup dismount掉,然后再mount。
SQL> alter diskgroup DISK2 dismount; Diskgroup altered. SQL> alter diskgroup DISK2 mount; alter diskgroup DISK2 mount * ERROR at line 1: ORA-15032: not all alterations performed ORA-15063: ASM discovered an insufficient number of disks for diskgroup "DISK2"
我们发现此时,这个disk_group因为其中一个asm_disk的损坏已经不能正常的mount了。
测试完毕,EXTERNAL REDUNDANCY的diskgroup一定要有外部的raid或其它做保证,这样才安全。