Changing physical path of ASM disk group
The purpose of this document is to show that changing the psyhical path of ASM disk MEMBERS is possible and there is no risk.
For the purpose of the test, we create one logical volume called lvora and we grant ownership of this file to oracle:
root@node1:/# lvcreate -n lvora -L 1024 vg00
root@node1:/# chown oracle:dba /dev/vg00/rlvora
Start DBCA and create ASM instance:
- set sys password
- set data group name to DATA
- set redundancy to External
- set Disk Discovery Path to /dev/vg00/rlv*
At this stage only /dev/vg00/rlvora is CANDIDATE disk for disk group with size of 1 Gb.
Select the disk and create the disk group. Now we have one mounted disk group called DATA with external redundancy and
using /dev/vg00/rlvora as a MEMBER of the disk group.
To simulate changing (or failure) of the physical disk or even moving data from one physical disk to another we used dd
to copy raw data from /dev/vg00/rlvora to /dev/rdsk/c0t2d0 and then we delete the logical volume.
We shutdown the ASM instance and copy the contents of the logical volume to the raw physical disk using dd:
oracle@node1:/home/oracle$ export ORACLE_HOME=/oracle/ora10g
oracle@node1:/home/oracle$ export ORACLE_SID=+ASM
oracle@node1:/home/oracle$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Thu Dec 13 01:50:38 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to:
Oracle Database 10g Release 10.2.0.1.0 - 64bit Production
With the Real Application Clusters option
SQL> select GROUP_NUMBER, NAME, STATE, TYPE from v$asm_diskgroup;
GROUP_NUMBER NAME STATE TYPE
------------ ------------------------------ ----------- ------
1 DATA MOUNTED EXTERN
SQL> select GROUP_NUMBER, DISK_NUMBER, MODE_STATUS, STATE, NAME, PATH from v$asm_disk;
GROUP_NUMBER DISK_NUMBER MODE_ST STATE NAME PATH
------------ ----------- ------- -------- --------- ----------------
1 0 ONLINE NORMAL DATA_0000 /dev/vg00/rlvora
SQL> shutdown immediate
ASM diskgroups dismounted
ASM instance shutdown
SQL> exit
oracle@node1:/home/oracle$ exit
root@node1:/root# chown oracle:dba /dev/rdsk/c0t2d0
root@node1:/root# dd if=/dev/vg00/rlvora of=/dev/rdsk/c0t2d0 bs=1024k
1024+0 records in
1024+0 records out
root@node1:/root# lvremove /dev/vg00/lvora
The logical volume "/dev/vg00/lvora" is not empty;
do you really want to delete the logical volume (y/n) : y
Logical volume "/dev/vg00/lvora" has been successfully removed.
Volume Group configuration for /dev/vg00 has been saved in /etc/lvmconf/vg00.conf
We have moved data to /dev/rdsk/c0t2d0 and we have removed the logical volume.
Now if you try to mount the disk group or start the instance you will get the following error:
oracle@node1:/home/oracle$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Thu Dec 13 02:05:48 2007
Copyright (c) 1982, 2005, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ASM instance started
Total System Global Area 130023424 bytes
Fixed Size 1991968 bytes
Variable Size 102865632 bytes
ASM Cache 25165824 bytes
ORA-15032: not all alterations performed
ORA-15063: ASM discovered an insufficient number of disks for diskgroup "DATA"
SQL> select GROUP_NUMBER, NAME, STATE, TYPE from v$asm_diskgroup;
no rows selected
SQL> select GROUP_NUMBER, DISK_NUMBER, MODE_STATUS, STATE, NAME, PATH from v$asm_disk;
no rows selected
SQL> show parameter diskstring
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
asm_diskstring string /dev/vg00/rlv*
As you can seen the discovery path is still pointing to /dev/vg00/rlv*, now we will change disk discovery path by pointing asm_diskstring parameter to the new location of the disk and we will mount the ASM instance:
SQL> alter system set asm_diskstring='/dev/rdsk/*' scope=both;
System altered.
SQL> select GROUP_NUMBER, DISK_NUMBER, MODE_STATUS, STATE, NAME, PATH from v$asm_disk;
GROUP_NUMBER DISK_NUMBER MODE_ST STATE NAME PATH
------------ ----------- ------- -------- --------- ----------------
0 0 ONLINE NORMAL /dev/rdsk/c0t2d0
SQL> alter diskgroup data mount;
Diskgroup altered.
SQL> select GROUP_NUMBER, DISK_NUMBER, MODE_STATUS, STATE, NAME, PATH from v$asm_disk;
GROUP_NUMBER DISK_NUMBER MODE_ST STATE NAME PATH
------------ ----------- ------- -------- --------- ----------------
1 0 ONLINE NORMAL DATA_0000 /dev/rdsk/c0t2d0
SQL> select GROUP_NUMBER, NAME, STATE, TYPE from v$asm_diskgroup;
GROUP_NUMBER NAME STATE TYPE
------------ ------------------------------ ----------- ------
1 DATA MOUNTED EXTERN
SQL> show parameter diskstring;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
asm_diskstring string /dev/rdsk/*
Final test to show that the changes are applied:
SQL> shutdown immediate
ASM diskgroups dismounted
ASM instance shutdown
SQL> startup
ASM instance started
Total System Global Area 130023424 bytes
Fixed Size 1991968 bytes
Variable Size 102865632 bytes
ASM Cache 25165824 bytes
ASM diskgroups mounted
SQL> exit
Disconnected from Oracle Database 10g Release 10.2.0.1.0 - 64bit Production
With the Real Application Clusters option
Conclusion
ASM does not keep track of the physical disks of the data groups. Said in other way it does not matter the path or the mminor, major numbers of the physical disks, because the metadata is kept on the disk itself and there is nothing in the dictionary. When you start ASM instance it scans the disks based on the parameter asm_diskstring and reads the header information of the discovered disks.