I was trying the last night add a disk to an AMS diskgroup (Normal Redundancy) but when I added the disk I received the “ORA-15410: Disks in disk group DATA_TEST do not have equal size”. In older asm version I could add disk of different size without any issue, researching a little bit I found that oracle had set up this restriction on the oracle version 12.1.0.2 therefor If you are using this version you can’t add disk on different sizes.
On the Note (MOS 1938950.1) they explained the causes of this issue, one of them are to avoid the allocation problems like “ORA-15041: diskgroup space exhausted”. Also to if the disk have the same size ASM spread the files over all the disk in the same way, so this constrain ensure that all of the disk in a diskgroup have the same I/O load. It’s make sense for me.
Just to clarify, it doesn’t matter if you set compatible asm diskgroup to older version, this constrain is set up on ASM engine version.
I have 5 disks, two of them 5GB, one with 10G and two of 100GB
SQL> SELECT group_number, disk_number, path,os_mb,header_status FROM v$asm_disk where HEADER_STATUS!='MEMBER'; GROUP_NUMBER DISK_NUMBER PATH OS_MB HEADER_STATU ------------ ----------- -------------------- ---------- ------------ 0 0 /dev/asmdatatest2 5114 CANDIDATE 0 1 /dev/asmdata2 102398 CANDIDATE 0 4 /dev/asmdatatest1 5114 CANDIDATE 0 3 /dev/asmdatatest3 10236 CANDIDATE 0 2 /dev/asmdata1 102398 CANDIDATE
I created the diskgroup with normal redundancy
SQL> CREATE DISKGROUP DATA_TEST NORMAL REDUNDANCY FAILGROUP DATAFG1 DISK '/dev/asmdatatest1' FAILGROUP DATAFG2 DISK '/dev/asmdatatest2' ATTRIBUTE 'compatible.asm' ='10.1.0.0.0', 'compatible.rdbms'='10.1.0.0.0'; 2 3 4 Diskgroup created.
When I was trying to add the disk, I received the following error message:
SQL> alter diskgroup data_test add disk '/dev/asmdatatest3' rebalance power 11; alter diskgroup data_test add disk '/dev/asmdatatest3' rebalance power 11 * ERROR at line 1: ORA-15032: not all alterations performed ORA-15410: Disks in disk group DATA_TEST do not have equal size.
We can’t avoid this constrain but there are two possible solutions to carry out ( I won’t write the solution about “Use the same size disks because I think it is implicit”:
Solution one:
If you have a bigger disk like my case (10228M) you can restrict to the required samaller disks (5114M) at ASM level:
SQL> alter diskgroup data_test add disk '/dev/asmdatatest3' size 5114M rebalance power 11; Diskgroup altered. SQL> SELECT name, failgroup, total_mb, free_mb from v$asm_disk where name like '%DATA_TEST%'; NAME FAILGROUP TOTAL_MB FREE_MB ------------------------------ ------------------------------ ---------- ---------- DATA_TEST_0000 DATAFG1 5114 5063 DATA_TEST_0001 DATAFG2 5114 5063 DATA_TEST_0002 DATA_TEST_0002 5114 5063 SQL> select name, compatibility from v$asm_diskgroup; NAME COMPATIBILITY ------------------------------ ------------------------------------------------------------ DATA_TEST 10.1.0.0.0 FRA 12.1.0.0.0 DATA 12.1.0.0.0
This solution for me it’s a very waste of space… so let’s take a look the other one:
Solution two:
In case you need to replace the entire ASM disks in a diskgroup, with bigger ones, you can first drop the old small disks and then add the new ones.
SQL> SELECT g.name dg_name,d.name dk_name, d.path , d.total_mb disk_size_mb, d.state dk_state FROM v$asm_disk d, v$asm_diskgroup g WHERE g.group_number=d.group_number AND g.name='DATA_TEST'; 2 3 4 DG_NAME DK_NAME PATH DISK_SIZE_MB DK_STATE ------------------------------ ------------------------------ -------------------- ------------ -------- DATA_TEST DATA_TEST_0000 /dev/asmdatatest1 5114 NORMAL DATA_TEST DATA_TEST_0001 /dev/asmdatatest2 5114 NORMAL DATA_TEST DATA_TEST_0002 /dev/asmdatatest3 5114 NORMAL SQL> ALTER DISKGROUP DATA_TEST DROP DISK DATA_TEST_0000, DATA_TEST_0001,DATA_TEST_0002 ADD FAILGROUP DATA_0004 DISK '/dev/asmdata1'SIZE 102398M FAILGROUP DATA_0005 DISK '/dev/asmdata2' SIZE 102398M; 2 3 Diskgroup altered.
Checking the process and the final results:
SQL> select * from v$asm_operation; GROUP_NUMBER OPERA PASS STAT POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES ERROR_CODE CON_ID ------------ ----- --------- ---- ---------- ---------- ---------- ---------- ---------- ----------- --------------- ---------- 1 REBAL RESYNC DONE 1 1 0 0 0 0 0 1 REBAL REBALANCE RUN 1 1 144 147 1149 0 0 1 REBAL COMPACT WAIT 1 1 0 0 0 0 0 SQL> alter diskgroup data_test rebalance power 11; Diskgroup altered. SQL> select * from v$asm_operation; no rows selected SQL> / no rows selected SQL> SELECT g.name dg_name,d.name dk_name, d.path , d.total_mb disk_size_mb, d.state dk_state FROM v$asm_disk d, v$asm_diskgroup g WHERE g.group_number=d.group_number AND g.name='DATA_TEST'; 2 3 4 DG_NAME DK_NAME PATH DISK_SIZE_MB DK_STATE ------------------------------ ------------------------------ -------------------- ------------ -------- DATA_TEST DATA_TEST_0003 /dev/asmdata1 102398 NORMAL DATA_TEST DATA_TEST_0004 /dev/asmdata2 102398 NORMAL