Many times i came across a common problem in RAC databases where trying to add an asm disk is not possible due to errors like
ORA-15075 "disk(s) are not visible cluster-wide"
ORA-15020 "discovered duplicate ASM disk "DISK1" and
ORA-15054 "disk "ORCL:DISK1" does not exist in diskgroup "DG1".
Rebalancing the diskgroup and trying to add the disk with "FORCE" option also does not help in this case.
I will be discussing how to come out of a situation like this i.e When you are trying to add an asm disk in cluster environment and it says that disk is already added and when trying to drop the same disk it says that disk is not present in the diskgroup.
Lets start from the very begining:
I have decided to add an asm disk in RAC environment to an already existing diskgroup DATA1.
Login to asm instance "/ as sysdba"
SQL > ALTER DISKGROUP DATA1 ADD DISK '/dev/rdsk/c1t2d3s4';
But it failed with following error:
ALTER DISKGROUP DATA1 ADD DISK '/dev/rdsk/c1t2d3s4';* ERROR at line 1: <strong>ORA-15032: not all alterations performed ORA-15075: disk(s) are not visible cluster-wide</strong>
This is due to the fact that the physical disk partition is not visible from all RAC nodes. Then i contacted the sysadmins to make sure that the disk is visible from all RAC nodes and accessible by ORACLE. They have fixed the problem and now the disk /dev/rdsk/c1t2d3s4 can be seen from all RAC nodes. Then i tried to add the disk again using force option as:
SQL > ALTER DISKGROUP DATA1 ADD DISK '/dev/rdsk/c1t2d3s4' force;
But it failed with following error:
ORA-15020: discovered duplicate ASM disk "/dev/rdsk/c1t2d3s4"
It shows that disk with same name is already present in the diskgroup.
As it shows that the disk is already present in the diskgroup, while trying to drop the disk i got following error:
SQL> alter diskgroup DATA1 drop disk '/dev/rdsk/c1t2d3s4'; alter diskgroup DATA1 drop disk '/dev/rdsk/c1t2d3s4' * ERROR at line 1: <strong>ORA-15032 : not all alterations performed ORA-15054 : disk "/dev/rdsk/c1t2d3s4" does not exist in diskgroup "DATA1"</strong>
Now I cannot move further as adding and dropping the disk is not possible here. Then I decided to check the status of the disk from v$asm_disk from all RAC nodes, to do this issue following query:
SQL > col name format a15 SQL > col path format a20 SQL > select GROUP_NUMBER,DISK_NUMBER,MOUNT_STATUS,HEADER_STATUS,NAME,PATH from v$asm_disk;
We Obain following results from all the nodes :
G# D# HEADER_STATU MOUNT_S STATE NAME PATH
---- ---- ------------ ------- -------- ------------ -------------------------
0 0 MEMBER IGNORED NORMAL /dev/rdsk/c1t2d3s4
Header_status=MEMBER means that the disk is a valid asm disk on all RAC nodes.
Mount_status=IGNORED means that Disk is present in the system, but is ignored by ASM.
Group_number=0 This is the number used when a disk is not mounted by a diskgroup.
Now by checking the dd output of the disk as :
$dd if=/dev/rdsk/c1t2d3s4 of=/tmp/disk.out bs=4096 count=1096
$ vi /tmp/disk.out
I found that the diskgroup name and disk number allocated to this disk, which confirms that the disk is now a part of diskgroup DATA1.
But from the results of the header_status,mount_status and group_number it is clear that the disk is partially added to RAC asm instances. To correct this we will have to clear the disk header to add it again:
# dd if=/dev/null of=/dev/rdsk/c1t2d3s4 bs=4096 count=5000
This command cleared the disk header and after that disk was added successfully.
Note: - Please note that using dd will clear the ASM header and should be used only after confirming the disk. Using it on a wrong disk can cause Diskgroup to dismount and lead to Data Loss.