
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:
| Status | Description |
| CANDIDATE | New disk ready to use |
| PROVISIONED | Disk provisioned via ASMLib |
| MEMBER | Disk already part of a diskgroup |
| FORMER | Previously used disk; currently not part of any diskgroup |
Step 1: Verify New Disk Visibility
- Login to all RAC nodes and confirm the LUNs are visible at the OS level:
# Example for Node1
ls -ltr /dev/oracleasm/disks/
- Check udev/ASMLib rules:
cat /etc/udev/rules.d/99-asm.rules | grep ASM_ORADATA_022
- Verify disk permissions and ownership:
ls -l /dev/oracleasm/disks/ASM_ORADATA_022
# Output should show: brw-rw—- 1 oracle dba …
- 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.
- Create a temporary ASM diskgroup:
CREATE DISKGROUP TESTDISK EXTERNAL REDUNDANCY DISK ‘/dev/oracleasm/disks/ASM_ORADATA_022’;
- 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’;
- Test tablespace creation:
CREATE TABLESPACE TEST_TS DATAFILE ‘TESTDISK’ SIZE 2G;
DROP TABLESPACE TEST_TS;
- Drop the dummy diskgroup:
DROP DISKGROUP TESTDISK;
- 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
- Add disk and start rebalance:
ALTER DISKGROUP ORADATA02 ADD DISK ‘/dev/oracleasm/disks/ASM_ORADATA_022’ REBALANCE POWER 7;
- Monitor rebalance operation:
SELECT * FROM v$asm_operation;
⚠️ The rebalance may take time depending on disk size and ASM workload.
- 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 Change | Meaning |
| CANDIDATE → FORMER | Disk tested in dummy diskgroup |
| FORMER → MEMBER | Disk added to production diskgroup |