Basics

  • Start ASM - The old way:
1. oraenv     # ora SID = +ASM1 (if second nodes +ASM2 )
2sqlplus / as sysasm
3startup
  • Start ASM - The new method:
1srvctl start asm -n ora-node1-hostname
  • Check ASM volumes
1srvctl status asm
2asmcmd lsdsk
3asmcmd lsdsk -G DATA
4srvctl status diskgroup -g DATA
  • Check clients connected to ASM volume
 1# List clients
 2asmcmd lsct
 3
 4DB_Name  Status     Software_Version  Compatible_version  Instance_Name  Disk_Group
 5+ASM     CONNECTED        19.0.0.0.0          19.0.0.0.0  +ASM           DATA
 6+ASM     CONNECTED        19.0.0.0.0          19.0.0.0.0  +ASM           FRA
 7MANA     CONNECTED        12.2.0.1.0          12.2.0.0.0  MANA           DATA
 8MANA     CONNECTED        12.2.0.1.0          12.2.0.0.0  MANA           FRA
 9MREPORT  CONNECTED        12.2.0.1.0          12.2.0.0.0  MREPORT        DATA
10MREPORT  CONNECTED        12.2.0.1.0          12.2.0.0.0  MREPORT        FRA
11
12# Files Open
13asmcmd lsof
14
15DB_Name  Instance_Name  Path
16MANA     MANA           +DATA/MANA/DATAFILE/blob.268.1045299983
17MANA     MANA           +DATA/MANA/DATAFILE/data.270.1045299981
18MANA     MANA           +DATA/MANA/DATAFILE/indx.269.1045299983
19MANA     MANA           +DATA/MANA/control01.ctl
20MANA     MANA           +DATA/MANA/redo01a.log
21MANA     MANA           +DATA/MANA/redo02a.log
22MANA     MANA           +DATA/MANA/redo03a.log
23MANA     MANA           +DATA/MANA/redo04a.log
24MANA     MANA           +DATA/MANA/sysaux01.dbf
25[...]
  • Connect to ASM prompt
1. oraenv # ora SID = +ASM
2asmcmd

ASMlib

  • ASMlib - provide oracleasm command:
 1# list
 2oracleasm listdisks
 3DATA2
 4FRA1
 5
 6# check
 7oracleasm status
 8Checking if ASM is loaded: yes
 9Checking if /dev/oracleasm is mounted: yes
10
11# check one ASM volume
12oracleasm querydisk -d DATA2
13Disk "DATA2" is a valid ASM disk on device [8,49]
14
15# scan
16oracleasm scandisks
17Reloading disk partitions: done
18Cleaning any stale ASM disks...
19Scanning system for ASM disks...
20Instantiating disk "DATA3"
21
22# Create, delete, rename
23oracleasm createdisk DATA3 /dev/sdf1
24oracleasm deletedisk
25oracleasm renamedisk
  • custom script to list disks handle for ASM (not relevant anymore):
 1cat asmliblist.sh
 2#!/bin/bash
 3for asmlibdisk in `ls /dev/oracleasm/disks/*`
 4  do
 5    echo "ASMLIB disk name: $asmlibdisk"
 6    asmdisk=`kfed read $asmlibdisk | grep dskname | tr -s ' '| cut -f2 -d' '`
 7    echo "ASM disk name: $asmdisk"
 8    majorminor=`ls -l $asmlibdisk | tr -s ' ' | cut -f5,6 -d' '`
 9    device=`ls -l /dev | tr -s ' ' | grep -w "$majorminor" | cut -f10 -d' '`
10    echo "Device path: /dev/$device"
11  done

Disks Group

Disk Group : all disks in teh same DG should have same size. Different type of DG, external means that LUN replication is on storage side. When a disk is added to DG wait for rebalancing before continuing operations.

  • Connect to ASM instance
1# Find your ASM instance
2ps -ef | grep asm_pmon
3oracle   22338     1  0  2019 ?        00:13:57 asm_pmon_+ASM1
4
5su - oracle
6. oraenv +ASM1 
7sqlplus / as sysasm
  • Add/Remove disk to DG
 1-- Take in udev rule the names oracleasm/dataX
 2alter diskgroup DATA add disk '/dev/oracleasm/data3' NAME DATA_0003, '/dev/oracleasm/data4' NAME DATA_0004, '/dev/oracleasm/data5' NAME DATA_0005;
 3
 4-- Follow up the rebalance 
 5select * from v$asm_operation;
 6
 7-- Follow up the rebalance 2
 8set lines 200 pages 2000
 9select count(1) as COUNT from v$asm_operation;
10
11-- Drop disk
12ALTER DISKGROUP FRA DROP DISK FRA_0003 ;
13ALTER DISKGROUP DATA DROP DISK DATA_0002 ;
14
15-- Add several disks
16alter diskgroup FRA add disk '/dev/oracleasm/fra3' NAME FRA_0003, '/dev/oracleasm/fra2' NAME FRA_0002;
  • with GUI use asmca

  • Check DG

1. oraenv +ASM1
2asmcmd lsdg
3
4# Check if a disks was already added to DG in the past
5od -c /dev/sdi | more
  • See all disks:
1set lines 200 pages 2000
2col path for a40
3select group_number, disk_number, name, path from v$asm_disk order by 1,2;
 1GROUP_NUMBER DISK_NUMBER NAME                           PATH
 2------------ ----------- ------------------------------ ----------------------------------------
 3           1           0 DATA_0000                      /dev/oracleasm/data1
 4           1           1 DATA_0001                      /dev/oracleasm/data2
 5           1           2 DATA_0003                      /dev/oracleasm/data3
 6           1           3 DATA_0004                      /dev/oracleasm/data4
 7           1           4 DATA_0005                      /dev/oracleasm/data5
 8           1           5 DATA_0006                      /dev/oracleasm/data6
 9           1           6 DATA_0007                      /dev/oracleasm/data7
10           1           7 DATA_0008                      /dev/oracleasm/data8
11           1           8 DATA_0009                      /dev/oracleasm/data9
12           1           9 DATA_0010                      /dev/oracleasm/data10
13           1          10 DATA_0011                      /dev/oracleasm/data11
14           2           0 FRA_0000                       /dev/oracleasm/fra1
  • Check the spaces usage on Disks:
1set lines 200 pages 2000
2col path for a60
3select d.group_number, d.disk_number, g.name, d.name, d.header_status, d.mount_status, d.total_mb/1024 total_gb, d.free_mb/1024 free_gb, d.path
4from v$asm_disk d, v$asm_diskgroup g
5where d.group_number = g.group_number
6order by 1,2
7/
 1GROUP_NUMBER DISK_NUMBER NAME    NAME        HEADER_STATU MOUNT_S   TOTAL_GB    FREE_GB PATH
 2------------ ----------- -------------------------------- ------- ---------- ---------- ----------------------
 3           1           0 DATA    DATA_0000   MEMBER       CACHED  19.9960938    19.3125 /dev/oracleasm/data1
 4           1           1 DATA    DATA_0001   FORMER       CACHED  19.9960938   19.34375 /dev/oracleasm/data2
 5           1           2 DATA    DATA_0003   MEMBER       CACHED  19.9960938 19.3476563 /dev/oracleasm/data3
 6           1           3 DATA    DATA_0004   MEMBER       CACHED  19.9960938   19.34375 /dev/oracleasm/data4
 7           1           4 DATA    DATA_0005   MEMBER       CACHED  19.9960938   19.34375 /dev/oracleasm/data5
 8           1           5 DATA    DATA_0006   MEMBER       CACHED  19.9960938 19.3476563 /dev/oracleasm/data6
 9           1           6 DATA    DATA_0007   MEMBER       CACHED  19.9960938 19.3515625 /dev/oracleasm/data7
10           1           7 DATA    DATA_0008   MEMBER       CACHED  19.9960938 19.3554688 /dev/oracleasm/data8
11           1           8 DATA    DATA_0009   MEMBER       CACHED  19.9960938 19.3515625 /dev/oracleasm/data9
12           1           9 DATA    DATA_0010   MEMBER       CACHED  19.9960938   19.34375 /dev/oracleasm/data10
13           1          10 DATA    DATA_0011   MEMBER       CACHED  19.9960938   19.34375 /dev/oracleasm/data11
14           2           0 FRA     FRA_0000    MEMBER       CACHED  19.9960938 13.8984375 /dev/oracleasm/fra1
  • Check general space on ASM volume:
1SET LINES 350
2COL NAME FORMAT A30
3SELECT NAME, TYPE, ROUND(TOTAL_MB/1024) TOTAL_GB,ROUND(FREE_MB/1024) "FREE_GB" FROM V$ASM_DISKGROUP
4/
1NAME                           TYPE     TOTAL_GB    FREE_GB
2------------------------------ ------ ---------- ----------
3DATA                           EXTERN        220        213
4FRA                            EXTERN         20         14
  • Check the content of ASM:
 1col gname form a10
 2col dbname form a10
 3col file_type form a14
 4SELECT
 5    gname,
 6    dbname,
 7    file_type,
 8    round(SUM(space)/1024/1024) mb,
 9    round(SUM(space)/1024/1024/1024) gb,
10    COUNT(*) "#FILES"
11FROM
12    (
13        SELECT
14            gname,
15            regexp_substr(full_alias_path, '[[:alnum:]_]*',1,4) dbname,
16            file_type,
17            space,
18            aname,
19            system_created,
20            alias_directory
21        FROM
22            (
23                SELECT
24                    concat('+'||gname, sys_connect_by_path(aname, '/')) full_alias_path,
25                    system_created,
26                    alias_directory,
27                    file_type,
28                    space,
29                    level,
30                    gname,
31                    aname
32                FROM
33                    (
34                        SELECT
35                            b.name            gname,
36                            a.parent_index    pindex,
37                            a.name            aname,
38                            a.reference_index rindex ,
39                            a.system_created,
40                            a.alias_directory,
41                            c.type file_type,
42                            c.space
43                        FROM
44                            v$asm_alias a,
45                            v$asm_diskgroup b,
46                            v$asm_file c
47                        WHERE
48                            a.group_number = b.group_number
49                        AND a.group_number = c.group_number(+)
50                        AND a.file_number = c.file_number(+)
51                        AND a.file_incarnation = c.incarnation(+) ) START WITH (mod(pindex, power(2, 24))) = 0
52                AND rindex IN
53                    (
54                        SELECT
55                            a.reference_index
56                        FROM
57                            v$asm_alias a,
58                            v$asm_diskgroup b
59                        WHERE
60                            a.group_number = b.group_number
61                        AND (
62                                mod(a.parent_index, power(2, 24))) = 0
63                            and a.name like '&&db_name'
64                    ) CONNECT BY prior rindex = pindex )
65        WHERE
66            NOT file_type IS NULL
67            and system_created = 'Y' )
68WHERE
69    dbname like '&db_name'
70GROUP BY
71    gname,
72    dbname,
73    file_type
74ORDER BY
75    gname,
76    dbname,
77    file_type
78/
 1GNAME      DBNAME     FILE_TYPE              MB         GB     #FILES
 2---------- ---------- -------------- ---------- ---------- ----------
 3DATA       HCBS       CONTROLFILE            32          0          1
 4DATA       HCBS       DATAFILE           290692        284         22
 5DATA       HCBS       ONLINELOG           24640         24          8
 6DATA       HCBS       PARAMETERFILE           4          0          1
 7DATA       HCBS       PASSWORD                0          0          1
 8DATA       HCBS       TEMPFILE             6996          7          2
 9FRA        HCBS       AUTOBACKUP           7252          7        259
10FRA        HCBS       CONTROLFILE            32          0          1
11FRA        HCBS       ONLINELOG            1632          2          8

Udev rules

In Linux disks name can change after reboot depending the order and numbers of disks. Udev rules allow to give a nickname to a WWID.

  • Standard case:
 1#Get the disk's UUID 
 2/lib/udev/scsi_id -g -u /dev/sdh
 336000d310004142000000000000000f21
 4
 5# Config udev rules
 6vi /etc/udev/rules.d/99-oracleasm.rules
 7KERNEL==โ€sd?1โ€ณ, ENV{ID_SERIAL}==โ€36005076380838362ac00000000000017โ€ณ, SYMLINK+=โ€oracleasm/data1โ€ณ, OWNER=โ€oracleโ€, GROUP=โ€oinstallโ€, MODE=โ€0660โ€ณ
 8
 9# Reload
10/sbin/udevadm control --reload-rules
11/sbin/udevadm trigger
  • Multipath case:
1# Blacklist ASM inside /etc/multipath.conf following https://access.redhat.com/solutions/29537
2
3blacklist {
4       wwid "*"
5       devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
6       devnode "ofsctl"
7       devnode "^asm/*"
8}
 1# Get multipath aliases:
 2dmsetup ls --target multipath
 3
 4orafraemc1      (249:7)
 5oralogemc1      (249:8)
 6oradataemc2     (249:9)
 7oradataemc1     (249:10)
 8
 9udevadm info --query=all --name=/dev/mapper/orafraemc1
10
11udevadm info --query=all --name=/dev/mapper/orafraemc1 | grep DM_UUID
12E: DM_UUID=mpath-36006016053674d003493045f3896897f
13
14
15# With the Alias
16ENV{DM_NAME}=="orafraemc1", OWNER:="oracle", GROUP:="oinstall", MODE:="660"
17ENV{DM_NAME}=="oralogemc1", OWNER:="oracle", GROUP:="oinstall", MODE:="660"
18ENV{DM_NAME}=="oradataemc1", OWNER:="oracle", GROUP:="oinstall", MODE:="660"
19
20# Second way 
21ACTION=="add|change", ENV{DM_NAME}=="orafraemc1", OWNER="grid", GROUP="asmadmin", MODE="0660"
22
23# With the UUID : 
24ACTION=="add|change", ENV{DM_UUID}=="mpath-[DM_UUID]", SYMLINK+="udev-asmdisk1", GROUP="oinstall", OWNER="grid", MODE="0660"
25
26# Reload udev rules
27/sbin/udevadm control โ€“reload-rules
28/sbin/udevadm trigger
  • Check with ls -l on the udev path will show on what it point:
 1# Wrong config:
 2ll /dev/oracleasm/disks/*
 3lrwxrwxrwx 1 root root 9 Jan  6 10:15 /dev/oracleasm/disks/DATAEMC1 -> ../../sdu
 4lrwxrwxrwx 1 root root 9 Jan  6 10:15 /dev/oracleasm/disks/DATAEMC2 -> ../../sdt
 5lrwxrwxrwx 1 root root 9 Jan  6 10:15 /dev/oracleasm/disks/FRAEMC1 -> ../../sdn
 6lrwxrwxrwx 1 root root 9 Jan  6 10:15 /dev/oracleasm/disks/LOGEMC1 -> ../../sdr
 7
 8#Good Config: 
 9lrwxrwxrwx 1 root root 11 Mar 11 19:19 /dev/oracleasm/disks/NEWORADATA1 -> ../../dm-16
10lrwxrwxrwx 1 root root 11 Mar 11 19:19 /dev/oracleasm/disks/NEWORADATA2 -> ../../dm-17

AFD Disk Label

The Oracle ASMFD simplifies the configuration and management of disk devices by eliminating the need to rebind disk devices used with Oracle ASM each time the system is restarted.

The Oracle ASM Filter Driver rejects any I/O requests that are invalid. This action eliminates accidental overwrites of Oracle ASM disks that would cause corruption in the disks and files within the disk group. For example, the Oracle ASM Filter Driver filters out all non-Oracle I/Os which could cause accidental overwrites.

  • Check if ASMlib is enable:
1su - oracle
2asmcmd afd_state
3ASMCMD-9526: The AFD state is 'LOADED' and filtering is 'ENABLED' on host 'host'
  • Checks labels on OS:
1lsblk -o name,mountpoint,label,size,uuid
2
3ls -l /dev/disk/by-label
4lrwxrwxrwx. 1 root root 10 Sep 22 17:53 RAC1 -> ../../sdh1
5lrwxrwxrwx. 1 root root 10 Sep 22 17:53 \x05 -> ../../sdi1
  • List AFD label:
 1# Check one disk
 2asmcmd afd_lslbl /dev/sdq1
 3--------------------------------------------------------------------------------
 4Label                     Duplicate  Path
 5================================================================================
 6RAC2                                  /dev/sdq1
 7
 8# Check all
 9asmcmd afd_lsdsk
10--------------------------------------------------------------------------------
11Label                     Filtering   Path
12================================================================================
13RAC2                        ENABLED   /dev/sdq1
  • Label a disk:
1$ORACLE_HOME/bin/asmcmd afd_label 'RAC2' '/dev/sdv1'
  • Add a disk to AFD:
1alter diskgroup data add disk 'AFD:DATA2';
  • Remove a disk:
1$ORACLE_HOME/bin/asmcmd afd_unlabel 'RAC1'
2$ORACLE_HOME/bin/asmcmd afd_unlabel '/dev/sdv1'
  • ASM config:
1# List AFD 
2su - oracle
3. oraenv  #+ASM1
4$ORACLE_HOME/bin/asmcmd dsget
5parameter:AFD:*, /dev/oracleasm/*
6profile:AFD:*,/dev/oracleasm/*
7
8# Change it
9asmcmd dsset 'AFD:*'