Oracle文件系统的历史
操作系统--逻辑卷管理器(LVM)
管理文件相对容易,性能较差
裸设备
管理文件相对困难,性能好
ASM
ASM是ORACLE数据库文件支持的卷管理
ASM磁盘组里面只能存放Oracle数据库文件:数据文件、联机重做日志文件、控制文件等
OCFS(Oracle Cluster File System)
是ORACLE数据库文件系统
ASM的优点
1、ASM是跨平台的,主流的硬件平台都能使用、且管理方式一致
2、数据均匀的分布在磁盘组里所有的磁盘上,实现了文件级别的条带化,提高了读取和写入数据的性能
3、提供多重冗余级别,保证数据不丢失
4、支持在线的磁盘更换,添加或删除磁盘以后,自动重分布数据,这个过程叫做rebalance
数据库实例与 ASM之间的交互
ASM实例主要的3个后台进程
1、RBAL:负责协调组内不同磁盘组之间的rebalance工作,reblance工作指的是数据在不同的磁盘之间转移
2、ARBn:用来实际完成rebalance工作,可以由多个进程并发完成rebalance的工作
3、GMON:用来监控磁盘组内有关元数据的维护操作
每个使用了ASM存储的数据库实例也有两个新的进程
1、RBAL:用来打开磁盘组里的磁盘,然后通过DBWn进程将数据写入到这些打开的磁盘里去
2、ASMB:当数据库实例要向某个磁盘组里写入数据时,ASMB会访问Group Services,从中获取有关ASM实例所管理的磁盘组的信息,并通过RBAL进程打开磁盘组,于是就可以将数据写入磁盘组。
Group Services用来注册ASM实例所管理的磁盘组,以及连接磁盘组的信息。
数据库 I/O不通过ASM实例来传输,而是通过RBAL直接根据ASM文件执行I/O操作
数据库实例只能与其所在的同一台主机上的ASM实例通信,如果当前主机上存在多个数据库,则这些数据库可以共享同一个ASM实例。
一、RBAL
在ASM实例中还存在另外一个新的进程,即RBAL,此进程负责规划和协调磁盘组的重新平衡活动。除此之外,ASM实例还有一些与数据库实例中的进程相同的后台进程,例如LGWR、SMON、PMON、DBWR 、CKPT等。
如果一个数据库实例使用ASM作为存储,那么它将多出两个后台进程,即RBAL和ASMB。RBAL 负责打开磁盘组中所有磁盘和数据,而ASMB负责和ASM实例进程通信。
二、管理ASM实例
在使用ASM作为数据存储时,ASM实例管理显得非常重要,Oracle提供了丰富的管理功能,对ORACLE实例进行管理需要具备SYSDBA权限,在Oracle 11g中可以使用一个新角色 ,即SYSASM,此角色只用于管理ASM实例
ASM磁盘组的概念
ASM磁盘组可以包含多个磁盘
(1)磁盘中可以包含多个文件,因为文件打散以后放在多个磁盘上,因此磁盘和文件是多对多的关系
(2)一个ASM磁盘被分成多个AU(分配单元allocation unit),AU是ASM进行扩张和收缩时的最小单位
(3)一个磁盘组可以包含多个数据库文件
ASM磁盘
整个物理磁盘或物理磁盘的分区
Oracle强烈建议不要与其它应用程序程序共享ASM使用的物理磁盘
存储阵列中的磁盘或分区
ASM 磁盘是以存储阵列中的裸 LUN 提供给ASM的
逻辑卷 (LV)或逻辑单元(LUN)
网络连接文件 (NFS)
磁盘尺寸一致
磁盘转速一致
ASM文件
是由 AU组成的ASM区的集合
可变大小的区支持大型文件
文件名以“+”开头
例如,+DATA/orcl/datafile/system.256.689832921
可以在ASM disk group中存储如下类型的文件
Control files
Date files、temporary date files、data file copies
Spfiles
Online redo logs、Archive logs、Flashback logs
RMAN backups
可以通过 select name,state from v$asm_diskgroup;来查看磁盘组信息。
分配单元AU
细粒度条带
细粒度的条带化能降低IO延时
在任何配置下,细粒度的条带化strpe size总是等于128KB
默认情况下,细粒度条带化用于控制文件和联机重做日志文件
粗粒度条带
粗粒度的条带化提供负载均衡功能(load balance)
粗粒度的strip size总是等于AU SIZE大小
Rebalance
对disk group添加和删除磁盘时,ASM会自动重新分布整个disk group磁盘中的数据
Rebalance不是根据组中磁盘个数来平均分布,而是根据磁盘大小分布,所以,组中磁盘大小要保持一样,而且转速也要一致
Rebalance操作不会影响数据库的正常使用
故障组(failure group FG)
故障组主要是为了镜像,在ASM磁盘组里面,镜像是在AU级别上完成的,而不是文件级别上
三种镜像级别
外部镜像(external redundancy)不在ASM磁盘组里面提供镜像功能,如果ASM本身就建立在硬件冗余的基础上,或者容忍数据的丢失,可以配置成外部镜像。
普通镜像(normal redundancy)提供两重镜像功能,对于文件里面的每个AU,都会存在该AU的一份副本。对于普通镜像,ASM要求该磁盘组至少要拥有两个failure磁盘组,即提供双倍镜像保护,对于同一份数据,将有主从两份镜像
高镜像(high redundancy)提供三重镜像功能,对于文件里面的每个AU,都会存在该AU的两份副本
ASM故障组条带化和镜像
安装Oracle Grid Infrastructure
Udev方法安装
使用udev的好处是不管磁盘和sda,sdb,sdc这些怎么变都没问题,因为udev只看磁盘的uuid
当频繁的给系统添加,删除磁盘,或者两个节点公用一组磁盘的时候,udev的好处就体现出来了
通过udev,可以把指定的磁盘(通过uuid唯一确定磁盘)映射到/dev/asm-diskb,/dev/asm-diskc,/dev/asm-diskd这样的设备文件
ASMLib方法安装
在Red Hat Enterprise Linux (RHEL)6以前,Oracle均是使用ASMLib这个内核支持库配置ASM。ASMLIB是一种基于Linux module,专门为Oracle Automatic Storage Management特性设计的内核支持库(kernel support library)。但是,在2011年5月,甲骨文发表了一份Oracle数据库ASMLib的声明,声明中称甲骨文将不再提供Red Hat Enterprise Linux (RHEL)6的ASMLib和相关更新。
与ASM相关的初始化参数有三个:
ASM_POWER_LIMIT:指定磁盘rebalance的程度,有0-11个级别,默认值为1,指定的级别越高,则rebalance的操作就会越快被完成(当然这也意味着这个时间段内将占用更多的资源)
ASM_DISKSTRING:设置ASM启动时检查的磁盘,该选项可以同时指定多个值,并且支持通配符。
/dev/dsk/*只检查/dev/dsk/下的设备,默认情况下该参数为空,表示ASM将查找系统中所有ASM拥有读写权限的设备。
ASM_DISKGROUPS:指定实例启动或alter diskgroup all mount语句时要加载的磁盘组,如果是使用SPFILE的话,该参数一般不需要手动修改,ASM能够自动更新该初始化参数中的值。
关闭Oracle数据库实例:
– 1.先关闭Oracle实例
– 2.再关闭ASM实例:
$ export ORACLE_SID= ORCL
$ sqlplus / as sysdba
SQL> shutdown immediate
...
再关闭ASM实例
$export ORACLE_SID=+ASM
$ sqlplus / as sysasm
SQL> shutdown immediate
ASM查看磁盘组状态
SQL>select group_number,name, state,total_mb,free_mb from v$asm_diskgroup;
SQL> select group_number,name,path,failgroup from v$asm_disk;
要手工向ASM添加磁盘
(1)[root@db4 ~]# oracleasm listdisks
VOL1
VOL2
使用oracleasm querydisk列出某一磁盘的详细信息,如指向的哪个磁盘分区。(这些盘都是通过ASMLIB包构建的)
[root@db4 ~]# oracleasm querydisk
[root@db4 ~]# oracleasm querydisk vol1
Disk "VOL1" is a valid ASM disk
[root@db4 ~]# oracleasm querydisk -v vol1
Disk "VOL1" is a valid ASM disk
[root@db4 ~]# oracleasm querydisk -v -d vol1
Disk "VOL1" is a valid ASM disk on device /dev/sdb1[8,17]
[root@db4 ~]# oracleasm querydisk -v -p vol1
Disk "VOL1" is a valid ASM disk
/dev/sdb1: LABEL="VOL1" TYPE="oracleasm"
/dev/mapper/mpath1p1: LABEL="VOL1" TYPE="oracleasm"
(2)在asm通过v$asm_disk可以查看到哪些磁盘在使用,对比上面得出的信息,可以向磁盘组添加信息
SQL>CRAETE DISKGROUP TEST EXTERNAL REDUNDANCY DISK‘ORL:VOL7’;
创建和删除磁盘组
CREATE DISKGROUP test NORMAL REDUNDANCY
FAILGROUP F1 DISK '/dev/asm-diskm' NAME D1 SIZE 1024 M ,
'/dev/asm-diskn' NAME D2 SIZE 1024 M
FAILGROUP F2 DISK '/dev/asm-disko' SIZE 1024 M ,
'/dev/asm-diskp' SIZE 1024 M;
首先要指定的就是磁盘组名称(diskgroup_name);
● 指定冗余度,有三个选择:HIGH(高度冗余三路)、NORMAL(标准冗余双路)和EXTERNAL(外部存储冗余);
● 选择是否指定FAILGROUP(如果选择非external则必须指定);
● 指定该磁盘组中的成员(对应的LUN),在指定成员时一般ASM能够自动检测出磁盘的容量,也可以指定大小。
添加或删除磁盘的影响
当发生添加/删除磁盘组中磁盘的操作时,ASM能够自动平衡。对于普通的删除操作(无force选项),被删除的磁盘在该上数据被有效处理前并不会立刻释放,同样,新增磁盘时,在重分配工作完成前,该盘也不会承担I/O负载的工作。
由于ASM自动平衡的特性,当删除磁盘操作返回后并不代表磁盘已经被删除,此时后台可能正忙碌地执行着IO重平衡的工作,如果是一个失误的删除操作,那也可以通过alter diskgroup dgname undrop disks语句来取消删除的操作
添加一块磁盘到磁盘组中,如果没有指定故障组,则磁盘组会为这块磁盘创建一个新的故障组,故障组的名字就是磁盘的名字。
删除磁盘以后,ASM磁盘组会自动进行一次rebalance操作,添加磁盘后,还会进行一次rebalance。如果我们需要更换磁盘,那么建议将删除和添加磁盘的操作放在一起执行。
实际生产中
1、先拔下损坏的磁盘,再插入新的磁盘以后
2、执行下面的语句(假设DgroupB的Disk3损坏,现在使用raw4去替换)
SQL>alter diskgroup DgroupB
drop disk Disk3
add failgroup fg1 disk ‘/dev/raw/raw4’ nameDisk4;
ASM磁盘所对应的物理磁盘
1.查看ASM磁盘名称
2.在操作系统root下:oracleasm querydisk -p ASM磁盘名称 查看对应的物理盘
如:[root@localhost ~]# oracleasm querydisk -p disk2
Disk "DISK2" is a valid ASM disk
/dev/sdc1: LABEL="DISK2" TYPE="oracleasm"
3.parted -l 查看物理磁盘信息