====== Migrer les données d'un diskgroup ====== == 1/ Diskgroup redondance normale == Il s'agit du diskgroup **DATA** avec redondance //normal// sur 3 disques (perte 1 disque toléré) * Afficher l'articulation des DISKGROUP: SQL> SET lines 800 column disk_group_name format a30 column PATH format a50 column disk_file_name format a30 column FAILGROUP_TYPE format a20 SELECT NVL(a.name, '[CANDIDATE]') disk_group_name, b.PATH, b.name disk_file_name, a.TYPE FROM v$asm_diskgroup a RIGHT OUTER JOIN v$asm_disk b USING (group_number) ORDER BY a.name; DISK_GROUP_NAME PATH DISK_FILE_NAME TYPE ------------------------------ -------------------------------------------------- ------------------------------ ------ DATA /dev/oracleasm/disks/ASM_DATA1 DATA_0000 NORMAL DATA /dev/oracleasm/disks/ASM_DATA2 DATA_0001 NORMAL DATA /dev/oracleasm/disks/ASM_DATA3 DATA_0002 NORMAL FRA /dev/oracleasm/disks/ASM_FRA1 FRA_0000 EXTERN OCR /dev/oracleasm/disks/ASM_OCR2 OCR_0001 NORMAL OCR /dev/oracleasm/disks/ASM_OCR1 OCR_0002 NORMAL OCR /dev/oracleasm/disks/ASM_OCR3 OCR_0000 NORMAL * Afficher l'espace disque des DISKGROUP: SQL> set lines 1000 column "Diskgroup" format A30 column "Imbalance" format 99.9 Heading "Percent|Imbalance" column "Variance" format 99.9 Heading "Percent|Disk Size|Variance" column "MinFree" format 99.9 Heading "Minimum|Percent|Free" column "DiskCnt" format 9999 Heading "Disk|Count" column "Type" format A10 Heading "Diskgroup|Redundancy" SELECT g.name "Diskgroup", 100*(max((d.total_mb-d.free_mb)/d.total_mb)-min((d.total_mb-d.free_mb)/d.total_mb))/max((d.total_mb-d.free_mb)/d.total_mb) "Imbalance", 100*(max(d.total_mb)-min(d.total_mb))/max(d.total_mb) "Variance", 100*(min(d.free_mb/d.total_mb)) "MinFree", count(*) "DiskCnt", g.type "Type" FROM v$asm_disk d, v$asm_diskgroup g WHERE d.group_number = g.group_number and d.group_number <> 0 and d.state = 'NORMAL' and d.mount_status = 'CACHED' GROUP BY g.name, g.type; Percent Minimum Percent Disk Size Percent Disk Diskgroup Diskgroup Imbalance Variance Free Count Redundancy ------------------------------ --------- --------- ------- ----- ---------- FRA .0 .0 89.6 1 EXTERN OCR 2.4 .0 96.8 3 NORMAL DATA .0 .0 60.6 3 NORMAL * Les opérations ORACLEASM se font en **ROOT** * Les autres opérations se font en **GRID** __**Ajout disques**__ * ajouter 3 nouveaux disques au niveau OS et y créer une partition primaire * nous devons ensuite les initialiser par ASM: [root@oracle2 bin]# oracleasm createdisk ASM_DATA4 /dev/sdh1 [root@oracle2 bin]# oracleasm createdisk ASM_DATA5 /dev/sdi1 [root@oracle2 bin]# oracleasm createdisk ASM_DATA6 /dev/sdj1 * on rafraichi les disques ASM sur l'autre noeud RAC [root@oracle3 ~]# oracleasm scandisks Reloading disk partitions: done Cleaning any stale ASM disks... Scanning system for ASM disks... Instantiating disk "ASM_DATA4" Instantiating disk "ASM_DATA5" Instantiating disk "ASM_DATA6" [root@oracle3 ~]# [root@oracle3 ~]# [root@oracle3 ~]# oracleasm listdisks ASM_DATA1 ASM_DATA2 ASM_DATA3 ASM_DATA4 ASM_DATA5 ASM_DATA6 ASM_FRA1 ASM_FRA2 ASM_OCR1 ASM_OCR2 ASM_OCR3 * Une fois nos disques initialisés, ils sont disponibles dans ASM SQL> set lines 800 col disk_file_path format A40 SELECT a.name disk_group_name , b.path disk_file_path , b.name disk_file_name , b.failgroup disk_file_fail_group FROM v$asm_diskgroup a RIGHT OUTER JOIN v$asm_disk b USING (group_number) ORDER BY a.name; DISK_GROUP_NAME DISK_FILE_PATH DISK_FILE_NAME DISK_FILE_FAIL_GROUP ------------------------------ ------------------------------ ------------------------------ ------------------------------ --------------------------------------- DATA /dev/oracleasm/disks/ASM_DATA3 DATA_0002 DATA_0002 DATA /dev/oracleasm/disks/ASM_DATA1 DATA_0000 DATA_0000 DATA /dev/oracleasm/disks/ASM_DATA2 DATA_0001 DATA_0001 FRA /dev/oracleasm/disks/ASM_FRA1 FRA_0000 FRA_0000 OCR /dev/oracleasm/disks/ASM_OCR3 OCR_0000 OCR_0000 OCR /dev/oracleasm/disks/ASM_OCR1 OCR_0002 OCR_0002 OCR /dev/oracleasm/disks/ASM_OCR2 OCR_0001 OCR_0001 /dev/oracleasm/disks/ASM_DATA6 /dev/oracleasm/disks/ASM_DATA5 /dev/oracleasm/disks/ASM_DATA4 * Nous les ajoutons au Diskgroup **DATA** et lançons un //rebalance// des données. * à noter que plus l'option **//POWER X//** est grande, plus il y aura de consommation CPU, IO disque et plus vite la reconstruction des bandes de parité et le transfert des données sera rapide (//integer// de 0 à 1024, où 0=annulation) SQL> alter diskgroup DATA add disk '/dev/oracleasm/disks/ASM_DATA4','/dev/oracleasm/disks/ASM_DATA5','/dev/oracleasm/disks/ASM_DATA6' rebalance power 9; Diskgroup altered. * suivi de l'opération 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 COMPACT WAIT 9 9 0 0 0 0 0 1 REBAL REBALANCE RUN 9 9 1365 14408 12849 1 0 1 REBAL REBUILD DONE 9 9 187 187 0 0 0 1 REBAL RESYNC DONE 9 9 0 0 0 0 0 * le rebalance se matérialise par 2 daemon **ARB** : SQL> !ps -ef | grep asm | grep arb grid 1533 1 0 20:20 ? 00:00:00 asm_arba_+ASM1 grid 1535 1 5 20:20 ? 00:00:18 asm_arb0_+ASM1 grid 5010 29595 0 20:25 pts/0 00:00:00 /bin/bash -c ps -ef | grep asm | grep arb * on peut augmenter l'agressivité du rebalance en cours de route: alter diskgroup DATA rebalance power 50; * le transfert sur les nouveaux disques est terminé quand il n'y a plus d'opération de //rebalance// en cours SQL> select * from v$asm_operation; no rows selected * on peut le valider dans l'alert_log [grid@oracle2 trace]$ tail -f alert_+ASM1.log NOTE: requesting all-instance membership refresh for group=1 2025-10-20T20:42:57.221299+02:00 NOTE: membership refresh pending for group 1/0x8fc03614 (DATA) 2025-10-20T20:42:57.350064+02:00 GMON querying group 1 at 34 for pid 26, osid 9072 2025-10-20T20:42:57.353560+02:00 SUCCESS: refreshed membership for 1/0x8fc03614 (DATA) 2025-10-20T20:42:59.490306+02:00 NOTE: Attempting voting file refresh on diskgroup DATA NOTE: Refresh completed on diskgroup DATA. No voting file found. 2025-10-20T21:12:45.235923+02:00 NOTE: stopping process ARB0 NOTE: stopping process ARBA 2025-10-20T21:12:45.627196+02:00 SUCCESS: rebalance completed for group 1/0x8fc03614 (DATA) == Suppression des disques == set lines 800 column disk_group_name format a30 column path format a50 column disk_file_name format a50 SELECT NVL(a.name, '[CANDIDATE]') disk_group_name, b.path, b.name disk_file_name FROM v$asm_diskgroup a RIGHT OUTER JOIN v$asm_disk b USING (group_number) ORDER BY a.name;SQL> SQL> SQL> SQL> 2 3 DISK_GROUP_NAME PATH DISK_FILE_NAME ------------------------------ -------------------------------------------------- -------------------------------------------------- DATA /dev/oracleasm/disks/ASM_DATA6 DATA_0005 DATA /dev/oracleasm/disks/ASM_DATA1 DATA_0000 DATA /dev/oracleasm/disks/ASM_DATA5 DATA_0004 DATA /dev/oracleasm/disks/ASM_DATA4 DATA_0003 DATA /dev/oracleasm/disks/ASM_DATA3 DATA_0002 FRA /dev/oracleasm/disks/ASM_FRA1 FRA_0000 OCR /dev/oracleasm/disks/ASM_OCR2 OCR_0001 OCR /dev/oracleasm/disks/ASM_OCR3 OCR_0000 OCR /dev/oracleasm/disks/ASM_OCR1 OCR_0002 [CANDIDATE] /dev/oracleasm/disks/ASM_DATA2 10 rows selected. alter diskgroup DATA drop disk DATA_0002,DATA_0001,DATA_0000 rebalance power 50; SQL> set lines 1000 col PATH format A50 col FAILGROUP_TYPE format A20 select PATH,MOUNT_STATUS,MODE_STATUS,STATE,REDUNDANCY,TOTAL_MB/1024 "TOTAL GB",FREE_MB/1024 "FREE GB",FAILGROUP_TYPE from v$asm_disk;SQL> SQL> SQL> PATH MOUNT_S MODE_ST STATE REDUNDA TOTAL GB FREE GB FAILGROUP_TYPE -------------------------------------------------- ------- ------- -------- ------- ---------- ---------- -------------------- /dev/oracleasm/disks/ASM_DATA2 CLOSED ONLINE NORMAL UNKNOWN 0 0 REGULAR /dev/oracleasm/disks/ASM_OCR3 CACHED ONLINE NORMAL UNKNOWN 9.99609375 9.67578125 REGULAR /dev/oracleasm/disks/ASM_FRA1 CACHED ONLINE NORMAL UNKNOWN 39.9990234 35.8339844 REGULAR /dev/oracleasm/disks/ASM_OCR2 CACHED ONLINE NORMAL UNKNOWN 9.99609375 9.6875 REGULAR /dev/oracleasm/disks/ASM_OCR1 CACHED ONLINE NORMAL UNKNOWN 9.99609375 9.68359375 REGULAR /dev/oracleasm/disks/ASM_DATA3 CACHED ONLINE DROPPING UNKNOWN 19.9990234 16.5458984 REGULAR <==== /dev/oracleasm/disks/ASM_DATA1 CACHED ONLINE DROPPING UNKNOWN 19.9990234 16.5449219 REGULAR <==== /dev/oracleasm/disks/ASM_DATA6 CACHED ONLINE NORMAL UNKNOWN 19.9990234 14.4287109 REGULAR /dev/oracleasm/disks/ASM_DATA5 CACHED ONLINE NORMAL UNKNOWN 19.9990234 14.4257813 REGULAR /dev/oracleasm/disks/ASM_DATA4 CACHED ONLINE NORMAL UNKNOWN 19.9990234 14.4267578 REGULAR 10 rows selected. * suivi de l'opération SQL> select * from v$asm_operation; no rows selected * une fois terminé, les disques enlevés sont en **MOUNT_STATE=CLOSED** SQL> set lines 1000 col PATH format A50 col FAILGROUP_TYPE format A20 select PATH,MOUNT_STATUS,MODE_STATUS,STATE,REDUNDANCY,TOTAL_MB/1024 "TOTAL GB",FREE_MB/1024 "FREE GB",FAILGROUP_TYPE from v$asm_disk; PATH MOUNT_S MODE_ST STATE REDUNDA TOTAL GB FREE GB FAILGROUP_TYPE -------------------------------------------------- ------- ------- -------- ------- ---------- ---------- -------------------- /dev/oracleasm/disks/ASM_DATA2 CLOSED ONLINE NORMAL UNKNOWN 0 0 REGULAR <==== /dev/oracleasm/disks/ASM_DATA1 CLOSED ONLINE NORMAL UNKNOWN 0 0 REGULAR <==== /dev/oracleasm/disks/ASM_DATA3 CLOSED ONLINE NORMAL UNKNOWN 0 0 REGULAR <==== /dev/oracleasm/disks/ASM_OCR3 CACHED ONLINE NORMAL UNKNOWN 9.99609375 9.67578125 REGULAR /dev/oracleasm/disks/ASM_FRA1 CACHED ONLINE NORMAL UNKNOWN 39.9990234 35.8339844 REGULAR /dev/oracleasm/disks/ASM_OCR2 CACHED ONLINE NORMAL UNKNOWN 9.99609375 9.6875 REGULAR /dev/oracleasm/disks/ASM_OCR1 CACHED ONLINE NORMAL UNKNOWN 9.99609375 9.68359375 REGULAR /dev/oracleasm/disks/ASM_DATA6 CACHED ONLINE NORMAL UNKNOWN 19.9990234 12.1269531 REGULAR /dev/oracleasm/disks/ASM_DATA5 CACHED ONLINE NORMAL UNKNOWN 19.9990234 12.1269531 REGULAR /dev/oracleasm/disks/ASM_DATA4 CACHED ONLINE NORMAL UNKNOWN 19.9990234 12.1259766 REGULAR 10 rows selected. * ces opérations sont visibles dans l'alert_log [grid@oracle2 trace]$ tail -f alert_+ASM1.log 2025-10-20T21:20:31.582323+02:00 NOTE: updating disk modes to 0x15 from 0x7f for disk 0 (DATA_0000) in group 1 (DATA): lflags 0x4 NOTE: updating disk modes to 0x15 from 0x7f for disk 2 (DATA_0002) in group 1 (DATA): lflags 0x4 NOTE: updating disk modes to 0x1 from 0x15 for disk 0 (DATA_0000) in group 1 (DATA): lflags 0x4 NOTE: updating disk modes to 0x1 from 0x15 for disk 2 (DATA_0002) in group 1 (DATA): lflags 0x4 2025-10-20T21:20:31.605517+02:00 NOTE: cache closing disk 0 of grp 1: DATA_0000 2025-10-20T21:20:31.606205+02:00 NOTE: cache closing disk 2 of grp 1: DATA_0002 2025-10-20T21:20:31.851832+02:00 NOTE: membership refresh pending for group 1/0x8fc03614 (DATA) 2025-10-20T21:20:31.858691+02:00 GMON querying group 1 at 36 for pid 26, osid 9072 GMON querying group 1 at 37 for pid 26, osid 9072 2025-10-20T21:20:31.893635+02:00 NOTE: Disk DATA_0000 in mode 0x0 marked for de-assignment NOTE: Disk DATA_0002 in mode 0x0 marked for de-assignment SUCCESS: refreshed membership for 1/0x8fc03614 (DATA) 2025-10-20T21:20:34.511104+02:00 NOTE: Attempting voting file refresh on diskgroup DATA NOTE: Refresh completed on diskgroup DATA. No voting file found. * Il ne reste plus qu'à les supprimer d'ASM, pour les rendre à l'OS [root@oracle3 ~]# oracleasm deletedisk ASM_DATA1 Disk "ASM_DATA1" defines an unmarked device Dropping disk: done [root@oracle3 ~]# oracleasm deletedisk ASM_DATA2 Clearing disk header: done Dropping disk: done [root@oracle3 ~]# oracleasm deletedisk ASM_DATA3 Clearing disk header: done Dropping disk: done [root@oracle3 ~]# oracleasm listdisks ASM_DATA4 ASM_DATA5 ASM_DATA6 ASM_FRA1 ASM_OCR1 ASM_OCR2 ASM_OCR3 == 2/ Diskgroup redondance external == Il s'agit du diskgroup **FRA** avec redondance //external// sur 1 disque (perte 0 disque toléré) * Afficher l'articulation des DISKGROUP: SQL> SET lines 800 column disk_group_name format a30 column PATH format a50 column disk_file_name format a30 column FAILGROUP_TYPE format a20 SELECT NVL(a.name, '[CANDIDATE]') disk_group_name, b.PATH, b.name disk_file_name, a.TYPE FROM v$asm_diskgroup a RIGHT OUTER JOIN v$asm_disk b USING (group_number) ORDER BY a.name; DISK_GROUP_NAME PATH DISK_FILE_NAME TYPE ------------------------------ -------------------------------------------------- ------------------------------ ------ DATA /dev/oracleasm/disks/ASM_DATA1 DATA_0000 NORMAL DATA /dev/oracleasm/disks/ASM_DATA2 DATA_0001 NORMAL DATA /dev/oracleasm/disks/ASM_DATA3 DATA_0002 NORMAL FRA /dev/oracleasm/disks/ASM_FRA1 FRA_0000 EXTERN OCR /dev/oracleasm/disks/ASM_OCR2 OCR_0001 NORMAL OCR /dev/oracleasm/disks/ASM_OCR1 OCR_0002 NORMAL OCR /dev/oracleasm/disks/ASM_OCR3 OCR_0000 NORMAL * Afficher l'espace disque des DISKGROUP: SQL> set lines 1000 column "Diskgroup" format A30 column "Imbalance" format 99.9 Heading "Percent|Imbalance" column "Variance" format 99.9 Heading "Percent|Disk Size|Variance" column "MinFree" format 99.9 Heading "Minimum|Percent|Free" column "DiskCnt" format 9999 Heading "Disk|Count" column "Type" format A10 Heading "Diskgroup|Redundancy" SELECT g.name "Diskgroup", 100*(max((d.total_mb-d.free_mb)/d.total_mb)-min((d.total_mb-d.free_mb)/d.total_mb))/max((d.total_mb-d.free_mb)/d.total_mb) "Imbalance", 100*(max(d.total_mb)-min(d.total_mb))/max(d.total_mb) "Variance", 100*(min(d.free_mb/d.total_mb)) "MinFree", count(*) "DiskCnt", g.type "Type" FROM v$asm_disk d, v$asm_diskgroup g WHERE d.group_number = g.group_number and d.group_number <> 0 and d.state = 'NORMAL' and d.mount_status = 'CACHED' GROUP BY g.name, g.type; Percent Minimum Percent Disk Size Percent Disk Diskgroup Diskgroup Imbalance Variance Free Count Redundancy ------------------------------ --------- --------- ------- ----- ---------- FRA .0 .0 89.6 1 EXTERN OCR 2.4 .0 96.8 3 NORMAL DATA .0 .0 60.6 3 NORMAL * initialisation ASM: [root@oracle2 bin]# oracleasm createdisk ASM_FRA2 /dev/sdk1 Writing disk header: done Instantiating disk: done [root@oracle2 bin]# oracleasm listdisks ASM_DATA1 ASM_DATA2 ASM_DATA3 ASM_DATA4 ASM_DATA5 ASM_DATA6 ASM_FRA1 ASM_FRA2 ASM_OCR1 ASM_OCR2 ASM_OCR3 * on rafraichi les disques ASM sur l'autre noeud RAC [root@oracle3 ~]# oracleasm scandisks Reloading disk partitions: done Cleaning any stale ASM disks... Scanning system for ASM disks... Instantiating disk "ASM_FRA2" [root@oracle3 ~]# [root@oracle3 ~]# [root@oracle3 ~]# oracleasm listdisks ASM_DATA4 ASM_DATA5 ASM_DATA6 ASM_FRA1 ASM_FRA2 ASM_OCR1 ASM_OCR2 ASM_OCR3 * vérification de la disponibilité dans ASM SQL> set lines 800 col disk_file_path format A40 SELECT a.name disk_group_name , b.path disk_file_path , b.name disk_file_name , b.failgroup disk_file_fail_group FROM v$asm_diskgroup a RIGHT OUTER JOIN v$asm_disk b USING (group_number) ORDER BY a.name; DISK_GROUP_NAME DISK_FILE_PATH DISK_FILE_NAME DISK_FILE_FAIL_GROUP ------------------------------ ---------------------------------------- ------------------------------ ------------------------------ DATA /dev/oracleasm/disks/ASM_DATA6 DATA_0005 DATA_0005 DATA /dev/oracleasm/disks/ASM_DATA5 DATA_0004 DATA_0004 DATA /dev/oracleasm/disks/ASM_DATA4 DATA_0003 DATA_0003 FRA /dev/oracleasm/disks/ASM_FRA1 FRA_0000 FRA_0000 OCR /dev/oracleasm/disks/ASM_OCR1 OCR_0002 OCR_0002 OCR /dev/oracleasm/disks/ASM_OCR3 OCR_0000 OCR_0000 OCR /dev/oracleasm/disks/ASM_OCR2 OCR_0001 OCR_0001 /dev/oracleasm/disks/ASM_FRA2 * ajout au Diskgroup **FRA** et //rebalance// des données. SQL> alter diskgroup FRA add disk '/dev/oracleasm/disks/ASM_FRA2' rebalance power 20; Diskgroup altered. * suivi de l'opération SQL> select * from v$asm_operation; GROUP_NUMBER OPERA PASS STAT POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES ERROR_CODE CON_ID ------------ ----- --------- ---- ---------- ---------- ---------- ---------- ---------- ----------- -------------------------------------------- ---------- 2 REBAL COMPACT RUN 20 20 28 0 0 0 0 2 REBAL REBALANCE DONE 20 20 2129 2129 0 0 0 2 REBAL REBUILD DONE 20 20 0 0 0 0 0 * suppression du disque du DISKGROUP ALTER diskgroup FRA DROP disk FRA_0000 rebalance POWER 50; Diskgroup altered. suivi de la suppression SQL> select * from v$asm_operation; GROUP_NUMBER OPERA PASS STAT POWER ACTUAL SOFAR EST_WORK EST_RATE EST_MINUTES ERROR_CODE CON_ID ------------ ----- --------- ---- ---------- ---------- ---------- ---------- ---------- ----------- -------------------------------------------- ---------- 2 REBAL COMPACT WAIT 50 50 0 0 0 0 0 2 REBAL REBALANCE RUN 50 50 1201 2133 83095 0 0 2 REBAL REBUILD DONE 50 50 0 0 0 0 * une fois terminé, le disque a supprimer n'est plus membre d'un diskgroup SQL> set lines 800 col disk_file_path format A40 SELECT a.name disk_group_name , b.path disk_file_path , b.name disk_file_name , b.failgroup disk_file_fail_group FROM v$asm_diskgroup a RIGHT OUTER JOIN v$asm_disk b USING (groSQL> SQL> 2 3 up_number) ORDER BY a.name; 4 5 6 DISK_GROUP_NAME DISK_FILE_PATH DISK_FILE_NAME DISK_FILE_FAIL_GROUP ------------------------------ ---------------------------------------- ------------------------------ ------------------------------ DATA /dev/oracleasm/disks/ASM_DATA5 DATA_0004 DATA_0004 DATA /dev/oracleasm/disks/ASM_DATA6 DATA_0005 DATA_0005 DATA /dev/oracleasm/disks/ASM_DATA4 DATA_0003 DATA_0003 FRA /dev/oracleasm/disks/ASM_FRA2 FRA_0001 FRA_0001 OCR /dev/oracleasm/disks/ASM_OCR1 OCR_0002 OCR_0002 OCR /dev/oracleasm/disks/ASM_OCR3 OCR_0000 OCR_0000 OCR /dev/oracleasm/disks/ASM_OCR2 OCR_0001 OCR_0001 /dev/oracleasm/disks/ASM_FRA1 8 rows selected. * une fois terminé, suppression du disque d'ASM [root@oracle2 bin]# oracleasm deletedisk ASM_FRA1 Clearing disk header: done Dropping disk: done [root@oracle2 bin]# oracleasm listdisks ASM_DATA4 ASM_DATA5 ASM_DATA6 ASM_FRA2 ASM_OCR1 ASM_OCR2 ASM_OCR3 * on rafraichi sur l'autre noeud du RAC [root@oracle3 ~]# oracleasm scandisks Reloading disk partitions: done Cleaning any stale ASM disks... Cleaning disk "ASM_FRA1" Scanning system for ASM disks... [root@oracle3 ~]# oracleasm listdisks ASM_DATA4 ASM_DATA5 ASM_DATA6 ASM_FRA2 ASM_OCR1 ASM_OCR2 ASM_OCR3