Oracle ASM Disk Creation and Management Guide
Complete Guide to Creating and Managing Disks in ASM
Technical Documentation | Oracle Database Storage Administration
Oracle Automatic Storage Management (ASM) is an integrated, high-performance database file system and disk manager built into Oracle Database. ASM simplifies database storage administration by providing a vertical integration of the file system and volume manager specifically designed for Oracle Database files.
| Component | Description | Purpose |
|---|---|---|
| ASM Disk | Physical disk or disk partition managed by ASM | Basic storage unit |
| Disk Group | Logical collection of ASM disks | Storage pool for database files |
| Failure Group | Set of disks that share a common resource | Redundancy and availability |
| ASM Instance | Special Oracle instance for managing ASM storage | Storage management and metadata |
+ASM)| Redundancy | Mirroring | Min Disks | Usable Space | Use Case |
|---|---|---|---|---|
| External | None (RAID/SAN handles it) | 1 | 100% | Hardware RAID arrays |
| Normal | 2-way mirroring | 2 | 50% | Standard production (recommended) |
| High | 3-way mirroring | 3 | 33% | Mission-critical systems |
# List all block devices
lsblk
# List all SCSI devices
lsscsi
# Check disk details
fdisk -l
# View disk partitions
cat /proc/partitions
# Check for existing ASM disks
ls -l /dev/oracleasm/disks/
# Check disk usage
df -h
Sample Output:
[root@server ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 50G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 49G 0 part /
sdb 8:16 0 100G 0 disk
sdc 8:32 0 100G 0 disk
sdd 8:48 0 100G 0 disk
# Check if disks are already in use
pvdisplay /dev/sdb
pvdisplay /dev/sdc
pvdisplay /dev/sdd
# Expected output for unused disks: "Failed to find physical volume"
# Check for existing partitions
parted /dev/sdb print
parted /dev/sdc print
parted /dev/sdd print
# Interactive partitioning with fdisk
fdisk /dev/sdb
# Commands within fdisk:
# n - Create new partition
# p - Primary partition
# 1 - Partition number
# [Enter] - Accept default first sector
# [Enter] - Accept default last sector (use entire disk)
# w - Write changes and exit
# Repeat for other disks
fdisk /dev/sdc
fdisk /dev/sdd
# Within fdisk, set partition type for ASM
# t - Change partition type
# 1 - Partition number
# 8e - Linux LVM type (or fd for Linux RAID)
# Verify partition table
fdisk -l /dev/sdb
fdisk -l /dev/sdc
fdisk -l /dev/sdd
# Set ownership to grid user (ASM owner)
chown grid:asmadmin /dev/sdb1
chown grid:asmadmin /dev/sdc1
chown grid:asmadmin /dev/sdd1
# Set appropriate permissions
chmod 660 /dev/sdb1
chmod 660 /dev/sdc1
chmod 660 /dev/sdd1
# Verify permissions
ls -l /dev/sd[bcd]1
# Initialize ASMLib (run once)
oracleasm configure -i
# Sample configuration:
# Default user to own the driver interface []: grid
# Default group to own the driver interface []: asmadmin
# Start Oracle ASM library driver on boot (y/n) [n]: y
# Scan for Oracle ASM disks on boot (y/n) [y]: y
# Load ASMLib module
oracleasm init
# Check ASMLib status
oracleasm status
# Create ASM disk for DATA diskgroup
oracleasm createdisk DATA01 /dev/sdb1
# Create ASM disk for DATA diskgroup (additional)
oracleasm createdisk DATA02 /dev/sdc1
# Create ASM disk for FRA diskgroup
oracleasm createdisk FRA01 /dev/sdd1
# List all ASM disks
oracleasm listdisks
# Scan for ASM disks
oracleasm scandisks
# Query disk details
oracleasm querydisk -d DATA01
oracleasm querydisk -d DATA02
oracleasm querydisk -d FRA01
Sample Output:
[root@server ~]# oracleasm listdisks
DATA01
DATA02
FRA01
[root@server ~]# oracleasm querydisk -d DATA01
Disk "DATA01" is a valid ASM disk
# Create UDEV rules file
vi /etc/udev/rules.d/99-oracle-asmdevices.rules
# Add rules for each disk
KERNEL=="sdb1", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sdc1", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sdd1", OWNER="grid", GROUP="asmadmin", MODE="0660"
# Reload UDEV rules
udevadm control --reload-rules
udevadm trigger
# Verify permissions persist after reboot
ls -l /dev/sd[bcd]1
# Connect as grid user
su - grid
# Set ASM_DISKSTRING parameter
sqlplus / as sysasm
SQL> ALTER SYSTEM SET ASM_DISKSTRING = '/dev/oracleasm/disks/*' SCOPE=BOTH;
/dev/oracleasm/disks/*/dev/raw/*/dev/sd*/dev/mapper/*/nfs_mount_point/*# Switch to grid user
su - grid
# Set ASM environment
export ORACLE_SID=+ASM
export ORACLE_HOME=/u01/app/19.0.0/grid
# Connect to ASM instance
sqlplus / as sysasm
# Or use asmcmd
asmcmd
SQL> SELECT name, state, type, total_mb, free_mb
FROM v$asm_diskgroup;
NAME STATE TYPE TOTAL_MB FREE_MB
----------- -------- --------- ----------- ----------
DATA MOUNTED NORMAL 204800 150000
FRA MOUNTED NORMAL 102400 80000
-- Create DATA diskgroup with Normal redundancy
CREATE DISKGROUP data NORMAL REDUNDANCY
FAILGROUP fg1 DISK '/dev/oracleasm/disks/DATA01'
FAILGROUP fg2 DISK '/dev/oracleasm/disks/DATA02'
ATTRIBUTE 'compatible.asm' = '19.0',
'compatible.rdbms' = '19.0',
'au_size' = '4M';
-- Create FRA diskgroup with External redundancy
CREATE DISKGROUP fra EXTERNAL REDUNDANCY
DISK '/dev/oracleasm/disks/FRA01'
ATTRIBUTE 'compatible.asm' = '19.0',
'compatible.rdbms' = '19.0',
'au_size' = '4M';
-- Add disk to DATA diskgroup
ALTER DISKGROUP data ADD DISK '/dev/oracleasm/disks/DATA03';
-- Add disk with specific name
ALTER DISKGROUP data ADD DISK '/dev/oracleasm/disks/DATA04' NAME data_0004;
-- Add disk to specific failure group
ALTER DISKGROUP data ADD FAILGROUP fg3
DISK '/dev/oracleasm/disks/DATA05';
-- Add multiple disks
ALTER DISKGROUP data ADD DISK
'/dev/oracleasm/disks/DATA06',
'/dev/oracleasm/disks/DATA07',
'/dev/oracleasm/disks/DATA08';
-- Check rebalance status
SELECT group_number, operation, state, power, actual, sofar, est_work, est_rate, est_minutes
FROM v$asm_operation;
-- View rebalance progress
SELECT name, total_mb, free_mb,
ROUND((free_mb/total_mb)*100, 2) AS pct_free
FROM v$asm_diskgroup;
-- Monitor using asmcmd
asmcmd rebal
-- Check all ASM disks
SELECT path, name, mount_status, state, total_mb, free_mb
FROM v$asm_disk
ORDER BY path;
-- Check disk allocation
SELECT
d.name AS diskgroup_name,
d.group_number,
d.path,
d.name AS disk_name,
d.mount_status,
d.state,
d.total_mb,
d.free_mb,
ROUND((d.free_mb/d.total_mb)*100, 2) AS pct_free
FROM v$asm_disk d
ORDER BY diskgroup_name, disk_name;
Sample Output:
DISKGROUP_NAME PATH DISK_NAME MOUNT_STATUS STATE TOTAL_MB FREE_MB PCT_FREE
-------------- ---------------------------- --------- ------------ ------ -------- ------- --------
DATA /dev/oracleasm/disks/DATA01 DATA_0001 CACHED NORMAL 102400 75000 73.24
DATA /dev/oracleasm/disks/DATA02 DATA_0002 CACHED NORMAL 102400 75000 73.24
FRA /dev/oracleasm/disks/FRA01 FRA_0001 CACHED NORMAL 102400 80000 78.13
-- Check diskgroup details
SELECT
name,
state,
type,
total_mb,
free_mb,
usable_file_mb,
offline_disks,
voting_files
FROM v$asm_diskgroup;
-- Check diskgroup attributes
SELECT name, value
FROM v$asm_attribute
WHERE name IN ('compatible.asm', 'compatible.rdbms', 'au_size')
ORDER BY name;
-- Using asmcmd
asmcmd lsdg
asmcmd lsdsk
-- Verify ASM instance
SELECT instance_name, status, version
FROM v$instance;
-- Check ASM client connections
SELECT instance_name, db_name, status
FROM v$asm_client;
-- View ASM parameters
SHOW PARAMETER asm_diskstring
SHOW PARAMETER asm_power_limit
# Check ASM process
ps -ef | grep asm_
# Check Oracle processes
ps -ef | grep pmon
# Using asmcmd
asmcmd
ASMCMD> lsdg
ASMCMD> lsdsk -k
ASMCMD> exit
-- Drop disk by name
ALTER DISKGROUP data DROP DISK data_0004;
-- Drop disk and wait for completion
ALTER DISKGROUP data DROP DISK data_0004 WAIT;
-- Drop multiple disks
ALTER DISKGROUP data DROP DISK data_0004, data_0005;
-- Resize disk (if underlying storage expanded)
ALTER DISKGROUP data RESIZE ALL;
-- Resize specific disk
ALTER DISKGROUP data RESIZE DISK data_0001 SIZE 150G;
-- Mount diskgroup
ALTER DISKGROUP data MOUNT;
-- Mount all diskgroups
ALTER DISKGROUP ALL MOUNT;
-- Dismount diskgroup
ALTER DISKGROUP data DISMOUNT;
-- Force dismount
ALTER DISKGROUP data DISMOUNT FORCE;
-- Check diskgroup for inconsistencies
ALTER DISKGROUP data CHECK ALL;
-- Repair diskgroup
ALTER DISKGROUP data CHECK ALL REPAIR;
-- Rebalance with default power
ALTER DISKGROUP data REBALANCE;
-- Rebalance with specific power (1-11, higher = faster)
ALTER DISKGROUP data REBALANCE POWER 8;
-- Rebalance and wait for completion
ALTER DISKGROUP data REBALANCE WAIT;
| Metric | Check Frequency | Alert Threshold |
|---|---|---|
| Diskgroup Space Usage | Daily | > 80% |
| Disk Status | Hourly | Any disk in ERROR state |
| Rebalance Operations | During changes | Stuck or slow progress |
| ASM Instance Status | Continuous | Instance down |
| I/O Performance | Weekly | Degradation > 20% |
| Issue | Cause | Solution |
|---|---|---|
| Disk not discovered | Incorrect ASM_DISKSTRING | Update ASM_DISKSTRING parameter |
| Cannot create disk | Permission issues | Set correct ownership and permissions |
| Rebalance stuck | Insufficient space or I/O issues | Add more disks or check disk health |
| Disk in ERROR state | Hardware failure or path issues | Check hardware, drop and replace disk |
| Diskgroup mount failed | Insufficient disks or corruption | Restore from backup or repair diskgroup |
-- Diskgroup information
SELECT * FROM v$asm_diskgroup;
SELECT * FROM v$asm_disk;
SELECT * FROM v$asm_client;
SELECT * FROM v$asm_operation;
-- Space usage
SELECT name, total_mb, free_mb, usable_file_mb FROM v$asm_diskgroup;
-- Disk details
SELECT path, name, state, total_mb, free_mb FROM v$asm_disk;
-- Rebalance status
SELECT * FROM v$asm_operation WHERE operation = 'REBAL';
-- Using ASMCMD
asmcmd lsdg # List diskgroups
asmcmd lsdsk # List disks
asmcmd lsdsk -k # List disks with discovery path
asmcmd du # Disk usage
asmcmd rebal # Monitor rebalance