top of page

ASM Disk Migration to Different Storage

Learn how to migrate ASM disks to new storage systems.

In your environment, you might require to migrate ASM disks from one storage to another storage. The activity is very simple and straight forward. You can follow bellow procedure in order to migrate ASM disks without any downtime.


This is a zero downtime activity

Let us perform this activity on a test 11gR2 RAC database with 2 nodes. Below are the 3 disks allocated on both RAC nodes which are further allocated to CRS, DATA and FRA diskgroups


   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         915     7349706   83  Linux
/dev/sdb2             916        1830     7349737+  83  Linux
/dev/sdb3            1831        2610     6265350   83  Linux

Below are the diskgroup details

DISKGROUP  DISKNAME       TOTAL_MB    USED_MB    FREE_MB PATH                           HEADER_STATU
---------- ------------ ---------- ---------- ---------- ------------------------------ ------------
CRS        CRS_0000           7177        396       6781 /dev/oracleasm/disks/CRS1      MEMBER
DATA       DATA_0000          7177       2009       5168 /dev/oracleasm/disks/DATA1     MEMBER
FRA        FRA_0000           6118        366       5752 /dev/oracleasm/disks/FRA1      MEMBER

We are going to replace the DATA1 disk under DATA diskgroup with DATA2 disk. This new disk we have allocated via a new storage. Let us first create the ASM disk

[root@oraracn1 ~]# oracleasm createdisk DATA2 /dev/sdc1
Writing disk header: done
Instantiating disk: done

Connect to ASM via sqlplus and add the new diskstring. In our example, the new disk location is same as old disks, so no need to add. In case you have different disk path, add it to ASM_DISKSTRING parameter. Keep both old and new paths.

sqlplus / as sysasm

SQL> alter system set asm_disktring = '/dev/oracleasm/disks/*' , '/dev/new_loc/*';

SQL> select path from v$asm_disk;

Check the ASM disks details via below query. The new disk status must be PROVISIONED

set pages 40000 lines 120
col PATH for a30
select DISK_NUMBER,MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,STATE,
PATH FROM V$ASM_DISK;

DISK_NUMBER MOUNT_S HEADER_STATU MODE_ST STATE    PATH
----------- ------- ------------ ------- -------- ------------------------------
          0 CLOSED  PROVISIONED  ONLINE  NORMAL   /dev/oracleasm/disks/DATA2
          0 CACHED  MEMBER       ONLINE  NORMAL   /dev/oracleasm/disks/FRA1
          0 CACHED  MEMBER       ONLINE  NORMAL   /dev/oracleasm/disks/DATA1
          0 CACHED  MEMBER       ONLINE  NORMAL   /dev/oracleasm/disks/CRS1

We will now add DATA2 to DATA diskgroup and later remove DATA1 disk

SQL> alter diskgroup DATA add disk '/dev/oracleasm/disks/DATA2';

OR

SQL> alter diskgroup DATA add disk '/dev/oracleasm/disks/DATA2' rebalance power 20;

Diskgroup altered.

Wait for re-balance operation to complete

SQL> Select operation, state, est_work, est_minutes from v$asm_operation; 

OPERA STAT   EST_WORK EST_MINUTES
----- ---- ---------- -----------
REBAL RUN        1175           0

Once re-balance operation is completed, check the disk details

set lines 999;
col diskgroup for a10
col diskname for a12
col path for a30
select a.name DiskGroup,b.name DiskName, b.total_mb, (b.total_mb-b.free_mb) Used_MB, b.free_mb,b.path, 
b.header_status
from v$asm_disk b, v$asm_diskgroup a 
where a.group_number (+) =b.group_number 
order by b.group_number,b.name;

DISKGROUP  DISKNAME       TOTAL_MB    USED_MB    FREE_MB PATH                           HEADER_STATU
---------- ------------ ---------- ---------- ---------- ------------------------------ ------------
CRS        CRS_0000           7177        396       6781 /dev/oracleasm/disks/CRS1      MEMBER
DATA       DATA_0000          7177        838       6339 /dev/oracleasm/disks/DATA1     MEMBER
DATA       DATA_0001         10236       1183       9053 /dev/oracleasm/disks/DATA2     MEMBER
FRA        FRA_0000           6118        366       5752 /dev/oracleasm/disks/FRA1      MEMBER

Observe that both DATA1 and DATA2 are now part of DATA diskgroup. Now we can remove the old disk DATA1 from the diskgroup

SQL> alter diskgroup DATA drop disk 'DATA_0000'; 

Diskgroup altered.

Wait for re-balance operation to complete

SQL> Select operation, state, est_work, est_minutes from v$asm_operation; 

OPERA STAT   EST_WORK EST_MINUTES
----- ---- ---------- -----------
REBAL RUN         836           0

Once re-balance operation is completed, check the disk details via below query and you must see DATA1 disk marked as FORMER

set lines 999;
col diskgroup for a10
col diskname for a12
col path for a30
select a.name DiskGroup,b.name DiskName, b.total_mb, (b.total_mb-b.free_mb) Used_MB, b.free_mb,b.path, 
b.header_status
from v$asm_disk b, v$asm_diskgroup a 
where a.group_number (+) =b.group_number 
order by b.group_number,b.name;

DISKGROUP  DISKNAME       TOTAL_MB    USED_MB    FREE_MB PATH                           HEADER_STATU
---------- ------------ ---------- ---------- ---------- ------------------------------ ------------
                                 0          0          0 /dev/oracleasm/disks/DATA1     FORMER
CRS        CRS_0000           7177        396       6781 /dev/oracleasm/disks/CRS1      MEMBER
DATA       DATA_0001         10236       1183       9053 /dev/oracleasm/disks/DATA2     MEMBER
FRA        FRA_0000           6118        366       5752 /dev/oracleasm/disks/FRA1      MEMBER

You can later choose to complete drop DATA1 disk via below command and ask storage team to reclaim the mount points

[root@oraracn1 ~]# oracleasm deletedisk DATA1 /dev/sdb1

You can also achieve above via ASMCA but make sure you monitor re-balancing manually!

Become a top notch dba with DBA Genesis
Start your DBA career today
bottom of page