查看原文
其他

Oracle ASM 磁盘组基础知识整理(收藏版)

JiekeXu之路 JiekeXu DBA之路 2024-03-03


为什么要写这么一篇基础知识呢?还是有那么一点点原因的,不是胡编乱造还真是有真实存在的事件的,前两周里因一套生产环境数据库磁盘不足无法对其进行表空间扩容,需要向存储岗申请存储资源,当存储岗划好资源加完存储时,操作系统岗对其进行扫盘以及权限处理时忘记对 RAC2 节点的磁盘进行属主的设置。


当到我们数据库岗对其磁盘组添加磁盘时,我们的小伙伴没有对其权限及属主进行检查,直接使用 alter diskgroup XXX add disk ‘XXX’添加磁盘,当然此命名是没有任何问题的,添加成功,进行重新平衡。便兴高采烈的下班了,但随后而来的悲剧便上演了,由于节点2权限不对新添加的磁盘 ASM 实例无法访问,导致数据库宕机。使其业务系统不能正常访问导致事故发生。


添加磁盘组磁盘,应使用类似如下的操作命令,可谁想尽没有检查权限导致悲剧发生。所以本次才对 ASM 磁盘组的基础操作命令做了一个整理及简化操作,希望对正在阅读中的你有所帮助。

root:chown grid:asmadmin /dev/rhdisk10chmod 660 /dev/rhdisk10ls -la /dev/rhdisk10su - gridsqlplus / as sysasmalter diskgroup DATA add disk '/dev/rhdisk10','/dev/rhdisk11';alter diskgroup DATA rebalance power 10;

ASM:Automatic Storage Management(自动存储管理)。 ASM 是 Oracle 内置的逻辑卷管理器,它进一步简化了数据库管理工作,是 Oracle 墙裂推荐使用的存储管理机制。先说一嘴 OMF,Oracle 11g 的一个新的特点就是文件和存储的自动管理,简称为 OMF,这么说吧,就是在 11g 单实例的数据库你创建一个数据文件需要写全路径,而在 ASM 里可以简写,不需要全部写完,例如:这么写:

create tablespace test datafile '+DATA' size 200M;

而不用

create tablespace test datafile '+DATA/testdb/datafile/test01.dbf' size 200M;

注意:'+DATA' 前面的+号不能丢, ASM 文件名字的格式是固定的:+group/dbname/file type/tag.file.incarnation

但这个功能需要以下初始化参数指定:

db_recovery_file_destdb_create_file_destdb_create_online_log_dest_n

这里就不在细说了,今天主要说的是 ASM 磁盘组命令行的相关操作。



ASM 命令行工具 ASMCMD


当安装完 grid 的时候,可使用命令行 asmca 来创建磁盘组,如下图:



那也可以使用图形化来管理磁盘组了,不过出现这个图形化不是很方便,各种申请,故放弃,对于 DBA 来说,使用命令行是很方便的,那么就从 ASM 实例说起吧。


一、ASM 实例的启动与关闭


ASMCMD 工具是一个强大的管理工具,可以对实例、磁盘组、文件进行管理。可以有交互式和非交互式的两种方式,非交互式的直接就是 asmcmd 加一条 asmcmd 内部的命令,如 asmcmd lsdg;交互式的即先输入asmcmd 进入命令提示符界面后在执行 lsdg。


启动实例没啥说的,和数据库实例是一样的,直接 startup 就行,关闭也就是 shutdown;那么 ASM 实例也是后台进程加 SGA 内存组成,除了数据库实例所具有的进程外,还有 RBAL 和 ABRn; RBAL 这个进程也叫 Rebalancer 进程,负责规划 ASM 磁盘组的 Rebalance 活动;ABRn 是 RBAL 进程的子进程,这个进程在数量上可以有多个, n 从 1-9,这组进程负责真正完成 Reblance 活动。


ASM 随着 SGA 的分配和后台进程的启动而启动,从 nomount 启动到最终的 mount 状态。期间,也是需要参数文件的,也是可以启动到 nomount,如

ASMCMD> startup --nomount --pfile init.ora



ASM 实例用户


在 ASM 实例创建时,默认会创建两个特权用户:SYS 和 ASMSNMP,类似数据库里的 SYS 和 SYSTEM 账号。我们可以通过命令行命令 lspwusr 查看 ASM 实例中的特权用户,也可以通过 orapwusr 命令创建、删除、修改特权用户,而特权用户的口令文件则放在 ASM 实例的口令文件中。

SYS@ ydjttest2>select USERNAME,ACCOUNT_STATUS, EXPIRY_DATE from dba_users where username in('SYS','DBSNMP');USERNAME ACCOUNT_STATUS EXPIRY_DA------------------------------ -------------------------------- ---------SYS OPEN 24-FEB-19DBSNMP                         EXPIRED & LOCKED                 13-AUG-09[grid@JiekeXu1 ~]$ asmcmdASMCMD>ASMCMD> lspwusrUsername sysdba sysoper sysasm SYS TRUE TRUE TRUEASMSNMP TRUE FALSE FALSEASMCMD>

下面通过命令行创建特权用户 jiekexu, 密码同名具有 SYSASM 权限,也可登录 ASM 实例,通过动态性能视图 V$PWFILE_USERS 也可查看到特权用户。

orapwusr --add --privilege sysasm jiekexusqlplus jiekexu/jiekexu as sysasmselect * from v$pwfile_users;


二、命令行修改和删除特权用户


su - grid asmcmd orapwusr --modify --password jiekexuorapwusr --delete jiekexulspwusr



三、ASMCMD 命令管理磁盘组


ASMCMD 工具命令行中的 lsdg 可以查看磁盘组的详细信息,如状态、冗余级别、是否正在进行重新平衡、总大小、剩余空间等。这个命令的信息则是来自动态性能视图 V$ASM_DISKGROUP 的,如下所示:



当然,我们一般都是使用如下语句查看磁盘组使用率,发现了吧,上面的语句多简单那!!!

set lin 1000 pagesize 999col NAME for a15SYS@ ydjttest1>select group_number,name,total_mb/1024 total_gb,free_mb/1024 free_gb,TYPE from v$asm_diskgroup;GROUP_NUMBER NAME TOTAL_GB FREE_GB TYPE------------ --------------- ---------- ---------- ------ 1 DATA 9.33007813 5.52929688 NORMAL 2 FRA 7.4609375 4.484375 NORMAL 3 OCR_VOTE 2.82421875 1.91992188 NORMAL


lsdsk 命令


lsdsk 可查看磁盘组中的磁盘或者系统中可用的磁盘。这个命令也有 -k、-p、-t、--statistics 等几个参数可以获得不同的信息,选项 -k 可以看到总大小以及剩余大小,磁盘名以及磁盘对应操作系统路径等。 选项 -p 可以看到磁盘组序号,磁盘状态以及磁盘冗余度和路径等等信息。选项 -t 则是查看磁盘创建时间以及挂载时间和路径等信息。选项 --statistics 则是查看磁盘组中读写 IO 信息,包括在每个磁盘上的读和写的次数、所用时间和数据量以及磁盘路径等信息。而这些信息主要来自于动态性能视图 V$ASM_DISK 和 V$ASM_DISK_STAT。部分举例如下图所示。




lsdsk --candidate -p 还可以获取 系统中的“候选磁盘”,所谓候选磁盘就是那些可以作为磁盘组中的成员,但是目前还不属于任何磁盘组的磁盘。如果没有则会如上图所示一样只显示了表头。

ASMCMD> lsdsk --candidate -pGroup_Num Disk_Num Mount_Stat Header_Stat Mode_Stat State Path0 1 CLOSED FORMER ONLINE NORMAL /dev/rhdisk40 0 CLOSED FORMER ONLINE NORMAL /dev/rhdisk5


lsop 和 lsattr 命令


lsop 用于查看磁盘组中被打开的磁盘。可用此命令查看数据库后台有哪些进程访问磁盘组中的磁盘。 lsattr 命令可用于查看磁盘组的属性信息,这些属性是在磁盘组创建时自动指定的,而且有些属性是可以修改的。setattr 命令可用于修改磁盘组的属性值。

ASMCMD> lsop -G data --process LGWRGroup_Name Dsk_Num State Power ASMCMD>ASMCMD> lsop -G dataGroup_Name Dsk_Num State Power ASMCMD>ASMCMD> lsattr -l -G dataName Value access_control.enabled FALSE access_control.umask 066 au_size 1048576 cell.smart_scan_capable FALSE compatible.asm 11.2.0.0.0 compatible.rdbms 10.1.0.0.0 disk_repair_time 3.6h sector_size 512 ASMCMD> setattr -G data compatible.rdbms 11.2.0.0.0ASMCMD> lsattr -l -G dataName Value access_control.enabled FALSE access_control.umask 066 au_size 1048576 cell.smart_scan_capable FALSE compatible.asm 11.2.0.0.0 compatible.rdbms 11.2.0.0.0 disk_repair_time 3.6h sector_size 512

当然,通过 SQL 命令也可以修改这些参数,如下所示修改 compatible.rdbms 参数,Oracle 11g 中,asm 同时支持 10g 和 11g 数据库。但是 asm 的版本不能低于数据库的版本。该属性用来指定 disk group 最小能够兼容的数据库实例,在修改这个参数之前,必须先确保所有的数据库实例的 COMPATIBLE 参数大于等于该参数的值。在 Oracle 11g 数据库中,Oracle ASM disk group 的 COMPATIBLE.RDBMS 属性值默认是: 10.1。

SYS@ +ASM2>col value for a30SYS@ +ASM2>col name for a30SYS@ +ASM2>set lin 120SYS@ +ASM2>select name,value from v$asm_attribute where group_number=1 and name like 'compatible%';NAME VALUE------------------------------ ------------------------------compatible.asm 11.2.0.0.0compatible.rdbms 11.2.0.0.0SYS@ +ASM2>ALTER DISKGROUP DATA SET ATTRIBUTE 'compatible.rdbms' = '11.2.0.0.0';Diskgroup altered.SYS@ +ASM2>


四、磁盘组的创建与删除


利用 asmcmd 工具中的 mkdg 命令,可以创建 ASM 磁盘组,而磁盘组的结构是通过一个 XML 文件来指定,在这个文件中需要指定磁盘组的名称、冗余级别、包含磁盘及相关属性。ORACLE ASM 提供的三种冗余方式有 external、normal、high 即外部、正常、高。一般情况下三种模式需要的磁盘组:external 1块,normal,3块,high,5块。


1、 外部冗余(external redundancy):表示 Oracle 不帮你管理镜像,功能由外部存储系统实现,比如通过 RAID 技术;有效磁盘空间是所有磁盘设备空间的大小之和。


2、 默认冗余(normal redundancy):表示 Oracle 提供 2 份镜像来保护数据(镜像数据一次),有效磁盘空间是所有磁盘设备大小之和的 1/2 (使用最多)。


3、 高度冗余(high redundancy):表示 Oracle 提供3份镜像来保护数据(镜像数据两次),以提高性能和数据的安全,最少需要三块磁盘(三个 failure group);有效磁盘空间是所有磁盘设备大小之和的 1/3,虽然冗余级别高了,但是硬件的代价也最高。


如下的 XML 文件:

<dg name="data" redundancy="external"><dsk string="/dev/hdisk3"/><dsk string="/dev/hdisk4"/><a name="compatible.asm" value="11.2"/><a name="compatible.rdbms" value="11.2"/><a name="compatible.advm" value="11.2"/></dg>


mkdg 和 dropdg 命令


在创建磁盘组之前,首先需要在操作系统中创建一个 XML 文件,定义磁盘组的结构,然后在 ASMCMD 工具中将这个 XML 文件作为 mkdg 命令的参数,即可创建磁盘组。

ASMCMD > mkdg /u01/app/data.xml

通过 dropdg 命令可以删除一个磁盘组。如磁盘组总包含文件,磁盘组是不能被直接删除的,需要添加参数 -r 删除,当磁盘组出现故障无法挂载时需要强制删除,则需要添加参数 -f 强制删除。

ASMCMD >dropdg -r data
ASMCMD >dropdg -r -f data


SQL 创建磁盘组

su - gridsqlplus / as sysasmcreate diskgroup data normal redunancy failgroup DA1 disk '/dev/rhdisk2','/dev/rhdisk3' failgroup DA2 disk '/dev/rhdisk4','/dev/rhdisk5';

SQL 删除磁盘组

su - gridsqlplus / as sysasmalter drop diskgroup data dismount;drop diskgroup data;drop diskgroup data including contents;


磁盘组的挂载与卸载


Oracle 11g RAC 一般数据文件都是存放于共享盘之上,要访问数据文件磁盘组必须得 mount ;当 ASM 实例启动后磁盘组自动被挂载, ASM 实例关闭后自动卸载。当在任意节点上新建的磁盘组时默认已经 mount 了,不过对于其他的节点需要手动挂载此磁盘组才行。

alter diskgroup data mount;alter diakgroup data dismount;--需要挂载卸载所有磁盘时ALTER DISKGROUP ALL MOUNT;ALTER DISKGROUP ALL DISMOUNT;

而在命令行下对于磁盘组的挂载需要在每个节点上进行,挂载磁盘组的命令是 mount,卸载则是 umount.

ASMCMD> mount -aASMCMD> mount data
ASMCMD> umount -aASMCMD> umount data

在不影响整个磁盘组的情况下,可以通过 offline 命令使其中的一个磁盘脱机,这时这个磁盘中的数据将无法访问,此命令会立即生效,如想延后生效可通过 -t 参数指定一段时间,以小时(h)或分钟(m)为单位使其在指定的时间段里脱机。当然相反的则是 online 重新联机。

ASMCMD> offline -G data -D data_0001 -t 6h ASMCMD> online -G data -aASMCMD> online -G data -D data_0001


磁盘组重新平衡


当磁盘组中的磁盘数量发生变化时,磁盘组就会出现一次重新平衡,平衡的参数由 asm_power_limit 控制,一般默认为 1 ;最大为 11 最小为 0,共有 12 级,当为 0 时表示停止平衡,当为 11 时表示最快平衡速度,当然参数越大消耗资源越多。


在命令行下通过 rebal 对其进行重新平衡,通过 --power 来指定平衡级别,当使用 -w 参数时等待平衡完成才会返回结果,当不使用 -w 时则可以使用 lsop 来查磁盘进行的平衡操作。

ASMCMD> rebal --power 6 data -wASMCMD> lsopGroup_Name Dsk_Num State Power ASMCMD> rebal --power 4 dataASMCMD> lsopGroup_Name Dsk_Num State Power DATA REBAL WAIT 4

当然可可以通过 SQL 语句来进行操作,不过就是有点麻烦,如下所示。

SYS@ ydjttest1>show parameter powerNAME TYPE VALUE------------------------------------ ----------- ------------------------------asm_power_limit integer 1

设置磁盘组重新平衡参数为 11,查看平衡时间,当 v$asm_operation 视图无任何输出则表示平衡完成。

su - grid sqlplus / as sysasm alter diskgroup data rebalance power 11;select * from v$asm_operation;SYS@ +ASM1>alter diskgroup data rebalance power 11;Diskgroup altered.SYS@ +ASM1>select * from v$asm_operation;GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES ERROR_CODE------------ ----- ---- ---------- ---------- ---------- ---------- ---------- ----------- -------------------------------------------- 2 REBAL RUN 11 11 4 16 990 0SYS@ +ASM1>select * from v$asm_operation;GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES ERROR_CODE------------ ----- ---- ---------- ---------- ---------- ---------- ---------- ----------- -------------------------------------------- 2 REBAL WAIT 11SYS@ +ASM1>/no rows selected


五、磁盘组的读写信息


磁盘组中的数据是均衡分布在各个磁盘上的,但用户对于数据的访问却不一定是均衡分布在各个磁盘上的。通过 iostat 命令可以查看磁盘组中各个磁盘 IO 情况,便可以掌握数据库的基础性能,也可以对数据库调优提供依据。通过这条命令可以获取磁盘上的读和写的次数、数据量、所用时间、发生错误次数等信息。


iostat -G data

iostat -t -G data

iostat -e -G data

iostat --io -G data

ASMCMD> iostat -G dataGroup_Name Dsk_Name Reads Writes DATA DATA1 11420595712 2816842240 DATA DATA2 3462283776 2816842240 ASMCMD> iostat -t -G dataGroup_Name Dsk_Name Reads Writes Read_Time Write_Time DATA DATA1 11421136384 2816944640 9042.907064 5224.873 DATA DATA2 3462382080 2816944640 3240.906 5950.302256 ASMCMD>ASMCMD> iostat -e -G dataGroup_Name Dsk_Name Reads Writes Read_Err Write_Err DATA DATA1 11421775360 2817051136 0 0 DATA DATA2 3462480384 2817051136 0 0 ASMCMD>ASMCMD> iostat --io -G dataGroup_Name Dsk_Name Reads Writes DATA DATA1 682740 229155 DATA DATA2 197993 229155 ASMCMD>



以下是几个使用频率较高的 SQL:


SQL 添加磁盘组磁盘


root:chown grid:asmadmin /dev/rhdisk10chmod 660 /dev/rhdisk10su - gridsqlplus / as sysasmalter diskgroup DATA add disk '/dev/rhdisk10','/dev/rhdisk11';alter diskgroup DATA rebalance power 10;
可指定名字--alter diskgroup DATA add disk '/dev/rhdisk10' NAME disk10,'/dev/rhdisk11' NAME disk11;


SQL 强制添加磁盘组


su - gridsqlplus / as sysasmcreate diskgroup ARCH external redundancy disk '/dev/asm2' force;col name for a20set line 200select group_number,name,state,total_mb/1024 total_gb,free_mb/1024 free_gb,type from v$asm_diskgroup;



SQL 删除磁盘组磁盘


su - gridsqlplus / as sysasmalter diskgroup DATA drop disk disk11; ---此处为前面指定的名字或默认生成的名字,并不是磁盘路径alter diskgroup DATA undrop disk disk11; --取消删除磁盘的操作alter diskgroup DATA rebalance power 10;


SQL 查看磁盘组使用率

su - oraclesqlplus / as sysdbaselect name,state,type,total_mb,free_mb from v$asm_diskgroup;SYS@ ydjttest2>select name,state,type,total_mb,free_mb from v$asm_diskgroup;NAME STATE TYPE TOTAL_MB FREE_MB------------------------------ ----------- ------ ---------- ----------OCR_VOTE MOUNTED NORMAL 2892 1966DATA CONNECTED NORMAL 9554 5594FRA CONNECTED NORMAL 7640 3532

SQL 查看磁盘组对应磁盘路径


su - oraclesqlplus / as sysdbacol path for a30select group_number,path,state,total_mb,free_mb from v$asm_disk;
SYS@ ydjttest2>col path for a30SYS@ ydjttest2>select group_number,path,state,total_mb,free_mb from v$asm_disk;GROUP_NUMBER PATH STATE TOTAL_MB FREE_MB------------ ------------------------------ -------- ---------- ---------- 2 ORCL:DATA1 NORMAL 4777 2797 2 ORCL:DATA2 NORMAL 4777 2797 3 ORCL:FRA1 NORMAL 3820 1766 3 ORCL:FRA2 NORMAL 3820 1766 1 ORCL:OCR_VOTE1 NORMAL 964 655 1 ORCL:OCR_VOTE2 NORMAL 964 655 1 ORCL:OCR_VOTE3 NORMAL 964 6567 rows selected.

SQL 查看磁盘组访问情况


su - oraclesqlplus / as sysdbaselect group_number,instance_name,db_name,status from v$asm_client;
SYS@ ydjttest1>select group_number,instance_name,db_name,status from v$asm_client;
GROUP_NUMBER INSTANCE_NAME DB_NAME STATUS------------ ---------------------------------------------------------------- -------- ------------ 2 +ASM1 ydjt_tes CONNECTED 3 +ASM1 ydjt_tes CONNECTED
SYS@ ydjttest2>select group_number,instance_name,db_name,status from v$asm_client;
GROUP_NUMBER INSTANCE_NAME DB_NAME STATUS------------ ---------------------------------------------------------------- -------- ------------ 2 +ASM2 ydjt_tes CONNECTED 3 +ASM2 ydjt_tes CONNECTED


六、磁盘组中的目录管理


ASM 里面有一整套完整的目录层次,此目录由 ASM 实例或者数据库实例自动创建。而磁盘组中的文件则是由实例自动产生,他们实际上只是一些“系统别名”,相当于操作系统中的符号链接文件或者快捷方式。下面是一个简单的列举方便查看,更多的信息可自行查看这里不做介绍,本次就到这里了,花费巨大时间希望对你有所帮助。

ASMCMD> lsDATA/FRA/OCR_VOTE/ASMCMD> cd OCR_VOTE/ASMCMD> lsJiekeXu-cluster/ASMCMD> cd JiekeXu-cluster/ASMCMD> lsASMPARAMETERFILE/OCRFILE/ASMCMD> cd OCRFILE ASMCMD> lsREGISTRY.255.985299565ASMCMD> cd ../ASMPARAMETERFILEASMCMD> lsREGISTRY.253.985299561ASMCMD> cd ../../../DATAASMCMD> lsYDJT_TEST/ASMCMD> cd YDJT_TEST/ASMCMD> lsCONTROLFILE/DATAFILE/ONLINELOG/PARAMETERFILE/TEMPFILE/spfileydjt_test.oraASMCMD> cd PARAMETERFILE/
80%


推荐阅读:

Linux Oracle 11.2.0.4 单机数据库升级至最新补丁安装指北

万字详解Oracle架构、原理、进程,学会世间再无复杂架构

模拟真实环境下超简单超详细的 MySQL 5.7 安装

Oracle 11GR2 RAC 最新补丁 190416 安装指导

Oracle 11gR2 RAC 集群服务启动与关闭总结

CentOS6.7安装PostgreSQL10.9详细教程

Oracle RAC11gR2 ADG搭建实施与应用

史上最全的 OGG 基础知识整理


长按添加微信公众号,更多精彩内容不错过!

码字不易,点赞、转发是一种对作者的鼓励!  

继续滑动看下一个

Oracle ASM 磁盘组基础知识整理(收藏版)

JiekeXu之路 JiekeXu DBA之路
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存