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


    转至:https://cloud.tencent.com/developer/article/1494403

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

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

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

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

     而不用

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

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

     这里就不在细说了,今天主要说的是 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,如

     

    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 也可查看到特权用户。

     

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

     

    三、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

     

    lsop 和 lsattr 命令

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

     当然,通过 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 文件:

    mkdg 和 dropdg 命令

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

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

     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 删除磁盘组

    磁盘组的挂载与卸载

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

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

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

    磁盘组重新平衡

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

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

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

     设置磁盘组重新平衡参数为 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

     

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

    SQL 添加磁盘组磁盘

     

     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 删除磁盘组磁盘

     SQL 查看磁盘组使用率

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

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

  • 相关阅读:
    函数-列表生成式
    函数-闭包
    函数-参数
    函数-装饰器
    函数-函数递归
    函数-高阶函数
    函数-命名空间
    函数-匿名函数
    模块-shutil
    在 Android 5.1.1 执行 remount system failed 解决方法
  • 原文地址:https://www.cnblogs.com/my-first-blog-lgz/p/14518454.html
Copyright © 2020-2023  润新知