#
## ASM 实例构成概述
#SGA/ CSS/ EXTENT MAP/ RBAL/ ABRn/ ASMB
ASM:Automatic Storage Management, 是Oracle 主推的一种面向Oracle的存储解决方案,ASM 和 RDBMS 非常相似,ASM 也是由实例和后台进程组成, 可以通过sqlplus 工具或者asmcmd来维护。 ASM实例的创建和删除也可以用DBCA来实现。
无论是否在RAC 环境下,ASM 实例都是需要CSS 进程。在非RAC 环境下,启动ASM 实例之前须先用脚本 $ORACLE_HOME/bin/localconfig add 启动CSS,否则报错ORA-29701: unable to connect to Cluster Manager, 并提示执行该脚本
>> ASM 实例构成之SGA:
包括Buffer Cache,Share Pool,Large Pool等。 需要注意的是Share Pool(默认48M), 因为Extent Map 要放在这部分的内存中,需要根据数据量来估计Extent Map 的大小做相应的调整,通常是根据数据文件、日志文件及临时表空间大小总和对应着数据库存放ASM中所有文件大小总和, 对于使用External Redundancy 的磁盘组, 每100G 需要1MB 的Extent Map, 根据这个比例计算Extent Map 所需要的空间,在加上额外的2MB就可以了。 实际工作中一般使用Oracle 提供的缺省值即可。
>> ASM 实例构成之后台进程:
ASM实例比RDBMS 实例多2个进程: RBAL 和 ABRn。
RBAL:Rebalancer进程,负责规划ASM 磁盘组的Reblance活动。
ABRn:是RBAL的子进程,这个进程在数量上可以有多个, n从1~9, 这组进程负责真正完成Reblance活动。
使用ASM 作为存储的RDBMS 实例也会多出2个进程: RBAL 和 ASMB
RBAL: 主要功能是用于打开每个磁盘的所有磁盘和数据的Rebalance。
ASMB: 作为ASM 实例和数据库实例之间的信息通道,负责与ASM 实例的通信, 先利用Diskgroup Name 从CSS 获得管理该Diskgroup 的ASM 实例的连接串, 然后建立到ASM 的持久连接, 两个实例之间通过这条连接定期交换信息,同时也是一种心跳机制。
此外,RDBMS 实例要想使用ASM 作为存储, RDBMS 实例必须在启动时从ASM 实例获得Extent Map。此后发生磁盘组的维护操作, ASM 实例还要把Extent Map的更新信息通知给RDBMS 实例, 这2个实例间的信息交换就是通过ASMB 进程完成的。 这也就为什么 ASM 实例必须要先于数据库实例启动,迟于数据库实例关闭的原因。
注: ASM 实例和数据库实例的关系可以是1:1, 也可以是1:n。如果是1:n, 最好为ASM 安装单独的ASM_HOME。
#
## ASM 实例常用参数简介
#instance_type/ db_unique_name/ asm_power_limit/ asm_diskstring/ asm_diskgroups
>> Instance_type: 对于ASM 实例,设成ASM,如果是数据库实例,则是RDBMS。
>> DB_UNIQUE_NAME: 这个参数使用缺省值+ASM即可。
>> ASM_POWER_LIMIT: 当在磁盘组中增删磁盘时,磁盘组会自动对数据在新旧磁盘间做Rebalance操作, 从而实现IO分散。 该动作会在磁盘间移动数据,影响部分性能,故要在系统空闲的时进行。 该参数同时控制着Rebalance速度,取值范围0-11. 最小值0 代表不做Rebalance,最大值11 代表最快的速度,也意味着严重影响性能。
除了在初始化参数中定义该参数, 也可以在操作时指定,如:
SQL> alter diskgroup DATA rebalance power 5;
Disk groups can be rebalanced manually using the REBALANCE clause of the ALTER DISKGROUP statement. If the POWER clause is omitted the ASM_POWER_LIMIT parameter value is used. Rebalancing is only needed when the speed of the automatic rebalancing is not appropriate.
>> ASM_DISKSTRING: 定义哪些磁盘可以被ASM 使用, ASM 实例启动时就根据这个参数值扫描发现ASM磁盘,配置了这个参数以后,还必须确认ORACLE 用户对这些磁盘有操作的权限。
(1) 如果使用裸设备, 用逗号分隔每个设备名:
asm_diskstring='/dev/raw/raw1','/dev/raw/raw2','/dev/raw/raw3'
(2) 如果使用ASMLib时,就需要使用"ORCL:磁盘名"
asm_diskstring='ORCL:VOL1'
(3)使用ASMLib 时, 也可以使用通配符:
asm_diskstring='ORCL:VOL*'
>> ASM_DISKGROUPS: 这个参数用于定义ASM 实例启动后自动挂载的磁盘组, 如果不自动挂载,也可以使用命令挂载。
注: ASM 实例启动即可通过pfile, 也可通过spfile,跟RDBMS实例一样,使用pfile记得手工更新参数。
#
## ASM实例常用操作
# 状态/ mount/ diskgroup/ alias
>> 通过视图检查disk group信息:
SQL> select STATE,REDUNDANCY,TOTAL_MB,FREE_MB,NAME,FAILGROUP from v$asm_disk;
SQL>select GROUP_NUMBER,NAME,STATE,TYPE,TOTAL_MB,FREE_MB,UNBALANCED from v$asm_diskgroup;
>> 创建新的diskgroup(本例采用普通冗余):
SQL> create diskgroup dgtest normal redundancy failgroup DATA1 disk '/dev/oracleasm/VOL5' name DATA1 failgroup DATA2 disk '/dev/oracleasm/VOL6' name DATA2;
SQL> drop diskgroup DATA including contents; --删除
注:对于多结点的diskgroup, 只能有在一个asm实例上挂载之后才能被drop,且其他结点必须处于dismount状态。
>> 手动mount|umount命令:
SQL>ALTER DISKGROUP ALL DISMOUNT | MOUNT;
SQL>ALTER DISKGROUP DATA DISMOUNT | MOUNT;
>> 为diskgroup增删disk及取消删除disk:
SQL> alter diskgroup DATA add disk '/dev/oracleasm/VOL5' name VOL5,'/dev/oracleasm/VOL6' name VOL6;
SQL> alter diskgroup DATA drop disk VOL5; --删除
取消删除disk的命令,只能在上述命令没执行完成时有效,如:
SQL>ALTER DISKGROUP DATA UNDROP DISKS;
The UNDROP DISKS clause of the ALTER DISKGROUP statement allows pending disk drops to be undone. It will not revert drops that have completed, or disk drops associated with the dropping of a disk group.
>> DISKGROUP数据文件别名管理:
(1) Create an alias using the fully qualified filename.
ALTER DISKGROUP disk_group_1 ADD ALIAS '+disk_group_1/my_dir/my_file.dbf' FOR '+disk_group_1/mydb/datafile/my_ts.342.3';
(2) Create an alias using the numeric form filename.
ALTER DISKGROUP disk_group_1 ADD ALIAS '+disk_group_1/my_dir/my_file.dbf' FOR '+disk_group_1.342.3';
(3) Rename an alias.
ALTER DISKGROUP disk_group_1 RENAME ALIAS '+disk_group_1/my_dir/my_file.dbf' TO '+disk_group_1/my_dir/my_file2.dbf';
(4) Drop an alias.(Not Delete)
ALTER DISKGROUP disk_group_1 DROP ALIAS '+disk_group_1/my_dir/my_file.dbf';
注意事项:
(1)ASM 实例在配置好并且创建了ASM磁盘组之后,还必须保证已经注册到Listener中后才能在数据库实例中使用,否则就需要手工注册ASM 实例:
SQL>alter system register;
(2)一旦数据库实例使用ASM 作为存储, 那么在数据库实例运行时是无法关闭ASM实例的。 否则会报错误 ORA-15097:cannot SHUTDOWN ASM instance with connected RDBMS instance.
>> 删除ASM实例
+ASM的删除是在数据库被卸载之后完成的,并删除/ORACLE_HOME/dbs目录下的所有文件(除了与ASM相关的)。因此必须完成下列步骤:
(1)设置oracle_sid环境变量为+ASM实例:$export oracle_sid=+ASM
(2)以sys用户登录后,确定是否有数据库实例正在使用+ASM实例:SQL>select instance_name from v$asm_client; --列出所有正在运行并使用+ASM实例的数据库实例。只要+ASM包含正在支持的数据库实例,就不能删除该+ASM实例。(其实可以先shutdown对应的数据库实例,然后从asmcmd进入磁盘组所在目录,删掉对应的数据库目录和文件就可以了)。
(3)如果没有与+ASM相关联的数据库实例,则删除与该实例相关联的磁盘组,如:
SQL>select name from v$asm_diskgroup;
SQL>drop diskgroup <disk_group_name> including contents;
(4) 关闭+ASM实例并退出SQL*Plus:
(5) 在命令提示符中输入下列命令,删除+ASM服务(我没找到这个命令,所以没有运行):#oradim -delete -asmsid +ASM
当然,也可以使用DBCA来实现。
注:ASM文件名字的格式是固定的:+group/dbname/filetype/tag.file.incarnation对于在创建db时系统自动创建的几个表空间(system,undotbs,sysaux,users)对应的都是真实的数据文件,即ASM 文件默认的命名格式。且这个信息已写到了控制文件里。如果要使用别名的话,除了手工创建对应别名外,还需要重建控制文件(重建时,datafile 里写别名的信息)。