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 oracle@node1:/home/oracle$
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.
