Skip to content

V$ASM_DISK - Monitor ASM Disk Status, I/O & Errors

V$ASM_DISK displays one row for every disk discovered by the ASM instance, regardless of whether the disk is currently a member of a diskgroup. DBAs query it to verify disk health, review cumulative I/O throughput, detect read and write errors, and confirm that expected disks are visible to the ASM instance. It is the first view to check when a diskgroup fails to mount, when ORA-15042 (ASM disk missing) is raised, or when disk-level I/O imbalance is suspected.

The view is available from the ASM instance itself and also from a database instance if the ASM_DISKGROUPS parameter is set and the instance is connected to an ASM instance. In RAC environments, each node’s ASM instance exposes its own discovery results, so cross-node comparisons require querying all instances.

View Type: Dynamic Performance View (ASM instance) Available Since: Oracle 10g Release 1 Required Privileges: SELECT on V_$ASM_DISK or SYSASM role or SELECT_CATALOG_ROLE

ColumnDatatypeDescription
GROUP_NUMBERNUMBERDiskgroup number this disk belongs to; 0 means the disk is not a member of any diskgroup
DISK_NUMBERNUMBERDisk number within the diskgroup; unique per group
NAMEVARCHAR2(30)ASM disk name (e.g., DATA_0000); blank if not assigned to a diskgroup
PATHVARCHAR2(256)OS path or device name used to access the disk (e.g., /dev/sdb, AFD:DATA_0000)
STATEVARCHAR2(11)Disk state: NORMAL, ADDING, FAILING, DROPPING, HUNG, CLEANING, UNCHECKED, or UNKNOWN
TOTAL_MBNUMBERTotal size of the disk in megabytes
FREE_MBNUMBERFree space remaining on the disk in megabytes
OS_MBNUMBERDisk size as reported by the OS, which may differ from TOTAL_MB due to ASM metadata overhead
READSNUMBERCumulative number of read I/O operations on this disk since ASM instance startup
WRITESNUMBERCumulative number of write I/O operations on this disk since ASM instance startup
READ_ERRSNUMBERCumulative number of read errors; any non-zero value warrants investigation
WRITE_ERRSNUMBERCumulative number of write errors; any non-zero value warrants investigation
READ_TIMENUMBERCumulative time in seconds spent on read I/O
WRITE_TIMENUMBERCumulative time in seconds spent on write I/O
BYTES_READNUMBERTotal bytes read from this disk since startup
BYTES_WRITTENNUMBERTotal bytes written to this disk since startup
HEADER_STATUSVARCHAR2(12)Disk header status: MEMBER, CANDIDATE, INCOMPATIBLE, PROVISIONED, FOREIGN, UNKNOWN
MODE_STATUSVARCHAR2(8)Mount mode: ONLINE or OFFLINE
REDUNDANCYVARCHAR2(12)Redundancy contribution: FULL, MIRROR, HIGH, PARITY, or UNKNOWN
MOUNT_STATUSVARCHAR2(9)Whether the disk is CACHED, OPEN, CLOSED, or MISSING

List all ASM disks with their diskgroup membership, size, and current state:

SELECT
d.group_number,
d.disk_number,
d.name AS disk_name,
d.path,
d.state,
d.mode_status,
d.header_status,
d.mount_status,
ROUND(d.total_mb / 1024, 2) AS total_gb,
ROUND(d.free_mb / 1024, 2) AS free_gb,
ROUND((d.total_mb - d.free_mb) / 1024, 2) AS used_gb,
ROUND((1 - d.free_mb / NULLIF(d.total_mb, 0)) * 100, 1) AS pct_used
FROM
v$asm_disk d
ORDER BY
d.group_number,
d.disk_number;

Find any ASM disk with read or write errors — the first query to run when investigating storage alerts:

SELECT
d.group_number,
d.disk_number,
d.name AS disk_name,
d.path,
d.state,
d.mode_status,
d.read_errs,
d.write_errs,
d.reads,
d.writes,
ROUND(d.read_errs / NULLIF(d.reads, 0) * 100, 4) AS read_err_pct,
ROUND(d.write_errs / NULLIF(d.writes, 0) * 100, 4) AS write_err_pct
FROM
v$asm_disk d
WHERE
d.read_errs > 0
OR d.write_errs > 0
OR d.state NOT IN ('NORMAL', 'UNCHECKED')
ORDER BY
d.write_errs DESC,
d.read_errs DESC;

Compare read and write throughput across all disks in a diskgroup to detect I/O imbalance, which can indicate a misconfigured failure group or a failing disk being avoided:

SELECT
d.group_number,
g.name AS diskgroup_name,
d.disk_number,
d.name AS disk_name,
d.path,
d.reads,
d.writes,
ROUND(d.bytes_read / 1024 / 1024 / 1024, 2) AS gb_read,
ROUND(d.bytes_written / 1024 / 1024 / 1024, 2) AS gb_written,
ROUND(d.read_time, 2) AS read_secs,
ROUND(d.write_time, 2) AS write_secs,
ROUND(d.read_time / NULLIF(d.reads, 0) * 1000, 3) AS avg_read_ms,
ROUND(d.write_time / NULLIF(d.writes, 0) * 1000, 3) AS avg_write_ms
FROM
v$asm_disk d
JOIN v$asm_diskgroup g ON g.group_number = d.group_number
WHERE
d.group_number > 0
ORDER BY
g.name,
d.disk_number;

Find disks that are offline, in a failed state, or not yet assigned to a diskgroup — important during disk replacement workflows:

SELECT
d.group_number,
d.disk_number,
d.name AS disk_name,
d.path,
d.state,
d.mode_status,
d.header_status,
d.mount_status,
ROUND(d.total_mb / 1024, 2) AS total_gb,
d.read_errs,
d.write_errs
FROM
v$asm_disk d
WHERE
d.mode_status = 'OFFLINE'
OR d.group_number = 0
OR d.state NOT IN ('NORMAL', 'UNCHECKED')
ORDER BY
d.state,
d.group_number,
d.disk_number;

Aggregate disk-level space metrics to cross-check against V$ASM_DISKGROUP totals:

SELECT
d.group_number,
g.name AS diskgroup_name,
COUNT(*) AS disk_count,
ROUND(SUM(d.total_mb) / 1024, 2) AS raw_total_gb,
ROUND(SUM(d.free_mb) / 1024, 2) AS raw_free_gb,
ROUND(SUM(d.reads)) AS total_reads,
ROUND(SUM(d.writes)) AS total_writes,
SUM(d.read_errs) AS total_read_errs,
SUM(d.write_errs) AS total_write_errs,
MIN(d.state) AS min_state,
MAX(d.state) AS max_state
FROM
v$asm_disk d
JOIN v$asm_diskgroup g ON g.group_number = d.group_number
WHERE
d.group_number > 0
GROUP BY
d.group_number,
g.name
ORDER BY
g.name;
  • Diagnosing ORA-15042 (ASM disk missing) — Query WHERE mode_status = ‘OFFLINE’ or state = ‘MISSING’ to identify which disk is absent and which diskgroup is affected before attempting DROP DISK or ONLINE DISK
  • Storage hardware failure triage — Filter on read_errs > 0 OR write_errs > 0 as the first step when the OS or SAN reports storage errors; correlate disk PATH with the OS device name to identify the failing LUN
  • I/O imbalance detection — Compare avg_read_ms and avg_write_ms across disks in the same diskgroup; a disk with significantly higher latency may be failing or undersized relative to peers
  • Pre-rebalance validation — Before adding or dropping disks, confirm all existing disks are NORMAL and ONLINE to avoid rebalance operations compounding an existing fault
  • Candidate disk discovery — Disks with GROUP_NUMBER = 0 and HEADER_STATUS = CANDIDATE are visible to ASM but not yet in a diskgroup; use this to confirm new storage is correctly provisioned before running ADD DISK
  • Capacity planning — Aggregate FREE_MB and TOTAL_MB per diskgroup to validate that free space stays above the REQUIRED_MIRROR_FREE_MB threshold reported in V$ASM_DISKGROUP
  • V$ASM_DISKGROUP — Diskgroup-level space, redundancy type, and rebalance status; always check alongside V$ASM_DISK for a full storage picture
  • V$ASM_FILE — Individual files stored in ASM; join via GROUP_NUMBER to map files to their physical disks
  • V$ASM_OPERATION — Shows active rebalance and rebuild operations; query when a disk state is ADDING or DROPPING to monitor progress
  • V$ASM_CLIENT — Lists database instances connected to the ASM instance; join on GROUP_NUMBER to see which databases depend on a diskgroup
  • V$ASM_DISK_STAT — Identical columns to V$ASM_DISK but does not perform a discovery scan, making it faster for frequent polling at the cost of potentially stale path information
  • Oracle 10g R1: View introduced alongside ASM; core columns GROUP_NUMBER through WRITE_ERRS available
  • Oracle 10g R2: BYTES_READ and BYTES_WRITTEN columns added for throughput monitoring
  • Oracle 11g R2: Oracle Flex ASM capability added; MOUNT_STATUS column expanded to reflect cached disk states in Flex ASM
  • Oracle 12c: CON_ID column added; in a CDB, ASM views accessed from the CDB root include all PDB-owned diskgroups
  • Oracle 18c / 19c: AFD (ASM Filter Driver) paths (AFD:diskname) appear in the PATH column when AFD is configured; REDUNDANCY column reflects parity redundancy for FLEX diskgroups
  • Oracle 21c / 23ai: No structural changes; Extended Distance Clustering configurations may show additional MOUNT_STATUS states for stretched diskgroups