首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Oracle ASM治理(原创)

2012-12-22 
Oracle ASM管理(原创)ASM概述Automatic Storage Management(ASM)是Oracle数据库10g中一个非常出色的新特性

Oracle ASM管理(原创)

ASM概述
Automatic Storage Management(ASM)是Oracle数据库10g中一个非常出色的新特性,它以平台无关的方式提供了文件系统、逻辑卷管理器以及软件RAID等服务。ASM可以条带化和镜像磁盘,从而实现了在数据库被加载的情况下添加或移除磁盘以及自动平衡 I/O 以删除“热点”。
ASM中的文件既可以由数据库自动创建和命名(通过使用 Oracle 管理文件特性),也可以由 DBA 手动创建和命名。由于操作系统无法访问 ASM 中存储的文件,因此对使用ASM文件的数据库执行备份和恢复操作的唯一途径就是通过RMAN。

ASM 作为单独的Oracle 实例实施,只有它在运行时其他数据库才能访问它。在 Linux上,只有运行OCSSD服务(由Oracle通用安装程序默认安装)才能使用 ASM。ASM对大多数系统,只需64MB内存。
ASM的优点
1. ASM是跨平台的,主流硬件平台都可以使用,管理方式一致。
2. 数据均匀分布在磁盘组里所有的磁盘上,实现了文件级别的条带化,提高了读取和写入的数据的性能。
3. 提供了多重冗余级别 ,保证数据安全。
4. 能支持在线磁盘更换。添加或删除磁盘后,自动重新分布数据,因此也不存在碎片的问题
ASM的SGA组成
ASM实例的SGA包括Buffer Cache, Share Pool, Large Pool等。 需要注意的是Share Pool, 因为Extent Map要放在这部分的内存中,需要更具数据量来估计Extent Map的大小做相应的调整。
Extent Map 的大小可以根据所有文件大小的和来估算,使用下面的语句来计算所有文件和:
Select sum(bytes)/(1024*1024*1024) from v$datafile;
Select sum(bytes)/(1024*1024*1024) from v$logfile a, v$log b where a.Group#=b.Group#;
Select sum(bytes)/(1024*1024*1024) from v$tempfile where status='online';
这3个sum 的总和对应着数据库存放ASM中所有文件大小总和,对于使用External Redundancy 的磁盘组, 每100G 需要1MB 的Extent Map,根据这个比例计算Extent Map 所需要的空间,在加上额外的2MB就可以了。在实际工作中一般不需要考虑ASM SGA的配置,使用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相关概念
ASM磁盘组
ASM存储管理除了ASM实例之外,最大的组成部分就是ASM磁盘组。一个ASM磁盘组由过多个ASM磁盘组成。一个磁盘组内可以存放多个数据文件,一个数据文件仅仅只能位于一个磁盘组内,不能跨磁盘组。多个数据库可以共享相同的或多个磁盘组。
ASM磁盘
ASM磁盘中可以包含多个文件,多个文件也可以打散放在多个磁盘上,因此磁盘和文件是多对多的关系。一个ASM磁盘被分成多个AU(allocation unit),每个AU 大小是1M,一个Oracle数据块一定放在一个AU中,不会跨多个AU,一个AU则由多个物理磁盘块组成,AU是ASM进行扩张和收缩时的最小单位(一个windows 系统默认系统块是4K)
ASM故障组
故障组(FAILGROUP),实际上就是ASM DISK的一个逻辑组合,是磁盘组内磁盘镜像的对应关系表示。如果不指定哪些ASM DISK属于哪个FAILGROUP,那么可以理解每个ASM DISK都是一个FAILGROUP。磁盘组有3种镜像的方式:External redundancy, Normal redundancy, High redundancy.这三种镜像的方式,就是针对故障组来说,如果有2个故障组,就是Normal方式镜像,如果有3个故障组就是High方式镜像.
External Redundancy:不在ASM磁盘中提供镜像功能,如果有硬件冗余,那么可设置此项。
Normal Redundancy:提供双重镜像功能,对于文件里的每个AU都会存在该AU的一个副本。
High Redundancy:提供三重镜像功能,对于文件里的每个AU都会存在该AU的两个副本。
ASM镜像的规则:不会将AU(称为主AU)与他的镜像副本放在同一个故障组里。

ASM镜像针对AU级别进行,比如一个文件有6个AU, 磁盘组定义了两重镜像,假设P1-P6代表主AU, M1-M6代表镜像AU, 那么failuer group1中3个磁盘(假设3个),存放可能分别是(P1,M6),(P2,M5),(P3,M4),而failuer group2中3个磁盘存放可能分别是(M1,P4),(M2,P5),(M3,P6)。
SQL> create diskgroup? test normal redundancy disk 'ORCL:LUN4' name LUN4, 'ORCL:LUN3' name LUN3
?failgroup? fg1 disk? 'ORCL:LUN1' name LUN1 , 'ORCL:LUN2' name LUN2;??
Diskgroup created.

SQL>??? select group_number,disk_number,name,failgroup,create_date,path from v$asm_disk;
GROUP_NUMBER DISK_NUMBER NAME???????????????? FAILGROUP??????????? CREATE_DATE???? PATH
------------ ----------- -------------------- -------------------- --------------- ------------------------------
?????????? 0?????????? 0?????????????????????????????????????????????????????????? /dev/raw/raw2
?????????? 0?????????? 1?????????????????????????????????????????????????????????? /dev/raw/raw1
?????????? 2?????????? 2 LUN1???????????????? FG1????????????????? 07-DEC-12?????? ORCL:LUN1
?????????? 2?????????? 3 LUN2???????????????? FG1????????????????? 07-DEC-12?????? ORCL:LUN2
?????????? 2?????????? 1 LUN3???????????????? LUN3???????????????? 07-DEC-12?????? ORCL:LUN3
?????????? 2?????????? 0 LUN4???????????????? LUN4???????????????? 07-DEC-12?????? ORCL:LUN4
?????????? 1?????????? 0 VOL1???????????????? VOL1???????????????? 26-NOV-12?????? ORCL:VOL1

可以看到,磁盘组test内的LUN1和LUN2属于故障组FG1,LUN3和LUN4分别属于故障组LUN3、LUN4
注意:对于已创建的磁盘组,不能够更改其冗余级别,如要更改,需要删除该磁盘组后再重新创建

管理ASM磁盘组
ASM磁盘组将每块磁盘分割为多个大小为1M的单元,这叫分配单元(AU)。对磁盘组里面的数据文件来说,ASM将数据文件分割为大小为1M的块(chunk),并将这些chunk均匀的分布在所有磁盘,这叫做coarse striping(粗粒度条带);? 对于数据库中的
redo log及controlfile,因为文件较小,且需要较快的访问速度,ASM将他们分割为128KB的chunk, 这叫做fine-grained striping(细粒度条带), 一个AU(1M)会放多个128KB的chunk,? 这样一次I/O就会分割为多个更小的I/O, 并行完成。
ASM磁盘组组中的磁盘大小及转速应该一致,ASM磁盘组的个数不应该过多,2个就够用了,一个用于存储数据,一个用于flash recovery area。另外尽可能将数据区与闪回区使用不同的物理通道,尽可能一次性mount所有需要用到的磁盘,尽可能将数据区与闪回区使用不同的物理通道。建议使用性能,磁盘大小相近的磁盘。假定两个故障组FG1,FG2各使用一块磁盘,则FG1内的磁盘最好与FG2内的磁盘大小相同,否则会以最小的磁盘空间作为可使用空间。
我们不能直接删除磁盘组,当故障组中最后一块磁盘被删除以后,该故障组被删除。ASM支持热插拔磁盘,当我们向磁盘组中加入磁盘的时候,ASM会自动将磁盘组中每块磁盘上取出部分AU, 写入新加入的磁盘,使所有磁盘含有数据大致相同,当我们从磁盘组中删除磁盘时,同样被删除磁盘中的AU会被平均分配到其他磁盘,这个过程叫做再平衡(rebalance)。未使用force关键字drop磁盘操作,该磁盘上所有数据rebalance完毕后才被释放.即完毕后磁盘脱机,磁盘头部状态为former
Rebalance :? Reblance的过程自动进行,需要我们设置asm_power_limite的值以调整速度。
总之,任意存储性质改变(磁盘增加,删除,故障)都将导致rebalance,且由asm自动完成,无需人工干预,在一个时间段通常会锁定一个盘区。

ASM中没有数据字典信息,ASM是通过物理磁盘的头部记录元数据,描述了每个磁盘属于哪个磁盘组及故障组的信息。 ASM的每块磁盘都是自我描述的。
ASM实例的相关操作
检查磁盘和磁盘组信息的SQL:
col state format a10
col name format a15
col failgroup format a20?
col HEADER_STATUS for a12
set line 200
select?? group_number ,STATE,REDUNDANCY,TOTAL_MB,FREE_MB,NAME,FAILGROUP,header_status from v$asm_disk;
select? GROUP_NUMBER,NAME,STATE,TYPE,TOTAL_MB,FREE_MB,UNBALANCED? from v$asm_diskgroup;
创建新的diskgroup
CREATE DISKGROUP diskgroup_name
????????????? [ { HIGH | NORMAL | EXTERNAL } REDUNDANCY ]
????????????? [ FAILGROUP failgroup_name ]
????????????? DISK [ NAME disk_name ] [ SIZE size_clause ] [ FORCE | NOFORCE ] ...;
create diskgroup dgtest normal redundancy
failgroup DATA1 disk '/dev/oracleasm/disks/VOL5' name DATA1
failgroup DATA2 disk '/dev/oracleasm/disks/VOL6' name DATA2;
使用ASMLib时的可以用ORCL:代替/dev/oracleasm/disks/如,ORCL:VOL5
删除diskgroup
drop diskgroup <diskgroup_name>? [including contents] [force];

drop diskgroup DATA including contents;

默认子句为excluding contents,当磁盘组内包含数据时将报错。需加上
INCLUDING CONTENTS:删除掉磁盘组中的所有文件。

FORCE:清除磁盘头的相关信息。在集群环境下如果操作的磁盘组正在使用或者在其他节点上挂载,则该语句将失败。
注意:对于多结点的diskgroup,只能有在一个asm实例上挂载之后才能被dorp, 其他结点必须dismount。
手动mount命令
ALTER DISKGROUP ALL DISMOUNT;
ALTER DISKGROUP ALL MOUNT;
ALTER DISKGROUP <diskgroup_name> DISMOUNT;
ALTER DISKGROUP <diskgroup_name> MOUNT;

磁盘成员管理
为diskgroup增加disk
alter diskgroup DATA add disk '/dev/oracleasm/VOL5' name VOL5,'/dev/oracleasm/VOL6' name VOL6;
从diskgroup删除disk
alter diskgroup DATA drop disk VOL5;
取消删除disk的命令,只在上述命令没执行完成的时候有效
ALTER DISKGROUP DATA UNDROP DISKS;
为DG2的个故障组各添加一个成员
alter diskgroup DG2
add failgroup FG1 disk '/dev/oracleasm/disks/VOL7'
add failgroup FG2 disk '/dev/oracleasm/disks/VOL8'
add failgroup FG3 disk '/dev/oracleasm/disks/VOL9';
数据文件别名
取别名
alter diskgroup <diskgroup_name> add alias <alias_name> for '<asm_file>';??
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';
注意:10g中只有利用OMF创建的ASM文件才能取别名(11g未测试),且别名和原文件名的diskgroup必须一致,如上例的+disk_group_1
重命名别名
ALTER DISKGROUP disk_group_1 RENAME ALIAS '+disk_group_1/my_dir/my_file.dbf'? TO '+disk_group_1/my_dir/my_file2.dbf';
删除别名
ALTER DISKGROUP disk_group_1 DELETE ALIAS '+disk_group_1/my_dir/my_file.dbf';
使用别名删除数据文件
ALTER DISKGROUP disk_group_1 DROP FILE '+disk_group_1/my_dir/my_file.dbf';
使用全面删除数据文件
ALTER DISKGROUP disk_group_1 DROP FILE '+disk_group_1/mydb/datafile/my_ts.342.3';
查看别名信息

select * from v$asm_alias;
手动Rebalance
alter diskgroup DG2 rebalance power 3 wait;
为磁盘组增加目录

为磁盘组增加目录
alter diskgroup DG2 add directory '+DG2/datafile';????

注意必须确保各级目录都存在,否则会报错ORA-15173
SQL> alter diskgroup t add directory '+T/czmmiao/ss/s';
alter diskgroup t add directory '+T/czmmiao/ss/s'
*
ERROR at line 1:
ORA-15032: not all alterations performed
ORA-15173: entry 'ss' does not exist in directory 'czmmiao'
报错,逐层创建即可
SQL>? alter diskgroup t add directory '+T/czmmiao/ss';
Diskgroup altered.
SQL>? alter diskgroup t add directory '+T/czmmiao/ss/s';
Diskgroup altered.????????????
重命名目录
SQL>? alter diskgroup t rename directory '+T/czmmiao/ss' to '+T/czmmiao/sa';
Diskgroup altered.

删除目录
alter diskgroup DG2 drop directory '+DG2/dtfile';????????????????
未使用OMF创建表空间 ????

create tablespace iotest datafile '+data/iotest.dbf' size 100m;
ASM 磁盘的相关视图
v$asm_disk(_stat)?????? --查看磁盘及其状态信息
v$asm_diskgroup(_stat)? --查看磁盘组及其状态信息
v$asm_operation???????? --查看当前磁盘的操作信息
v$asm_client??????????? --返回当前连接的客户端实例信息
v$asm_file????????????? --返回asm文件的相关信息
v$asm_template????????? --返回asm文件样本的相关信息
v$asm_alias???????????? --返回asm文件的别名信息

ASM的常见故障
1.创建磁盘时出现错误可以查看asm日志
tail -f /var/log/oracleasm????
2.启动asm实例时出现ORA-29701错误
ORA-29701: unable to connect to Cluster Manager
首次需要启用css服务,使用root帐户,运行

$ORACLE_HOME/bin/localconfig add??
如果下次启动实例的时候仍然碰到如下报错:
ORA-29701: unable to connect to Cluster Manager
那么检查/etc/inittab 文件,看看是否有下面这行
h1:35:respawn:/etc/init.d/init.cssd run >/dev/null 2>&1 </dev/null
如果没有请添加,如果被注释了请取消注释(root帐户)。
也可以使用root帐户执行/u01/oracle/10g/bin/localconfig reset来解决

如果在执行长时间hang住,可以执行如下操作
$ORACLE_HOME/bin/localconfig delete
$ORACLE_HOME/root.sh? ?
$ORACLE_HOME/bin/localconfig add??
3.磁盘搜索路径问题
SQL> create diskgroup DG1 normal redundancy disk 'ORCL:VOL1','ORCL:VOL2';
create diskgroup DG1 normal redundancy disk 'ORCL:VOL1','ORCL:VOL2'
*
ERROR at line 1:
ORA-15018: diskgroup cannot be created
ORA-15031: disk specification 'ORCL:VOL2' matches no disks
ORA-15031: disk specification 'ORCL:VOL1' matches no disks
使用oraclasm创建磁盘后,缺省会在/dev/oracleasm/disks目录下添加刚刚创建的磁盘映射,修改asm_diskstring修改路径之后再次创建即可
alter system set asm_diskstring='/dev/oracleasm/disks/VOL*'
注意事项: ASM 实例在配置好并且创建了ASM磁盘组之后,还必须保证已经注册到Listener中后才能在数据库实例中使用,否则就需要手工注册ASM 实例:
SQL>alter system register;

参考至:《大话Oracle Rac》张晓明著
?????????????? http://blog.csdn.net/robinson_0612/article/details/6134071
?????????????? http://www.cnblogs.com/huangjingzhou/articles/2140514.html
?????????????? http://brentt.blog.51cto.com/3611229/854585
?????????????? http://space.itpub.net/35489/viewspace-706569
?????????????? http://liuzhaomin.iteye.com/blog/932116
?????????????? http://space.itpub.net/175005/viewspace-312636
?????????????? http://www.itpub.net/thread-1347371-1-1.html
?????????????? http://www.cnblogs.com/zlja/archive/2010/12/16/2449357.html
本文原创,转载请注明出处、作者
如有错误,欢迎指正
邮箱:czmck@163.com

热点排行