ORACLE ASM 日常管理

时间:2021-11-06 22:18:02

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相关概念
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 extend mirror 位置的强化。一份数据在一个故障组中是唯一的, 镜像是以区为单位,所以不要假象某磁盘和某磁盘是镜像关系 数据是随机的、尽量平均的分散到各个故障组中 一个故障组中,不管有多少个磁盘,都可以把它当成一大块逻辑磁盘 对于normal冗余:只允许一个故障组不可用,不然丢失数据,对于high只允许两个故障组同时不可用,不然丢失数据。 例如4个asm disk,作了1个nomal冗余的dg,那么对于任何一个asm extend(asm 以extend 为单位进行冗余)都有可能在其余的3个asm disk上。如果我们作成了2个failgroup (gp1: disk1 disk2, gp2 disk3 disk4)那么对于任何一个在disk1,disk2 上的extend 只能mirror 到disk3 或者4 了,反之亦然。 所以对于normal冗余,如果要能够容忍某几个磁盘同时不可用,那么可以将这几个磁盘定义成一个故障组,就行了。对于normal冗余,一个故障组的所有extend,在其他的故障组有且仅有一份mirror。 对于high冗余,一个故障组的所有extend,有且仅有两份mirror,且分布在其他不同的故障组中。所以可以容忍同个故障组同时不可用。 oracle是不管你创建多少个failure group的,如果没有显式指定,oracle就帮你给每个asm disk都创建一个failure group,在这些group之上,你如果指定是external redundancy,那么oracle就随机(所谓随机还是有自己的算法)选择1个failure group中存储一份数据;如果是normal,那么oracle会随机选择2个failure group各存储一份数据;如果是high,那么就是存3份。

管理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磁盘和系统分区的映射关系

#/etc/init.d/oracleasm querydisk -p VOL1
Disk "VOL1" is a valid ASM disk
/dev/sdb6: LABEL="VOL1" TYPE="oracleasm"

ASM的 磁盘组动态重新平衡

ASM的一个重要特性是可以进行在线磁盘重配置及动态均衡。当我们向已有磁盘组中增加、删除磁盘已经磁盘数据分布不均时,ASM能够调整数据分布,以达到IO均衡的目的,同时这也减少了热点块的发生。这个操作是通过使用索引技术将分配单元分布在各个可用磁盘上实现的,ASM 不必重新条带化所有数据,而只需根据添加或删除的存储量按相应比例移动一定数量的数据,以在磁盘组中的各个磁盘上重新平均分配文件,并维护这些磁盘之间的 I/O 负载平衡。该操作可由ASM自动完成,也能够人为进行控制。如果没在进行磁盘操作时指定平衡的速度,ASM则会根据ASM_POWER_LIMIT的值采用相应的平衡速度。ASM_POWER_LIMIT的取值范围为0~11,值越高,平衡速度也就越快,对系统的造成的额外负荷也就越大。设置为0 表示暂挂重新平衡操作,默认值为1。至于平衡速度的取值决定于系统的硬件环境与系统负载的情况,例如可以在业务繁忙期间只增加磁盘而不进行数据平衡,在不繁忙的时候再进行数据平衡。如果需要添加或删除多个磁盘,则可以在完成磁盘操作后再进行数据平衡,或者同时操作多个磁盘。这样可以让数据平衡一次性完成,避免数据部必要的移动。为了完成数据平衡,Oracle引入了一个新的后台进程RBAL来完成这项任务。

数据平衡的操作如下

SQL> alter diskgroup ORADG add disk 'ORCL:VOL6' rebalance power 11;

SQL> show parameter power
NAME TYPE VALUE
------------------------------------ ---------------------- ----------------
asm_power_limit integer 1 SQL>ALTER DISKGROUP dgroupB REBALANCE POWER 5;

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;