Adding a New ASM Disk to an Existing Diskgroup

Procedure: Adding a New ASM Disk to an Existing Diskgroup

Environment Scope:

  • Oracle RAC environments
  • Standalone servers with Oracle ASM-managed storage
  • Linux servers using ASMLib or udev for disk management

Prerequisites:

  • Approved maintenance window
  • Storage team has provisioned new LUNs
  • LUNs visible on all RAC nodes
  • udev/ASMLib configured
  • GRID/ASM privileges

ASM Disk Header Status Reference:

StatusDescription
CANDIDATENew disk ready to use
PROVISIONEDDisk provisioned via ASMLib
MEMBERDisk already part of a diskgroup
FORMERPreviously used disk; currently not part of any diskgroup

Step 1: Verify New Disk Visibility

  1. Login to all RAC nodes and confirm the LUNs are visible at the OS level:

# Example for Node1

ls -ltr /dev/oracleasm/disks/

  1. Check udev/ASMLib rules:

cat /etc/udev/rules.d/99-asm.rules | grep ASM_ORADATA_022

  1. Verify disk permissions and ownership:

ls -l /dev/oracleasm/disks/ASM_ORADATA_022

# Output should show: brw-rw—- 1 oracle dba …

  1. Check ASM disk header status in SQL:

col name for a20

col header_status for a15

col path for a45

SELECT GROUP_NUMBER, name, header_status, path, state, mode_status, total_mb, free_mb 

FROM v$asm_disk 

WHERE path=’/dev/oracleasm/disks/ASM_ORADATA_022′;

Expected Header Status: CANDIDATE

At this point, disk is ready to be added.


Step 2: Test Disk Health Using a Dummy Diskgroup

Purpose: Ensure the disk is healthy before adding to production diskgroup.

  1. Create a temporary ASM diskgroup:

CREATE DISKGROUP TESTDISK EXTERNAL REDUNDANCY DISK ‘/dev/oracleasm/disks/ASM_ORADATA_022’;

  1. Verify diskgroup status and usage:

SELECT GROUP_NUMBER, NAME, TYPE, STATE, TOTAL_MB/1024 “TOTAL GB”, FREE_MB/1024 “FREE GB”, 

       ROUND(((TOTAL_MB – FREE_MB)/TOTAL_MB)*100,2) “%Used”, ROUND((FREE_MB/TOTAL_MB)*100,2) “%Free”

FROM v$asm_diskgroup 

WHERE NAME=’TESTDISK’;

  1. Test tablespace creation:

CREATE TABLESPACE TEST_TS DATAFILE ‘TESTDISK’ SIZE 2G;

DROP TABLESPACE TEST_TS;

  1. Drop the dummy diskgroup:

DROP DISKGROUP TESTDISK;

  1. Verify disk header status:

SELECT name, header_status FROM v$asm_disk WHERE path=’/dev/oracleasm/disks/ASM_ORADATA_022′;

# Status should now show FORMER

Disk has passed health check and is ready for production.


Step 3: Add Disk to Actual Diskgroup

  1. Add disk and start rebalance:

ALTER DISKGROUP ORADATA02 ADD DISK ‘/dev/oracleasm/disks/ASM_ORADATA_022’ REBALANCE POWER 7;

  1. Monitor rebalance operation:

SELECT * FROM v$asm_operation;

⚠️ The rebalance may take time depending on disk size and ASM workload.

  1. Verify disk addition:

SELECT GROUP_NUMBER, NAME, HEADER_STATUS, PATH, STATE, MODE_STATUS, TOTAL_MB, FREE_MB 

FROM v$asm_disk 

WHERE path=’/dev/oracleasm/disks/ASM_ORADATA_022′;

# Status should show MEMBER


Step 4: Post-Addition Validation

  • Check ASM diskgroup free space and usage:

SELECT NAME, TOTAL_MB/1024 “TOTAL GB”, FREE_MB/1024 “FREE GB”

FROM v$asm_diskgroup

WHERE NAME=’ORADATA02′;

  • Check rebalance completion:

SELECT * FROM v$asm_operation;

  • Confirm all nodes see the new disk using asmcmd or V$ASM_DISK.

Notes & Best Practices

  • Always verify disk health with a dummy diskgroup before adding to production.
  • Use REBALANCE POWER to control impact on running database workloads.
  • Ensure udev/ASMLib rules are consistent across all nodes.
  • Track disk header status changes in V$ASM_DISK:
Status ChangeMeaning
CANDIDATE → FORMERDisk tested in dummy diskgroup
FORMER → MEMBERDisk added to production diskgroup
Categories ASM

Leave a Comment