Oracle的ASM介绍及管理
- Oracle经历过的文件系统历史 
操作系统--逻辑卷管理器(LVM):管理文件相对容易,性能较差
裸设备:管理文件相对困难,性能好
OCFS(Oracle Cluster File System):是ORACLE数据库文件系统
ASM(Automatic Storage Management):ASM是ORACLE数据库文件支持的卷管理,ASM磁盘组里面只能存放Oracle数据库文件:数据文件、联机重做日志文件、控制文件、归档日志、RMAN备份集等
- 何时引入 
ASM是Oracle 10g R2中为了简化Oracle数据库的管理而推出来的一项新功能,这是Oracle自己提供的卷管理器,主要用于替代操作系统所提供的LVM,它不仅支持单 实例,同时对RAC的支持也是非常好。ASM可以自动管理磁盘组并提供有效的数据冗余功能。使用ASM(自动存储管理)后,数据库管理员不再需要对 ORACLE中成千上万的数据文件进行管理和分类,从而简化了DBA的工作量,可以使得工作效率大大提高。
- ASM的体系结构与后台进程 

每个使用了ASM存储的数据库实例也有两个新的进程
1、RBAL:用来打开磁盘组里的磁盘,然后通过DBWn进程将数据写入到这些打开的磁盘里去
2、ASMB:当数据库实例要向某个磁盘组里写入数据时,ASMB会访问Group Services,从中获取有关ASM实例所管理的磁盘组的信息,并通过RBAL进程打开磁盘组,于是就可以将数据写入磁盘组。
Group Services用来注册ASM实例所管理的磁盘组,以及连接磁盘组的信息。
数据库 I/O不通过ASM实例来传输,而是通过RBAL直接根据ASM文件执行I/O操作。
数据库实例只能与其所在的同一台主机上的ASM实例通信,如果当前主机上存在多个数据库,则这些数据库可以共享同一个ASM实例。
ASM实例与数据库实例进行通信的桥梁是ASMB进程,此进程运行在每个数据库实例上,是两个实例间信息交换的通道。ASMB进程先利用磁盘组名称通过CSS获得管理该磁盘组的ASM实例连接串,然后建立一个到ASM的持久连接,这样两个实例之间就可以通过这条连接定期交换信息,同时这也是一种心跳监控机制。
另外,在ASM实例中还存在另外一个新的进程,即RBAL,此进程负责规划和协调磁盘组的重新平衡活动。除此之外,ASM实例还有一些与数据库实例中的进程相同的后台进程,例如LGWR、SMON、PMON、DBWR 、CKPT等。
ASM主要的三个后台进程
1、RBAL:负责协调组内不同磁盘组之间的rebalance工作,reblance工作指的是数据在不同的磁盘之间转移
2、ARBn:用来实际完成rebalance工作,可以由多个进程并发完成rebalance的工作
3、GMON:用来监控磁盘组内有关元数据的维护操作
- ASM优点 
1、ASM是跨平台的,主流的硬件平台都能使用、且管理方式一致;
2、内在的支持大文件,支持BIGFILE文件;
3、数据均匀的分布在磁盘组里所有的磁盘上,实现了文件级别的条带化,减少热点,提高了读取和写入数据的性能
4、提供多重冗余级别,保证数据不丢失;
5、支持在线的磁盘更换,添加或删除磁盘以后,自动重分布数据,这个过程叫做rebalance。
- ASM提供了3种冗余方法 
外部冗余(external redundancy):
表示Oracle不帮你管理镜像,功能由外部存储系统实现,比如通过RAID技术;有效磁盘空间是所有磁盘设备空间的大小之和。
外部冗余时ASM不提供冗余,由存储的机制提供冗余。现在的硬件提供了很多种的冗余,比如RAID。好处在于充分利用现有的磁盘,ASM不再划出其余的空间来做冗余,最大的利用磁盘空间。
常规冗余(normal redundancy):
(默认方式)表示Oracle提供2路镜像来保护数据,会损失一部分磁盘空间用于数据冗余。这是在ASM层面上提供冗余,也就是将ASM磁盘里面的数据再备份一份,和共享存储无关。
高冗余(high redundancy):
Oracle提供3路镜像来保护数据,会损失更多磁盘空间用于数据冗余。
现在都使用底层的自身的存储冗余,比如RAID,在ASM面做冗余太浪费了,所以在ASM上面一般使用外部冗余即可。
- SYSASM权限和OSASM(asmadmin)系统组 
为了使管理更加有针对性,Oracle 11gR2将管理权限进行细化,管理ASM的操作系统组叫做OSASM(asmadmin),凡是属于该组的用户都可以以sysasm的身份登录ASM实例。sysasm权限是管理ASM的最高权限,可以执行所有的ASM实例管理操作;另外还保留了sysdba权限,被赋予该权限的ASM用户只能执行普通的管理操作。SYSASM、SYSDBA是ASM实例用户具有的权限,asmadmin是操作系统组。
[grid@xddb-01 ~]$ id griduid=502(grid) gid=501(oinstall) groups=501(oinstall),502(dba),503(oper),504(asmadmin),505(asmoper),506(asmdba)[grid@xddb-01 ~]$ sqlplus / as sysasm 可直接登陆可创建管理用户并授权SQL> create user check_user identified by check_user;SQL> grant sysasm to check_user;[grid@xddb-01 ~]$ sqlplus check_user/ check_user as sysasmSQL> show userUSER is "SYS"- 管理ASM 
- ASM查看磁盘组状态 
SQL> select group_number,name, state,total_mb,free_mb from v$asm_diskgroup;GROUP_NUMBER NAME                         STATE         TOTAL_MB    FREE_MB------------ ------------------------------ ----------- ---------- ----------          2 DATADG                         MOUNTED           317471     120869          4 GRIDDG                         MOUNTED             6144        5218SQL> select group_number,name,path,failgroup from v$asm_disk;GROUP_NUMBER NAME                         PATH                        FAILGROUP------------ ------------------------------ ------------------------------ ------------------------------          4 GRIDDG_0002                  /dev/mapper/griddg3           GRIDDG_0002          2 DATADG_0000                  /dev/mapper/datadg1           DATADG_0000          4 GRIDDG_0001                  /dev/mapper/griddg2           GRIDDG_0001          4 GRIDDG_0000                  /dev/mapper/griddg1           GRIDDG_0000- 查看磁盘组当前兼容性属性 
SQL> set linesize 200SQL> col name format a20SQL> col compatibility format a30SQL> col DATABASE_COMPATIBILITY format a30SQL> select group_number,name,compatibility,database_compatibility from v$asm_diskgroup where name='DATADG';GROUP_NUMBER NAME                COMPATIBILITY                DATABASE_COMPATIBILITY------------ -------------------- ------------------------------ ------------------------------          2 DATADG                11.2.0.0.0                      10.1.0.0.0SQL> col value format a30SQL> select name,value from v$asm_attribute where group_number=2 and name like 'compatible.%';NAME                   VALUE-------------------- ------------------------------compatible.asm            11.2.0.0.0compatible.rdbms     10.1.0.0.0- 修改磁盘组兼容性属性 
SQL> ALTER DISKGROUP data SET ATTRIBUTE 'compatible.rdbms' = '11.1';
磁盘组的属性只能增大,不能减小,如果增大过程出现错误,那么只能通过重建磁盘组来调整兼容性属性值。
- 快速镜像重新同步功能。 
在一个故障组短暂的磁盘失败期间,ASM记录改变区间的轨迹,以便在磁盘恢复正常后能够快速的同步改变的区间,而不是将整个磁盘的数据重新覆盖一遍,这能够大幅度的提高数据重新同步的过程。
该功能要求磁盘组的兼容性属性必须设置为11.1或者更高。
另外,该功能只对Normal和High冗余级别的磁盘组有用,因为External冗余级别的磁盘脱机会导致写失败。
SQL> CREATE DISKGROUP DATADG NORMAL REDUNDANCY  2  FAILGROUP A disk '/dev/mapper/datadg1' name datadg01  3  FAILGROUP B disk '/dev/mapper/datadg2' name datadg02  4  ATTRIBUTE 'compatible.rdbms'='11.2','compatible.asm'='11.2','compatible.advm'='11.2';SQL> select name,value from v$asm_attribute where name like 'compatible.%' and group_number=(select group_number from v$asm_diskgroup where name='DATADG');磁盘默认的可脱机时间为3.6小时,可以通过修改磁盘组的disk_repair_time属性来调整这个值(H或者h表示小时,M或者m表示分钟):
SQL> col name for a20SQL> col value for a20SQL> select name,value from v$asm_attribute where name='disk_repair_time' and group_number=(select group_number from v$asm_diskgroup where name='DATADG');NAME                   VALUE-------------------- --------------------disk_repair_time     3.6hSQL> alter diskgroup data set attribute 'disk_repair_time'='4.5h';SQL> select name,value from v$asm_attribute where name='disk_repair_time' and group_number=(select group_number from v$asm_diskgroup where name='DATADG');NAME                   VALUE-------------------- --------------------disk_repair_time     4.5h可以使用ALTER DISKGROUP的DROP AFTER子句来覆盖磁盘组的disk_repair_time属性:
SQL> select name,group_number from v$asm_diskgroup where name='DATA';NAME                           GROUP_NUMBER------------------------------ ------------DATADG                                      2SQL> select group_number,name,state from v$asm_disk where group_number=2;GROUP_NUMBER NAME                           STATE------------ ------------------------------ ----------------           2 DATADG02                         NORMAL           2 DATADG01                         NORMALSQL> alter diskgroup datadg offline disk datadg02;SQL> alter diskgroup datadg online disk datadg02;SQL> alter diskgroup datadg offline disk datadg02 drop after 20m;SQL> alter diskgroup datadg online disk datadg02;- AU_SIZE大小设置 
对于磁盘组来说,除了上面讲到了compatible.*和disk_repair_time属性外,还有一个重要的属性au_size。该属性是设置磁盘组的分配单元大小,可配置的范围包括:1、2、4、8、16、32、64MB。ASM文件也是以区间的形式存储在ASM磁盘组中,在10g每个区间直接映射到AU,从11g开始区间能够映射到1个或多个AU。
当磁盘组兼容性属性设置为11.1或者更高,区间大小将自动增长,在11.1的版本,前20000个区间匹配AU大小,接下来的20000个区间匹配8个AU大小,大于40000的区间匹配64个AU大小,在11.2,这个增长比例从1:8:64变成了1:4:16。
执行以下的命令使用CREATE DISKGROUP语句的ATTRIBUTE子句控制AU的大小:
SQL> CREATE DISKGROUP disk_group_2  2    EXTERNAL REDUNDANCY  3    DISK '/dev/mapper/datadg3'  4    ATTRIBUTE 'compatible.rdbms'='11.1','compatible.asm'='11.1','au_size' = '32M';如果au_size设置较大,需要和compatible.rdbms,compatible.asm两个属性一起设置。
可扩展的区间大小和大AU的组合能够增加非常大的数据库的IO性能。
AU_SIZE只能在创建磁盘组的时候设置,之后只能查看不能调整。
- ASMCMD命令及选项 
1、直接使用“asmcmd”或“asmcmd -p”(-p选项可以在命令提示符中给出当前的路径信息)便可连接到对应的ASM。
[grid@xddb-01 ~]$ asmcmd -p
2、ASMCMD [+] > help lsdg
help [command]将显示命令的详细帮助信息
3、使用cp命令在ASM和本地、远程操作系统文件系统之间直接拷贝数据。下面是该命令的用法:
cp [-i][-f][connect_str:]src_file [connect_str:]tgt_file
ASMCMD [+datadg/xddb/archivelog/2020_08_10] > cp thread_2_seq_123620.892.1048113419 /tmp/archive_thread_2_seq_123620.892.1048113419
4、md_backup命令针对一个或更多磁盘组创建元数据拷贝,下面是该命令的用法:
md_backup backup_file [-G diskgroup [,diskgroup,...]]
结果文件包含需要重建ASM磁盘的所有元数据。
ASMCMD [+datadg/xddb] > md_backup /tmp/backup.txt -G datadg
5、md_restore命令允许从使用md_backup命令创建的元数据中还原磁盘组,下面是该命令的用法:
md_restore backup_file [--silent][--full|--nodg|--newdg -o 'old_diskgroup:new_diskgroup [,...]'][-S sql_script_file] [-G 'diskgroup [,diskgroup...]']
ASMCMD [+] > md_restore /tmp/backup.txt --full -G datadg
恢复磁盘组元数据信息磁盘组不能处于MOUNT状态,md_restore命令只恢复元数据信息,但磁盘组的数据是无法恢复的。
6、remap命令修复磁盘一个范围的物理块,不验证每个块的内容,只有读错误的块能被修复,下面是该命令的用法:
remap diskgroup disk block_range
ASMCMD [+] > remap datadg datadg01 1000-2000
7、全部命令参考
- 实例管理命令 
dsget 返回discovery diskstring
dsset 设置discovery diskstring
lsct 显示当前oracle ASM的客户端,一般指数据库实例和ASM实例,数据来源于V$ASM_CLIENT视图
lsop 显示当前磁盘组或ASM实例的操作,数据来源于V$ASM_OPERATION视图
lspwusr 显示ASM密码文件中的用户
orapwusr 增加,删除,修改ASM密码文件用户
shutdown 关闭ASM实例
startup 启动ASM实例
spbackup 备份ASM SPFILE,不影响GPnP profile;备份文件不能识别成SPFILE,不能用spcopy拷贝。为了识别备份文件为SPFILE必须用cp命令
spcopy 拷贝ASM SPFILE,在同一个磁盘组不能拷贝多份。为了更新GPnP profile,则用-u选项或用spset命令
spget 返回ASM SPFILE的位置从GPnP profile
spmove 移动ASM SPFILE,自动更新GPnP profile.当SPFILE被ASM实例打开时不能被移动
spset 设置ASM SPFILE的位置
- 文件管理命令 
cd 切换目录,可使用通配符
cp 在磁盘组之间,磁盘组与操作系统之间拷贝文件。不能在两个远程实例间拷贝。OCR和OCR备份类型的文件不能用cp,要用spbackup,spcopy,spmove
如果是远程拷贝,则连接串样式为:user@host[.port_number].SID。port_number默认为1521
du 显示已经使用的磁盘空间在指定的目录(包括子目录)
find 查找,注意要区分大小写
ls 显示ASM目录下的内容
lsof 显示本地客户端已打开的文件
mkalias 创建一个系统产生的文件的别名。别名和对应的文件必须在同一磁盘组且每个ASM文件只能有一个别名
mkdir 创建ASM目录
pwd 显示当前目录的路径
rm 删除指定的文件或目录,如果是别名,会删除别名和别名对应的文件
rmalias 删除指定的别名
- 磁盘组管理命令 
chdg 修改磁盘组(增加磁盘,删除磁盘,调整磁盘大小,重新平衡磁盘组,基于XML配置文件的)
chkdg 检查或修复磁盘组
dropdg 删除磁盘组
iostat 显示磁盘IO统计,信息来源于V$ASM_DISK_IOSTAT视图
lsattr 显示磁盘组属性,信息来源于V$ASM_ATTRIBUTE视图
lsdg 显示已挂载的磁盘组和他们的信息,与ls -ls输出结果一样,信息来源于V$ASM_DISKGROUP_STAT视图,如果指定了--discovery,则查询V$ASM_DISKGROUP
lsdsk 显示ASM磁盘,信息来源于V$ASM_DISK_STAT视图;连接模式查询V$ASM_DISK_STAT and V$ASM_DISK返回信息;非连接模式通过扫描磁盘头来返回信息
lsod 显示已打开的设备
md_backup 创建已挂载的磁盘组元数据备份
md_restore 恢复磁盘组元数据备份
mkdg 创建磁盘组,基于XML配置文件创建。注意:mkdg创建的磁盘组只挂载在本地节点
mount 挂载磁盘组
offline 使磁盘或失效磁盘组离线
online 使磁盘或失效磁盘组上线
rebal 重新平衡磁盘组
remap 重定位数据在磁盘上的物理块的范围内
setattr 设置磁盘组属性
umount 卸载磁盘组
- 模板管理命令 
chtmpl 修改模板属性
lstmpl 显示模板属性
mktmpl 增加模板到磁盘组
rmtmpl 从磁盘组删除模板
- 文件访问管理命令 
chgrp 修改文件或文件列表的用户组
chmod 修改文件或文件列表的权限
chown 修改文件或文件列表的拥有者
groups 显示用户所属用户组
grpmod 增加或删除操作系统用户到/从已存在的用户组
lsgrp 显示用户组
lsusr 显示磁盘组中的用户
mkgrp 创建一个用户组
mkusr 添加操作系统用户到磁盘组
passwd 修改用户的密码
rmgrp 删除一个用户组
rmusr 删除一个用户