{"id":5755,"date":"2026-07-15T00:50:30","date_gmt":"2026-07-14T19:20:30","guid":{"rendered":"https:\/\/w3buddy.com\/?p=5755"},"modified":"2026-07-19T22:17:14","modified_gmt":"2026-07-19T16:47:14","slug":"oracle-asm-administration","status":"publish","type":"post","link":"https:\/\/w3buddy.com\/blog\/oracle-asm-administration\/","title":{"rendered":"Oracle ASM Administration"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A complete production-ready SOP for Oracle Automatic Storage Management (ASM) administration on Linux. Covers ASM concepts, instance management, diskgroup operations, disk addition and removal, rebalance operations, ASMCMD usage, and full validation checks \u2014 with real commands, expected outputs, and consultant-level notes for both standard OFA and enterprise custom path conventions.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">1. Document Info<\/h3>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Item<\/th><th>Detail<\/th><\/tr><\/thead><tbody><tr><td>Oracle Version<\/td><td>19c (Grid Infrastructure 19.3+)<\/td><\/tr><tr><td>OS<\/td><td>Oracle Linux 7.x \/ RHEL 7.x or 8.x<\/td><\/tr><tr><td>ASM Type<\/td><td>Standalone (Non-RAC)<\/td><\/tr><tr><td>Grid Home<\/td><td>\/u01\/app\/19.3.0\/grid (Convention A)<\/td><\/tr><tr><td>Grid Home<\/td><td>\/oracle\/GRID\/19.31 (Convention B)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 1187723.1 (ASM Administration Guide)<\/td><\/tr><tr><td>MOS Reference<\/td><td>Doc ID 265633.1 (ASM Disk Discovery)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">2. ASM Concepts \u2014 Read Before Anything Else<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is ASM?<\/strong> ASM (Automatic Storage Management) is Oracle&#8217;s own volume manager and filesystem built specifically for Oracle database files. Instead of using OS-level filesystems (ext4, xfs) or third-party volume managers (LVM), Oracle manages the raw disks itself through ASM. It provides striping, mirroring, and automatic rebalancing without needing an OS volume manager.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why do companies use ASM?<\/strong> ASM gives better I\/O performance than OS filesystems for Oracle workloads, provides built-in redundancy (mirroring), automatically rebalances data across disks when disks are added or removed, and is the required storage for Oracle RAC.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">Key ASM Terms You Must Know<\/h4>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Term<\/th><th>What It Means<\/th><\/tr><\/thead><tbody><tr><td>ASM Instance<\/td><td>A special Oracle instance (not a database) that manages ASM storage. It runs alongside the database instance. Has its own SGA and background processes.<\/td><\/tr><tr><td>Diskgroup<\/td><td>A logical group of physical disks managed by ASM. Think of it like a volume group in LVM. Example: +DATA, +FRA, +REDO<\/td><\/tr><tr><td>ASM Disk<\/td><td>A raw disk or partition that has been added to a diskgroup. ASM labels these disks with a header.<\/td><\/tr><tr><td>Redundancy<\/td><td>How ASM mirrors data. EXTERNAL = no mirroring (relies on storage array). NORMAL = 2-way mirror. HIGH = 3-way mirror.<\/td><\/tr><tr><td>Rebalance<\/td><td>When disks are added or removed, ASM automatically redistributes data evenly across all disks. This is called rebalancing.<\/td><\/tr><tr><td>Allocation Unit (AU)<\/td><td>The smallest unit of storage ASM allocates. Default is 1MB. Can be set to 4MB, 8MB, 16MB, 32MB, 64MB during diskgroup creation.<\/td><\/tr><tr><td>ASMCMD<\/td><td>ASM Command Line utility \u2014 like a shell for navigating ASM diskgroups. Similar to Unix shell commands (ls, cd, mkdir, cp).<\/td><\/tr><tr><td>ASM Filter Driver (ASMFD)<\/td><td>A kernel driver that protects ASM disks from accidental writes by non-ASM processes. Recommended in 19c.<\/td><\/tr><tr><td>GRID_HOME<\/td><td>Separate Oracle Home where Grid Infrastructure (which includes ASM) is installed. Different from ORACLE_HOME.<\/td><\/tr><tr><td>+DATA<\/td><td>Conventional name for the diskgroup that holds database datafiles.<\/td><\/tr><tr><td>+FRA<\/td><td>Conventional name for the Fast Recovery Area diskgroup (archivelogs, RMAN backups, flashback logs).<\/td><\/tr><tr><td>+REDO<\/td><td>Conventional name for the diskgroup that holds online redo logs (some companies separate redo for performance).<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">3. Path Conventions for ASM \/ Grid<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Important:<\/strong> ASM is part of Oracle Grid Infrastructure. Grid Infrastructure has its OWN separate Oracle Home (GRID_HOME) \u2014 completely separate from the database ORACLE_HOME. You must switch between them carefully.<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Item<\/th><th>Convention A<\/th><th>Convention B<\/th><\/tr><\/thead><tbody><tr><td>Grid Home<\/td><td>\/u01\/app\/19.3.0\/grid<\/td><td>\/oracle\/GRID\/19.31<\/td><\/tr><tr><td>Oracle Base<\/td><td>\/u01\/app\/oracle<\/td><td>\/oracle<\/td><\/tr><tr><td>DB Oracle Home<\/td><td>\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1<\/td><td>\/oracle\/RDBMS\/19.31<\/td><\/tr><tr><td>ASM SID<\/td><td>+ASM<\/td><td>+ASM<\/td><\/tr><tr><td>ASM Data diskgroup<\/td><td>+DATA<\/td><td>+DATA<\/td><\/tr><tr><td>ASM FRA diskgroup<\/td><td>+FRA<\/td><td>+FRA<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">How to Switch Between Grid Home and DB Home<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Many ASM commands must be run from GRID_HOME, not ORACLE_HOME. If you run ASM commands from the wrong home, you get incorrect results or errors. Always check which home you are in before running ASM commands.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>su - oracle\n\n# Check which home is currently active\necho $ORACLE_HOME\n\n# Switch to GRID HOME\nexport ORACLE_HOME=\/u01\/app\/19.3.0\/grid          # Convention A\n# export ORACLE_HOME=\/oracle\/GRID\/19.31           # Convention B\nexport PATH=$ORACLE_HOME\/bin:$PATH\nexport ORACLE_SID=+ASM\n\n# Verify you are now in Grid Home\necho $ORACLE_HOME\necho $ORACLE_SID\n\n# Switch back to DB Home\nexport ORACLE_HOME=\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1   # Convention A\n# export ORACLE_HOME=\/oracle\/RDBMS\/19.31                       # Convention B\nexport PATH=$ORACLE_HOME\/bin:$PATH\nexport ORACLE_SID=ORCL<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Tip:<\/strong> Create two aliases in <code>~\/.bash_profile<\/code> to switch quickly:<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>alias asmenv='export ORACLE_HOME=\/u01\/app\/19.3.0\/grid; export ORACLE_SID=+ASM; export PATH=$ORACLE_HOME\/bin:$PATH; echo \"Switched to ASM\/Grid Home\"'\nalias dbenv='export ORACLE_HOME=\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1; export ORACLE_SID=ORCL; export PATH=$ORACLE_HOME\/bin:$PATH; echo \"Switched to DB Home\"'<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">4. Pre-Activity Checks<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Always run these checks before performing any ASM administration activity \u2014 whether adding disks, dropping disks, creating diskgroups, or any other operation.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.1 \u2014 Check ASM Instance is Running<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> All ASM operations require the ASM instance to be up. If it is down, database cannot access its datafiles and ASM commands will fail.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Switch to Grid Home\nexport ORACLE_HOME=\/u01\/app\/19.3.0\/grid\nexport ORACLE_SID=+ASM\nexport PATH=$ORACLE_HOME\/bin:$PATH\n\n# Check ASM instance process is running\nps -ef | grep asm_pmon | grep -v grep<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>oracle   12345     1  0 10:00 ?  00:00:00 asm_pmon_+ASM<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> If <code>asm_pmon_+ASM<\/code> is not in the process list, the ASM instance is down. Start it before proceeding (see Section 5.1).<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.2 \u2014 Connect to ASM Instance and Check Status<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Connect to ASM instance\nsqlplus \/ as sysasm<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 150\nset pagesize 50\ncol instance_name for a15\ncol status        for a12\ncol version       for a15\ncol host_name     for a30\n\n-- Check ASM instance status\nSELECT instance_name, status, version, host_name\nFROM   v$instance;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Expected output:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSTANCE_NAME   STATUS       VERSION           HOST_NAME\n--------------- ------------ ----------------- --------------------\n+ASM            STARTED      19.0.0.0.0        dbserver01<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.3 \u2014 Check All Diskgroups and Their Status<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Before any disk operation, you must know the current state of all diskgroups \u2014 their mount status, redundancy type, total space, free space, and number of disks. A diskgroup in DISMOUNTED or ERROR state needs immediate attention.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Connect to ASM instance\nsqlplus \/ as sysasm\n\nset linesize 200\nset pagesize 100\ncol name          for a15\ncol state         for a12\ncol type          for a10\ncol total_gb      for 99999.99\ncol free_gb       for 99999.99\ncol used_pct      for 999.99\ncol offline_disks for 999\n\nSELECT name,\n       state,\n       type,\n       total_mb\/1024                           total_gb,\n       free_mb\/1024                            free_gb,\n       ROUND((1 - free_mb\/total_mb)*100, 2)   used_pct,\n       offline_disks\nFROM   v$asm_diskgroup\nORDER BY name;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>STATE<\/code> must be <code>MOUNTED<\/code> for all diskgroups<\/li>\n\n\n\n<li><code>offline_disks<\/code> must be <code>0<\/code> \u2014 any non-zero value means a disk has failed<\/li>\n\n\n\n<li><code>used_pct<\/code> above 85% needs attention before adding more data<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.4 \u2014 Check All ASM Disks and Their Status<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Confirms all disks in each diskgroup are healthy. A single failed disk in a diskgroup with EXTERNAL redundancy means total diskgroup failure. Must be checked before any maintenance.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 220\nset pagesize 100\ncol group_number  for 999\ncol disk_number   for 999\ncol name          for a20\ncol path          for a35\ncol state         for a12\ncol mode_status   for a12\ncol total_gb      for 99999.99\ncol free_gb       for 99999.99\ncol header_status for a15\n\nSELECT d.group_number,\n       d.disk_number,\n       d.name,\n       d.path,\n       d.state,\n       d.mode_status,\n       d.header_status,\n       d.total_mb\/1024   total_gb,\n       d.free_mb\/1024    free_gb\nFROM   v$asm_disk d\nORDER BY d.group_number, d.disk_number;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>STATE<\/code> must be <code>NORMAL<\/code> for all disks<\/li>\n\n\n\n<li><code>MODE_STATUS<\/code> must be <code>ONLINE<\/code> for all disks<\/li>\n\n\n\n<li><code>HEADER_STATUS<\/code> must be <code>MEMBER<\/code> for disks inside a diskgroup or <code>CANDIDATE<\/code> for new unconfigured disks<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.5 \u2014 Check ASM Rebalance Operations in Progress<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> If a rebalance is already running (from a previous disk add\/remove), you must know about it before starting any new disk operations. Starting a new operation during an active rebalance can cause performance issues.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 180\nset pagesize 50\ncol group_number for 999\ncol operation    for a15\ncol state        for a12\ncol power        for 999\ncol actual       for 999\ncol sofar        for 99999999\ncol est_work     for 99999999\ncol est_minutes  for 9999\n\nSELECT group_number, operation, state, power,\n       actual, sofar, est_work, est_minutes\nFROM   v$asm_operation;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong> No rows = no rebalance in progress (good). If rows exist, note the <code>est_minutes<\/code> to understand how long before it completes.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">4.6 \u2014 Check Available Raw Disks for ASM (New Disks)<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> When adding new disks to ASM, you must first identify the disk device paths. You also need to confirm they are truly new\/empty and not already in use by the OS or another application.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># As root \u2014 list all block devices\nlsblk\n\n# Show all disks and their current usage\nfdisk -l <strong>2<\/strong>&gt;\/dev\/null | grep \"^Disk \/dev\" | grep -v loop\n\n# Check which disks have no partition table (these are candidates for ASM)\nfor disk in \/dev\/sd*; do\n    echo \"=== $disk ===\"\n    fdisk -l $disk <strong>2<\/strong>&gt;\/dev\/null | head -3\ndone\n\n# Check if any disk already has ASM header (has been used by ASM before)\n$ORACLE_HOME\/bin\/asmtool -list -prefix \/dev\/sd <strong>2<\/strong>&gt;\/dev\/null<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Never add a disk to ASM if it already has data on it \u2014 ASM will overwrite the disk header and all existing data will be lost. Confirm with your storage team that the disks are newly presented and empty.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">5. ASM Instance Management<\/h3>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.1 \u2014 Start ASM Instance<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> The ASM instance must be started before any database that uses ASM storage can start. On standalone servers with Grid Infrastructure, ASM is usually managed by the Grid stack (not manual startup). But knowing the manual startup is essential for troubleshooting.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Switch to Grid Home\nexport ORACLE_HOME=\/u01\/app\/19.3.0\/grid\nexport ORACLE_SID=+ASM\nexport PATH=$ORACLE_HOME\/bin:$PATH\n\nsqlplus \/ as sysasm<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Start ASM instance\nSTARTUP;\n\n-- Verify it is started\nSELECT instance_name, status FROM v$instance;\nEXIT;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.2 \u2014 Shut Down ASM Instance<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> You CANNOT shut down the ASM instance if any database is currently using ASM storage. You must shut down all databases first, then shut down ASM.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Step 1 \u2014 Shut down the database first\nexport ORACLE_SID=ORCL\nexport ORACLE_HOME=\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\nsqlplus \/ as sysdba<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>SHUTDOWN IMMEDIATE;\nEXIT;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># Step 2 \u2014 Now shut down ASM\nexport ORACLE_HOME=\/u01\/app\/19.3.0\/grid\nexport ORACLE_SID=+ASM\nexport PATH=$ORACLE_HOME\/bin:$PATH\n\nsqlplus \/ as sysasm<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- NORMAL waits for all ASM clients (databases) to disconnect\nSHUTDOWN NORMAL;\nEXIT;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">5.3 \u2014 Check ASM Background Processes<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> ASM has specific background processes similar to a database. Knowing them helps you confirm ASM is healthy and troubleshoot when something is wrong.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># List all ASM background processes\nps -ef | grep \"+ASM\" | grep -v grep<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key ASM processes you should see:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Process<\/th><th>What It Does<\/th><\/tr><\/thead><tbody><tr><td>asm_pmon_+ASM<\/td><td>Process Monitor \u2014 cleans up failed ASM processes<\/td><\/tr><tr><td>asm_rbal_+ASM<\/td><td>Rebalance coordinator \u2014 manages disk rebalancing<\/td><\/tr><tr><td>asm_gmon_+ASM<\/td><td>Group Monitor \u2014 monitors diskgroup health<\/td><\/tr><tr><td>asm_lgwr_+ASM<\/td><td>Log Writer \u2014 writes ASM redo<\/td><\/tr><tr><td>asm_dbw0_+ASM<\/td><td>Database Writer \u2014 writes ASM metadata<\/td><\/tr><tr><td>asm_asmb_+ASM<\/td><td>ASM Bridge \u2014 communication between ASM and databases<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">6. Diskgroup Operations<\/h3>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.1 \u2014 Create a New Diskgroup<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> You create diskgroups when setting up a new environment or when adding additional storage groups (e.g., a separate +REDO diskgroup for redo logs). A diskgroup can be created while ASM and the database are both running \u2014 no downtime needed.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Redundancy choices:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>EXTERNAL REDUNDANCY<\/code> \u2014 No ASM mirroring. Used when the storage array provides its own RAID protection. Most common in enterprise environments with SAN storage.<\/li>\n\n\n\n<li><code>NORMAL REDUNDANCY<\/code> \u2014 2-way mirror. ASM keeps two copies of every extent. Needs at least 2 failure groups (disks from different controllers).<\/li>\n\n\n\n<li><code>HIGH REDUNDANCY<\/code> \u2014 3-way mirror. Needs at least 3 failure groups. Maximum protection but uses 3x storage.<\/li>\n\n\n\n<li><\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Connect to ASM instance\nsqlplus \/ as sysasm\n\n-- Example 1: Create +DATA diskgroup with EXTERNAL redundancy (SAN storage)\n-- AU_SIZE = 4MB (good for OLTP databases with mixed I\/O)\nCREATE DISKGROUP DATA\n    EXTERNAL REDUNDANCY\n    DISK '\/dev\/sdb', '\/dev\/sdc', '\/dev\/sdd'\n    ATTRIBUTE 'AU_SIZE'         = '4M',\n              'COMPATIBLE.ASM'  = '19.0',\n              'COMPATIBLE.RDBMS'= '19.0';\n\n-- Example 2: Create +FRA diskgroup with NORMAL redundancy (2-way mirror)\n-- Needs disks from at least 2 different failure groups\nCREATE DISKGROUP FRA\n    NORMAL REDUNDANCY\n    FAILGROUP FG1 DISK '\/dev\/sde' NAME FRA_0001\n    FAILGROUP FG2 DISK '\/dev\/sdf' NAME FRA_0002\n    ATTRIBUTE 'AU_SIZE'         = '4M',\n              'COMPATIBLE.ASM'  = '19.0',\n              'COMPATIBLE.RDBMS'= '19.0';<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Verify new diskgroup is mounted and healthy\nset linesize 200\nset pagesize 50\ncol name     for a15\ncol state    for a12\ncol type     for a10\ncol total_gb for 99999.99\ncol free_gb  for 99999.99\n\nSELECT name, state, type,\n       total_mb\/1024 total_gb,\n       free_mb\/1024  free_gb\nFROM   v$asm_diskgroup\nORDER BY name;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.2 \u2014 Add Disks to Existing Diskgroup<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> When a diskgroup is running out of space, you add more disks to it. ASM automatically starts a rebalance operation after disk addition to evenly spread data across all disks including the new ones. The database stays online during this entire operation.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysasm\n\n-- Add one disk to +DATA diskgroup\nALTER DISKGROUP DATA ADD DISK '\/dev\/sdg' NAME DATA_0004;\n\n-- Add multiple disks at once\nALTER DISKGROUP DATA ADD DISK\n    '\/dev\/sdg' NAME DATA_0004,\n    '\/dev\/sdh' NAME DATA_0005,\n    '\/dev\/sdi' NAME DATA_0006;\n\n-- Add disk with specific rebalance power (1=slow\/low impact, 11=fast\/high impact)\n-- Higher power = faster rebalance but more I\/O impact on database\nALTER DISKGROUP DATA ADD DISK '\/dev\/sdg' NAME DATA_0004\n    REBALANCE POWER 4;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Monitor rebalance progress after disk addition\nset linesize 180\nset pagesize 50\ncol group_number for 999\ncol operation    for a15\ncol state        for a12\ncol power        for 999\ncol sofar        for 99999999\ncol est_work     for 99999999\ncol est_minutes  for 9999\n\nSELECT group_number, operation, state, power,\n       sofar, est_work, est_minutes\nFROM   v$asm_operation;\n\n-- Run this repeatedly until no rows returned (rebalance complete)<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.3 \u2014 Drop a Disk from a Diskgroup<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> You drop a disk when replacing a failed or degraded disk, or when reorganizing storage. When you drop a disk, ASM automatically moves all data from that disk to other disks in the group before removing it.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Never drop a disk if the diskgroup does not have enough free space to absorb the data from that disk. Check free space first. If <code>free_gb &lt; disk_size_gb<\/code>, the drop will fail.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysasm\n\n-- Check disk name and size before dropping\nset linesize 200\nset pagesize 50\ncol name     for a20\ncol path     for a30\ncol state    for a12\ncol total_gb for 9999.99\ncol free_gb  for 9999.99\n\nSELECT name, path, state, total_mb\/1024 total_gb, free_mb\/1024 free_gb\nFROM   v$asm_disk\nWHERE  group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA')\nORDER BY name;\n\n-- Drop a specific disk (ASM will rebalance remaining data first)\nALTER DISKGROUP DATA DROP DISK DATA_0004;\n\n-- Drop with specific rebalance power\nALTER DISKGROUP DATA DROP DISK DATA_0004 REBALANCE POWER 6;\n\n-- Monitor the rebalance\/drop progress\nSELECT group_number, operation, state, power, sofar, est_work, est_minutes\nFROM   v$asm_operation;<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Do NOT physically remove the disk from the server until <code>v$asm_operation<\/code> shows no rows and <code>v$asm_disk<\/code> no longer lists that disk. Removing the physical disk too early will cause diskgroup errors.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.4 \u2014 Drop an Entire Diskgroup<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Needed when decommissioning a database or reorganizing storage completely. All database files in the diskgroup must be removed first.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Dropping a diskgroup destroys ALL data in it permanently. Triple-check you are dropping the correct diskgroup. Ensure no database is using any file in this diskgroup.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysasm\n\n-- First confirm no database files exist in this diskgroup\nset linesize 200\nset pagesize 100\ncol group_number for 999\ncol name         for a40\ncol type         for a20\n\nSELECT group_number, name, type\nFROM   v$asm_alias\nWHERE  group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA')\nORDER BY type, name;\n\n-- If no files exist, drop the diskgroup\n-- INCLUDING CONTENTS drops even if files exist (use carefully)\nDROP DISKGROUP DATA INCLUDING CONTENTS;\n\n-- Verify it is gone\nSELECT name, state FROM v$asm_diskgroup;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.5 \u2014 Mount and Dismount Diskgroups<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Sometimes a diskgroup gets automatically dismounted due to a disk failure or manual operation. You need to know how to mount it back without restarting ASM.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysasm\n\n-- Mount a dismounted diskgroup\nALTER DISKGROUP DATA MOUNT;\n\n-- Dismount a diskgroup (database must not be using it)\nALTER DISKGROUP DATA DISMOUNT;\n\n-- Mount ALL diskgroups (useful after ASM restart)\nALTER DISKGROUP ALL MOUNT;\n\n-- Verify mount status\nSELECT name, state FROM v$asm_diskgroup ORDER BY name;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.6 \u2014 Resize a Disk in Diskgroup<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> If your storage team has extended the size of an existing LUN\/disk, you can resize it in ASM without dropping and re-adding it.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysasm\n\n-- Resize specific disk to new size in MB\nALTER DISKGROUP DATA RESIZE DISK DATA_0001 SIZE 102400M;\n\n-- Resize ALL disks in the diskgroup to their actual current size\nALTER DISKGROUP DATA RESIZE ALL;\n\n-- Verify new sizes\nSELECT name, total_mb\/1024 total_gb FROM v$asm_disk\nWHERE  group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA');<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">6.7 \u2014 Control Rebalance Power<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Rebalancing consumes I\/O resources. During business hours you want low power (less impact on database). During maintenance window you want high power (faster completion).<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysasm\n\n-- Change rebalance power on the fly (no restart needed)\n-- Power values: 1 (minimum) to 11 (maximum)\n-- 0 = pause rebalance completely\nALTER DISKGROUP DATA REBALANCE POWER 8;   -- Speed up during maintenance window\nALTER DISKGROUP DATA REBALANCE POWER 2;   -- Slow down during business hours\nALTER DISKGROUP DATA REBALANCE POWER 0;   -- Pause rebalance temporarily\n\n-- Check current rebalance status and power\nSELECT group_number, operation, state, power, sofar, est_minutes\nFROM   v$asm_operation;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">7. ASMCMD \u2014 ASM Command Line Navigation<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is ASMCMD?<\/strong> ASMCMD is a command-line interface for navigating ASM diskgroups just like a Unix shell. You can list files, create directories, copy files, delete files, and check disk usage \u2014 all inside ASM.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.1 \u2014 Launch ASMCMD<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Switch to Grid Home and ASM SID\nexport ORACLE_HOME=\/u01\/app\/19.3.0\/grid\nexport ORACLE_SID=+ASM\nexport PATH=$ORACLE_HOME\/bin:$PATH\n\n# Launch ASMCMD\nasmcmd<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.2 \u2014 Common ASMCMD Commands<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd All commands below are run from inside the <code>ASMCMD&gt;<\/code> prompt.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Show current location (like pwd in Unix)\nASMCMD&gt; pwd\n\n# List diskgroups (from root level)\nASMCMD&gt; ls\n\n# Navigate into a diskgroup\nASMCMD&gt; cd +DATA\n\n# List contents of diskgroup\nASMCMD&gt; ls -l\n\n# Navigate into database directory inside diskgroup\nASMCMD&gt; cd +DATA\/ORCL\n\n# List all datafiles for database ORCL\nASMCMD&gt; ls -l\n\n# Show disk usage for a diskgroup (like du in Unix)\nASMCMD&gt; du\n\n# Show disk usage for specific directory\nASMCMD&gt; du +DATA\/ORCL\/DATAFILE\n\n# Find a specific file by name pattern\nASMCMD&gt; find +DATA -name '*.dbf'\n\n# Check diskgroup attributes\nASMCMD&gt; lsattr -G DATA -l\n\n# List all disks in all diskgroups\nASMCMD&gt; lsdsk -k\n\n# List only disks in a specific diskgroup\nASMCMD&gt; lsdsk -G DATA\n\n# Create a directory inside ASM\nASMCMD&gt; mkdir +DATA\/ORCL\/MYDIR\n\n# Copy a file within ASM\nASMCMD&gt; cp +DATA\/ORCL\/DATAFILE\/users.dbf +FRA\/ORCL\/DATAFILE\/users_copy.dbf\n\n# Delete a file from ASM\nASMCMD&gt; rm +DATA\/ORCL\/DATAFILE\/temp_old.tmp\n\n# Check ASM instance status from ASMCMD\nASMCMD&gt; lsct\n\n# Exit ASMCMD\nASMCMD&gt; exit<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">7.3 \u2014 ASMCMD in Batch \/ Non-Interactive Mode<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Useful for scripting \u2014 you can run a single ASMCMD command without entering the interactive prompt.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code># Run single command without entering interactive mode\nasmcmd ls +DATA\nasmcmd du +DATA\/ORCL\nasmcmd lsdsk -G DATA\nasmcmd lsattr -G DATA -l\n\n# Run multiple commands via script\nasmcmd &lt;&lt;EOF\nls +DATA\nls +FRA\ndu +DATA\/ORCL\/DATAFILE\nexit\nEOF<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">8. ASM Disk Discovery<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>What is disk discovery?<\/strong> When ASM starts, it searches for disks using a discovery path pattern. Only disks found in this path can be added to diskgroups. The discovery path is controlled by the <code>ASM_DISKSTRING<\/code> parameter.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.1 \u2014 Check Current Disk Discovery Path<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysasm\n\nset linesize 150\nset pagesize 50\ncol name  for a25\ncol value for a60\n\n-- Show current discovery string\nSELECT name, value\nFROM   v$asm_attribute\nWHERE  name = 'ASM_DISKSTRING'\nUNION\nSELECT name, value\nFROM   v$spparameter\nWHERE  name = 'asm_diskstring';<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.2 \u2014 Check What Disks ASM Can Discover<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- List all disks ASM can currently see (candidate + member disks)\nset linesize 200\nset pagesize 100\ncol path          for a35\ncol header_status for a15\ncol mode_status   for a12\ncol state         for a12\ncol name          for a20\n\nSELECT path, header_status, mode_status, state, name\nFROM   v$asm_disk\nORDER BY header_status, path;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Header status meanings:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Header Status<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td>MEMBER<\/td><td>Disk belongs to an ASM diskgroup<\/td><\/tr><tr><td>CANDIDATE<\/td><td>Disk is visible to ASM but not yet in a diskgroup<\/td><\/tr><tr><td>FORMER<\/td><td>Disk was previously in a diskgroup (has old ASM header)<\/td><\/tr><tr><td>PROVISIONED<\/td><td>Disk is reserved for ASM but not yet added<\/td><\/tr><tr><td>UNKNOWN<\/td><td>ASM cannot read the disk header<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">8.3 \u2014 Change Disk Discovery String<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> When your storage team presents new disks at a different device path than what ASM currently discovers, you must update the discovery string.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysasm\n\n-- Add new path to discovery string (keep existing paths, add new one)\nALTER SYSTEM SET ASM_DISKSTRING = '\/dev\/sd*', '\/dev\/oracleasm\/disks\/*'\n    SCOPE=BOTH SID='+ASM';\n\n-- Verify\nSHOW PARAMETER asm_diskstring;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">9. ASM Preferred Mirror Read (For Future RAC Reference)<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Note:<\/strong> This section is included for awareness as you will encounter it in RAC environments. In standalone ASM it is not applicable, but knowing this concept now helps when you reach the RAC SOP.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd In RAC with NORMAL or HIGH redundancy diskgroups, each node can be configured to read from the mirror copy of data that is physically closest to it (on the same SAN zone or controller). This reduces read latency. Configured via <code>ASM_PREFERRED_READ_FAILURE_GROUPS<\/code> parameter.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">10. Post-Activity Checks<\/h3>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\u26a0\ufe0f <strong>IMPORTANT:<\/strong> Run these checks after every ASM administration activity \u2014 whether you added disks, created diskgroups, or performed any other operation.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.1 \u2014 Verify All Diskgroups Are Mounted<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysasm\n\nset linesize 200\nset pagesize 100\ncol name          for a15\ncol state         for a12\ncol type          for a10\ncol total_gb      for 99999.99\ncol free_gb       for 99999.99\ncol used_pct      for 999.99\ncol offline_disks for 999\n\nSELECT name,\n       state,\n       type,\n       total_mb\/1024                           total_gb,\n       free_mb\/1024                            free_gb,\n       ROUND((1 - free_mb\/total_mb)*100, 2)   used_pct,\n       offline_disks\nFROM   v$asm_diskgroup\nORDER BY name;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What to look for:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>All diskgroups show <code>MOUNTED<\/code><\/li>\n\n\n\n<li><code>offline_disks<\/code> = 0 for all diskgroups<\/li>\n\n\n\n<li><code>used_pct<\/code> is within acceptable range<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.2 \u2014 Verify All Disks Are Online<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 220\nset pagesize 100\ncol group_number  for 999\ncol disk_number   for 999\ncol name          for a20\ncol path          for a35\ncol state         for a12\ncol mode_status   for a12\ncol header_status for a15\ncol total_gb      for 9999.99\n\nSELECT d.group_number,\n       d.disk_number,\n       d.name,\n       d.path,\n       d.state,\n       d.mode_status,\n       d.header_status,\n       d.total_mb\/1024 total_gb\nFROM   v$asm_disk d\nWHERE  d.group_number &gt; 0\nORDER BY d.group_number, d.disk_number;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.3 \u2014 Verify No Rebalance is Running (After Completion)<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Should return no rows after rebalance completes\nSELECT group_number, operation, state, power, sofar, est_minutes\nFROM   v$asm_operation;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.4 \u2014 Verify Database Can Still Access ASM Files<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Switch back to DB Home\nexport ORACLE_HOME=\/u01\/app\/oracle\/product\/19.3.0\/dbhome_1\nexport ORACLE_SID=ORCL\nexport PATH=$ORACLE_HOME\/bin:$PATH\n\nsqlplus \/ as sysdba<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>set linesize 200\nset pagesize 100\ncol file#           for 999\ncol tablespace_name for a25\ncol status          for a12\ncol name            for a70\n\n-- Confirm all datafiles are accessible\nSELECT file#, tablespace_name, status, name\nFROM   v$datafile\nORDER BY file#;\n\n-- Confirm database is open\nSELECT name, open_mode FROM v$database;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.5 \u2014 Check ASM Alert Log for Errors<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code># Find ASM alert log location\nexport ORACLE_HOME=\/u01\/app\/19.3.0\/grid\nexport ORACLE_SID=+ASM\n\nsqlplus -s \/ as sysasm &lt;&lt;EOF\nset linesize 200 pagesize 0\ncol value for a80\nSELECT value FROM v\\$diag_info WHERE name = 'Diag Trace';\nEXIT;\nEOF\n\n# Scan ASM alert log for errors\n# Convention A:\ntail -200 \/u01\/app\/oracle\/diag\/asm\/+asm\/+ASM\/trace\/alert_+ASM.log \\\n     | grep -E \"ORA-|Error|WARNING|FAILED|DISMOUNT\"\n\n# Convention B:\ntail -200 \/oracle\/diag\/asm\/+asm\/+ASM\/trace\/alert_+ASM.log \\\n     | grep -E \"ORA-|Error|WARNING|FAILED|DISMOUNT\"<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">10.6 \u2014 Verify ASM Diskgroup Attributes<\/h4>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">\ud83d\udcdd <strong>Why?<\/strong> Diskgroup attributes like <code>COMPATIBLE.ASM<\/code> and <code>COMPATIBLE.RDBMS<\/code> control which Oracle version can use the diskgroup. After upgrades or new diskgroup creation, confirm these are set correctly.<\/p>\n<\/blockquote>\n\n\n\n<pre class=\"wp-block-code\"><code>sqlplus \/ as sysasm\n\nset linesize 180\nset pagesize 100\ncol dg_name   for a15\ncol name      for a30\ncol value     for a30\n\nSELECT dg.name dg_name, a.name, a.value\nFROM   v$asm_attribute a,\n       v$asm_diskgroup  dg\nWHERE  a.group_number = dg.group_number\nAND    a.name IN ('compatible.asm','compatible.rdbms','au_size','cell.smart_scan_capable')\nORDER BY dg.name, a.name;<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">11. Quick Reference Card<\/h3>\n\n\n\n<figure class=\"wp-block-table has-small-font-size\"><table><thead><tr><th>Task<\/th><th>Command<\/th><\/tr><\/thead><tbody><tr><td>Switch to ASM env<\/td><td><code>export ORACLE_SID=+ASM; export ORACLE_HOME=&lt;GRID_HOME&gt;<\/code><\/td><\/tr><tr><td>Connect to ASM<\/td><td><code>sqlplus \/ as sysasm<\/code><\/td><\/tr><tr><td>Start ASM<\/td><td><code>sqlplus \/ as sysasm<\/code> \u2192 <code>STARTUP;<\/code><\/td><\/tr><tr><td>Stop ASM<\/td><td><code>sqlplus \/ as sysasm<\/code> \u2192 <code>SHUTDOWN NORMAL;<\/code><\/td><\/tr><tr><td>Check ASM process<\/td><td><code>ps -ef | grep asm_pmon | grep -v grep<\/code><\/td><\/tr><tr><td>Check diskgroup status<\/td><td><code>SELECT name,state,total_mb\/1024,free_mb\/1024 FROM v$asm_diskgroup;<\/code><\/td><\/tr><tr><td>Check disk status<\/td><td><code>SELECT name,path,state,mode_status FROM v$asm_disk ORDER BY group_number;<\/code><\/td><\/tr><tr><td>Check rebalance<\/td><td><code>SELECT group_number,operation,state,power,est_minutes FROM v$asm_operation;<\/code><\/td><\/tr><tr><td>Create diskgroup<\/td><td><code>CREATE DISKGROUP DATA EXTERNAL REDUNDANCY DISK '\/dev\/sdb';<\/code><\/td><\/tr><tr><td>Add disk<\/td><td><code>ALTER DISKGROUP DATA ADD DISK '\/dev\/sdg' NAME DATA_0004;<\/code><\/td><\/tr><tr><td>Drop disk<\/td><td><code>ALTER DISKGROUP DATA DROP DISK DATA_0004;<\/code><\/td><\/tr><tr><td>Mount diskgroup<\/td><td><code>ALTER DISKGROUP DATA MOUNT;<\/code><\/td><\/tr><tr><td>Dismount diskgroup<\/td><td><code>ALTER DISKGROUP DATA DISMOUNT;<\/code><\/td><\/tr><tr><td>Rebalance power<\/td><td><code>ALTER DISKGROUP DATA REBALANCE POWER 8;<\/code><\/td><\/tr><tr><td>Resize disk<\/td><td><code>ALTER DISKGROUP DATA RESIZE ALL;<\/code><\/td><\/tr><tr><td>Launch ASMCMD<\/td><td><code>asmcmd<\/code><\/td><\/tr><tr><td>List ASM files<\/td><td><code>asmcmd ls +DATA\/ORCL<\/code><\/td><\/tr><tr><td>ASM disk usage<\/td><td><code>asmcmd du +DATA\/ORCL<\/code><\/td><\/tr><tr><td>Find file in ASM<\/td><td><code>asmcmd find +DATA -name '*.dbf'<\/code><\/td><\/tr><tr><td>List all disks<\/td><td><code>asmcmd lsdsk -k<\/code><\/td><\/tr><tr><td>Check discovery path<\/td><td><code>SHOW PARAMETER asm_diskstring;<\/code><\/td><\/tr><tr><td>Check ASM alert log<\/td><td><code>tail -200 alert_+ASM.log | grep ORA-<\/code><\/td><\/tr><tr><td>MOS ASM Admin Guide<\/td><td>Doc ID 1187723.1<\/td><\/tr><tr><td>MOS Disk Discovery<\/td><td>Doc ID 265633.1<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">This SOP covers everything you need to administer Oracle ASM on a standalone Linux server without referring to any other source. Always check diskgroup free space before adding or dropping disks, always monitor rebalance progress after any disk operation, and always verify the database can still access its datafiles after any ASM change.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A complete production-ready SOP for Oracle Automatic Storage Management (ASM) administration on Linux. Covers ASM concepts, instance management, diskgroup operations, disk addition and removal, rebalance operations, ASMCMD usage, and full validation checks \u2014 with real commands, expected outputs, and consultant-level notes for both standard OFA and enterprise custom path conventions. 1. Document Info Item Detail [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5780,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"googlesitekit_rrm_CAowu461DA:productID":"","footnotes":""},"categories":[1534],"tags":[],"class_list":["post-5755","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle-sop"],"_links":{"self":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5755","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/comments?post=5755"}],"version-history":[{"count":2,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5755\/revisions"}],"predecessor-version":[{"id":5818,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/posts\/5755\/revisions\/5818"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/media\/5780"}],"wp:attachment":[{"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/media?parent=5755"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/categories?post=5755"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/w3buddy.com\/blog\/wp-json\/wp\/v2\/tags?post=5755"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}