前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Oracle ASM 磁盘组基础知识整理(收藏版)

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

作者头像
JiekeXu之路
发布2019-08-28 11:00:30
11.3K0
发布2019-08-28 11:00:30
举报
文章被收录于专栏:JiekeXu之路JiekeXu之路

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

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

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

代码语言:javascript
复制
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 里可以简写,不需要全部写完,例如:这么写:

代码语言:javascript
复制
create tablespace test datafile  '+DATA'  size 200M;

而不用

代码语言:javascript
复制
create tablespace test datafile '+DATA/testdb/datafile/test01.dbf' size 200M;

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

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

代码语言:javascript
复制
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,如

代码语言:javascript
复制
ASMCMD> startup --nomount --pfile init.ora

ASM 实例用户

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

代码语言:javascript
复制
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 也可查看到特权用户。

代码语言:javascript
复制
orapwusr --add --privilege sysasm jiekexu
sqlplus jiekexu/jiekexu as sysasm
select * from v$pwfile_users;

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

代码语言:javascript
复制
su - grid 
asmcmd 
orapwusr --modify --password jiekexu
orapwusr --delete jiekexu
lspwusr

三、ASMCMD 命令管理磁盘组

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

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

代码语言:javascript
复制
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 还可以获取 系统中的“候选磁盘”,所谓候选磁盘就是那些可以作为磁盘组中的成员,但是目前还不属于任何磁盘组的磁盘。如果没有则会如上图所示一样只显示了表头。

代码语言:javascript
复制
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 命令可用于修改磁盘组的属性值。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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 文件:

代码语言:javascript
复制
<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 命令的参数,即可创建磁盘组。

代码语言:javascript
复制
ASMCMD > mkdg /u01/app/data.xml

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

代码语言:javascript
复制
ASMCMD >dropdg -r data

ASMCMD >dropdg -r -f data

SQL 创建磁盘组

代码语言:javascript
复制
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 删除磁盘组

代码语言:javascript
复制
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 了,不过对于其他的节点需要手动挂载此磁盘组才行。

代码语言:javascript
复制
alter diskgroup data mount;
alter diakgroup data dismount;
--需要挂载卸载所有磁盘时
ALTER DISKGROUP ALL MOUNT;
ALTER DISKGROUP ALL DISMOUNT;

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

代码语言:javascript
复制
ASMCMD> mount -a
ASMCMD> mount data

ASMCMD> umount -a
ASMCMD> umount data

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

代码语言:javascript
复制
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 来查磁盘进行的平衡操作。

代码语言:javascript
复制
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 语句来进行操作,不过就是有点麻烦,如下所示。

代码语言:javascript
复制
SYS@ ydjttest1>show parameter power
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
asm_power_limit                      integer     1

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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 添加磁盘组磁盘

代码语言:javascript
复制
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 强制添加磁盘组

代码语言:javascript
复制
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 删除磁盘组磁盘

代码语言:javascript
复制
su - grid
sqlplus / as sysasm
alter diskgroup DATA drop disk disk11; ---此处为前面指定的名字或默认生成的名字,并不是磁盘路径
alter diskgroup DATA undrop disk disk11; --取消删除磁盘的操作
alter diskgroup DATA rebalance power 10;

SQL 查看磁盘组使用率

代码语言:javascript
复制
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 查看磁盘组对应磁盘路径

代码语言:javascript
复制
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 查看磁盘组访问情况

代码语言:javascript
复制
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 实例或者数据库实例自动创建。而磁盘组中的文件则是由实例自动产生,他们实际上只是一些“系统别名”,相当于操作系统中的符号链接文件或者快捷方式。下面是一个简单的列举方便查看,更多的信息可自行查看这里不做介绍,本次就到这里了,花费巨大时间希望对你有所帮助。

代码语言:javascript
复制
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/

80%

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JiekeXu之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 注意:'+DATA' 前面的+号不能丢, ASM 文件名字的格式是固定的:+group/dbname/file type/tag.file.incarnation
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档