Oracle ASM 磁盘组基础知识整理(收藏版)
为什么要写这么一篇基础知识呢?还是有那么一点点原因的,不是胡编乱造还真是有真实存在的事件的,前两周里因一套生产环境数据库磁盘不足无法对其进行表空间扩容,需要向存储岗申请存储资源,当存储岗划好资源加完存储时,操作系统岗对其进行扫盘以及权限处理时忘记对 RAC2 节点的磁盘进行属主的设置。
当到我们数据库岗对其磁盘组添加磁盘时,我们的小伙伴没有对其权限及属主进行检查,直接使用 alter diskgroup XXX add disk ‘XXX’添加磁盘,当然此命名是没有任何问题的,添加成功,进行重新平衡。便兴高采烈的下班了,但随后而来的悲剧便上演了,由于节点2权限不对新添加的磁盘 ASM 实例无法访问,导致数据库宕机。使其业务系统不能正常访问导致事故发生。
添加磁盘组磁盘,应使用类似如下的操作命令,可谁想尽没有检查权限导致悲剧发生。所以本次才对 ASM 磁盘组的基础操作命令做了一个整理及简化操作,希望对正在阅读中的你有所帮助。
root:
chown grid:asmadmin /dev/rhdisk10
chmod 660 /dev/rhdisk10
ls -la /dev/rhdisk10
su - grid
sqlplus / as sysasm
alter 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_dest
db_create_file_dest
db_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-19
DBSNMP EXPIRED & LOCKED 13-AUG-09
[grid@JiekeXu1 ~]$ asmcmd
ASMCMD>
ASMCMD> lspwusr
Username sysdba sysoper sysasm
SYS TRUE TRUE TRUE
ASMSNMP TRUE FALSE FALSE
ASMCMD>
下面通过命令行创建特权用户 jiekexu, 密码同名具有 SYSASM 权限,也可登录 ASM 实例,通过动态性能视图 V$PWFILE_USERS 也可查看到特权用户。
orapwusr --add --privilege sysasm jiekexu
sqlplus jiekexu/jiekexu as sysasm
select * from v$pwfile_users;
二、命令行修改和删除特权用户
su - grid
asmcmd
orapwusr --modify --password jiekexu
orapwusr --delete jiekexu
lspwusr
三、ASMCMD 命令管理磁盘组
ASMCMD 工具命令行中的 lsdg 可以查看磁盘组的详细信息,如状态、冗余级别、是否正在进行重新平衡、总大小、剩余空间等。这个命令的信息则是来自动态性能视图 V$ASM_DISKGROUP 的,如下所示:
当然,我们一般都是使用如下语句查看磁盘组使用率,发现了吧,上面的语句多简单那!!!
set lin 1000 pagesize 999
col NAME for a15
SYS@ 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 -p
Group_Num Disk_Num Mount_Stat Header_Stat Mode_Stat State Path
0 1 CLOSED FORMER ONLINE NORMAL /dev/rhdisk4
0 0 CLOSED FORMER ONLINE NORMAL /dev/rhdisk5
lsop 和 lsattr 命令
lsop 用于查看磁盘组中被打开的磁盘。可用此命令查看数据库后台有哪些进程访问磁盘组中的磁盘。 lsattr 命令可用于查看磁盘组的属性信息,这些属性是在磁盘组创建时自动指定的,而且有些属性是可以修改的。setattr 命令可用于修改磁盘组的属性值。
ASMCMD> lsop -G data --process LGWR
Group_Name Dsk_Num State Power
ASMCMD>
ASMCMD> lsop -G data
Group_Name Dsk_Num State Power
ASMCMD>
ASMCMD> lsattr -l -G data
Name 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.0
ASMCMD> lsattr -l -G data
Name 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 a30
SYS@ +ASM2>col name for a30
SYS@ +ASM2>set lin 120
SYS@ +ASM2>select name,value from v$asm_attribute where group_number=1 and name like 'compatible%';
NAME VALUE
------------------------------ ------------------------------
compatible.asm 11.2.0.0.0
compatible.rdbms 11.2.0.0.0
SYS@ +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 - grid
sqlplus / as sysasm
create diskgroup data normal redunancy failgroup DA1 disk '/dev/rhdisk2','/dev/rhdisk3' failgroup DA2 disk '/dev/rhdisk4','/dev/rhdisk5';
SQL 删除磁盘组
su - grid
sqlplus / as sysasm
alter 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 -a
ASMCMD> mount data
ASMCMD> umount -a
ASMCMD> umount data
在不影响整个磁盘组的情况下,可以通过 offline 命令使其中的一个磁盘脱机,这时这个磁盘中的数据将无法访问,此命令会立即生效,如想延后生效可通过 -t 参数指定一段时间,以小时(h)或分钟(m)为单位使其在指定的时间段里脱机。当然相反的则是 online 重新联机。
ASMCMD> offline -G data -D data_0001 -t 6h
ASMCMD> online -G data -a
ASMCMD> 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 -w
ASMCMD> lsop
Group_Name Dsk_Num State Power
ASMCMD> rebal --power 4 data
ASMCMD> lsop
Group_Name Dsk_Num State Power
DATA REBAL WAIT 4
当然可可以通过 SQL 语句来进行操作,不过就是有点麻烦,如下所示。
SYS@ ydjttest1>show parameter power
NAME 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 0
SYS@ +ASM1>select * from v$asm_operation;
GROUP_NUMBER OPERA STAT POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES ERROR_CODE
------------ ----- ---- ---------- ---------- ---------- ---------- ---------- ----------- --------------------------------------------
2 REBAL WAIT 11
SYS@ +ASM1>/
no rows selected
五、磁盘组的读写信息
磁盘组中的数据是均衡分布在各个磁盘上的,但用户对于数据的访问却不一定是均衡分布在各个磁盘上的。通过 iostat 命令可以查看磁盘组中各个磁盘 IO 情况,便可以掌握数据库的基础性能,也可以对数据库调优提供依据。通过这条命令可以获取磁盘上的读和写的次数、数据量、所用时间、发生错误次数等信息。
iostat -G data
iostat -t -G data
iostat -e -G data
iostat --io -G data
ASMCMD> iostat -G data
Group_Name Dsk_Name Reads Writes
DATA DATA1 11420595712 2816842240
DATA DATA2 3462283776 2816842240
ASMCMD> iostat -t -G data
Group_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 data
Group_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 data
Group_Name Dsk_Name Reads Writes
DATA DATA1 682740 229155
DATA DATA2 197993 229155
ASMCMD>
以下是几个使用频率较高的 SQL:
SQL 添加磁盘组磁盘
root:
chown grid:asmadmin /dev/rhdisk10
chmod 660 /dev/rhdisk10
su - grid
sqlplus / as sysasm
alter 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 - grid
sqlplus / as sysasm
create diskgroup ARCH external redundancy disk '/dev/asm2' force;
col name for a20
set line 200
select group_number,name,state,total_mb/1024 total_gb,free_mb/1024 free_gb,type from v$asm_diskgroup;
SQL 删除磁盘组磁盘
su - grid
sqlplus / as sysasm
alter diskgroup DATA drop disk disk11; ---此处为前面指定的名字或默认生成的名字,并不是磁盘路径
alter diskgroup DATA undrop disk disk11; --取消删除磁盘的操作
alter diskgroup DATA rebalance power 10;
SQL 查看磁盘组使用率
su - oracle
sqlplus / as sysdba
select 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 1966
DATA CONNECTED NORMAL 9554 5594
FRA CONNECTED NORMAL 7640 3532
SQL 查看磁盘组对应磁盘路径
su - oracle
sqlplus / as sysdba
col path for a30
select group_number,path,state,total_mb,free_mb from v$asm_disk;
SYS@ ydjttest2>col path for a30
SYS@ 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 656
7 rows selected.
SQL 查看磁盘组访问情况
su - oracle
sqlplus / as sysdba
select 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> ls
DATA/
FRA/
OCR_VOTE/
ASMCMD> cd OCR_VOTE/
ASMCMD> ls
JiekeXu-cluster/
ASMCMD> cd JiekeXu-cluster/
ASMCMD> ls
ASMPARAMETERFILE/
OCRFILE/
ASMCMD> cd OCRFILE
ASMCMD> ls
REGISTRY.255.985299565
ASMCMD> cd ../ASMPARAMETERFILE
ASMCMD> ls
REGISTRY.253.985299561
ASMCMD> cd ../../../DATA
ASMCMD> ls
YDJT_TEST/
ASMCMD> cd YDJT_TEST/
ASMCMD> ls
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
spfileydjt_test.ora
ASMCMD> cd PARAMETERFILE/
推荐阅读:
Linux Oracle 11.2.0.4 单机数据库升级至最新补丁安装指北
万字详解Oracle架构、原理、进程,学会世间再无复杂架构
Oracle 11GR2 RAC 最新补丁 190416 安装指导
Oracle 11gR2 RAC 集群服务启动与关闭总结
CentOS6.7安装PostgreSQL10.9详细教程
Oracle RAC11gR2 ADG搭建实施与应用
史上最全的 OGG 基础知识整理
(长按添加微信公众号,更多精彩内容不错过!)
码字不易,点赞、转发是一种对作者的鼓励!