L’EXADATA est un engineered system et donc, dans la majorité des cas, beaucoup de consultants, même ceux avec des années d’expérience, ont peur d’y toucher surtout lorsqu’il s’agit d’un changement radical.
Aujourd’hui on va traiter un sujet qui fait partie de ces scénarios. Je parle d’un cas qui est assez particulier où vous devez augmenter la taille d’un DISKGROUP mais vous n’avez plus d’espace au niveau de vos cells.
Donc, la solution que je vous propose, c’est de diminuer la taille d’un autre DISKGROUP (un DISKGROUP qui a peut-être été surdimensionné ou qui est moins critique ex: REDOC1) sans impact sur le plan de production (sans arrêt de service).
Avant de commencer et comme d’habitude, voici le sommaire :
- 1- Déterminer l’espace à récupérer du DISKGROUP à diminuer
- 2- Diminuer la taille du DISKGROUP à la taille souhaitée
- 3- Diminuer la taille des GRIDDISKS à la taille souhaitée
- 4- Augmenter la taille du GRIDDISK à la taille souhaitée
- 5- Augmenter la taille du DISKGROUP à la taille souhaitée
Maintenant qu’on a la ROADMAP de ce que nous allons faire, penchons-nous vers l’opération.
1- Déterminer l’espace à récupérer du DISKGROUP à diminuer
On va supposer que le DISKGROUP d’où on veut récupérer l’espace s’appelle RECOC1 et le DISKGROUP pour lequel on veut augmenter sa taille s’appelle DATAC1, bien sûr, les deux DISKGROUP peuvent faire partie du même cluster ou pas.
SQL> select name, total_mb, free_mb, total_mb - free_mb used_mb, round(100*free_mb/total_mb,2) pct_free from v$asm_diskgroup order by 1; NAME TOTAL_MB FREE_MB USED_MB PCT_FREE ------------------------------ ---------- ---------- ---------- ---------- DATAC1 68812800 9985076 58827724 14.51 RECOC1 94980480 82594920 12385560 86.96
Donc on a 15% de libre au niveau de DATAC1 et 85% au niveau de RECOC1.
On va donc récupérer la moitié de l’espace du DISKGROUP RECOC1 (à noter que c’est de l’espace RAW ==> brut)
Vérifier les failure group :
SQL> select dg.name, d.failgroup, d.state, d.header_status, d.mount_status, d.mode_status, count(1) num_disks from v$asm_disk d, v$asm_diskgroup dg where d.group_number = dg.group_number and dg.name IN ('RECOC1', 'DATAC1') group by dg.name, d.failgroup, d.state, d.header_status, d.mount_status, d.mode_status order by 1,2,3; NAME FAILGROUP STATE HEADER_STATU MOUNT_S MODE_ST NUM_DISKS ------------------------------ ------------------------------ -------- ------------ ------- ------- ---------- DATAC1 EXACELL01 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL02 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL03 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL04 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL05 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL06 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL07 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL08 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL09 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL10 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL11 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL12 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL13 NORMAL MEMBER CACHED ONLINE 12 DATAC1 EXACELL14 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL01 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL02 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL03 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL04 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL05 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL06 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL07 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL08 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL09 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL10 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL11 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL12 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL13 NORMAL MEMBER CACHED ONLINE 12 RECOC1 EXACELL14 NORMAL MEMBER CACHED ONLINE 12
Dans ce cas, on a un EXADATA FULL RACK avec 14 cellules de stockage (à noter pour le calcul), chaque cellule contenant 12 disques (veiller à ce que le status de chaque disque soit online, sinon ne pas continuer l’opération !!)
La requête suivante vous montrera le mapping exact des disques :
SQL> select dg.name, d.failgroup, d.path from v$asm_disk d, v$asm_diskgroup dg where d.group_number = dg.group_number and dg.name IN ('RECOC1', 'DATAC1') order by 1,2,3 NAME FAILGROUP PATH ---------- ------------------------------ -------------------------------------------------- DATAC1 EXACELL01 o/192.168.74.43/DATAC1_CD_00_EXACELL01 DATAC1 EXACELL01 o/192.168.74.43/DATAC1_CD_01_EXACELL01 DATAC1 EXACELL01 o/192.168.74.43/DATAC1_CD_02_EXACELL01 DATAC1 EXACELL01 o/192.168.74.43/DATAC1_CD_03_EXACELL01 DATAC1 EXACELL01 o/192.168.74.43/DATAC1_CD_04_EXACELL01 DATAC1 EXACELL01 o/192.168.74.43/DATAC1_CD_05_EXACELL01 DATAC1 EXACELL01 o/192.168.74.43/DATAC1_CD_06_EXACELL01 DATAC1 EXACELL01 o/192.168.74.43/DATAC1_CD_07_EXACELL01 DATAC1 EXACELL01 o/192.168.74.43/DATAC1_CD_08_EXACELL01 DATAC1 EXACELL01 o/192.168.74.43/DATAC1_CD_09_EXACELL01 DATAC1 EXACELL01 o/192.168.74.43/DATAC1_CD_10_EXACELL01 DATAC1 EXACELL01 o/192.168.74.43/DATAC1_CD_11_EXACELL01 DATAC1 EXACELL02 o/192.168.74.44/DATAC1_CD_00_EXACELL02 DATAC1 EXACELL02 o/192.168.74.44/DATAC1_CD_01_EXACELL02 DATAC1 EXACELL02 o/192.168.74.44/DATAC1_CD_02_EXACELL02 ... RECOC1 EXACELL13 o/192.168.74.55/RECOC1_CD_07_EXACELL13 RECOC1 EXACELL13 o/192.168.74.55/RECOC1_CD_08_EXACELL13 RECOC1 EXACELL13 o/192.168.74.55/RECOC1_CD_09_EXACELL13 RECOC1 EXACELL13 o/192.168.74.55/RECOC1_CD_10_EXACELL13 RECOC1 EXACELL13 o/192.168.74.55/RECOC1_CD_11_EXACELL13 RECOC1 EXACELL14 o/192.168.74.56/RECOC1_CD_00_EXACELL14 RECOC1 EXACELL14 o/192.168.74.56/RECOC1_CD_01_EXACELL14 RECOC1 EXACELL14 o/192.168.74.56/RECOC1_CD_02_EXACELL14 RECOC1 EXACELL14 o/192.168.74.56/RECOC1_CD_03_EXACELL14 RECOC1 EXACELL14 o/192.168.74.56/RECOC1_CD_04_EXACELL14 RECOC1 EXACELL14 o/192.168.74.56/RECOC1_CD_05_EXACELL14 RECOC1 EXACELL14 o/192.168.74.56/RECOC1_CD_06_EXACELL14 RECOC1 EXACELL14 o/192.168.74.56/RECOC1_CD_07_EXACELL14 RECOC1 EXACELL14 o/192.168.74.56/RECOC1_CD_08_EXACELL14 RECOC1 EXACELL14 o/192.168.74.56/RECOC1_CD_09_EXACELL14 RECOC1 EXACELL14 o/192.168.74.56/RECOC1_CD_10_EXACELL14 RECOC1 EXACELL14 o/192.168.74.56/RECOC1_CD_11_EXACELL14
Vérifier que vous n’avez plus d’espace au niveau de votre cellule et que vous êtes vraiment obligé de récupérer l’espace d’un autre DISKGROUP, sinon vous pouvez tout simplement augmenter la taille du DISKGROUP cible sans shrinker un autre (pas de récupération d’espace).
[root@exa01adm01 tmp]# dcli -g ~/cell_group -l root "cellcli -e list celldisk attributes name,freespace" EXACELL01: CD_00_EXACELL01 0 EXACELL01: CD_01_EXACELL01 0 EXACELL01: CD_02_EXACELL01 0 EXACELL01: CD_03_EXACELL01 0 EXACELL01: CD_04_EXACELL01 0 EXACELL01: CD_05_EXACELL01 0 EXACELL01: CD_06_EXACELL01 0 EXACELL01: CD_07_EXACELL01 0 EXACELL01: CD_08_EXACELL01 0 EXACELL01: CD_09_EXACELL01 0 EXACELL01: CD_10_EXACELL01 0 EXACELL01: CD_11_EXACELL01 0 ...
Donc pas d’espace libre ( indiqué par le 0).
Maintenant qu’on n’a pas le choix, on va calculer par griddisk la taille à récupérer.
On a décidé de récupérer la moitié d’espace au niveau du DISKGROUP RECOC1, donc on a :
94980480 / 2 = 47490240 MB
On sait que l’on a un total de 168 disques : 14 serveurs de cellule de stockage * 12 disques par cellule
14 * 12 = 168
Donc la nouvelle taille de chaque GRIDDISK est de :
47490240 / 168 = 282680 MB
Arrondir cette valeur au plus près multiple de 16MB (c’est ce que la cellule de stockage fera) :
select 16*TRUNC(&new_disk_size/16) new_disk_size from dual; NEW_DISK_SIZE ------------- 282672
Cela veut dire que la taille de chaque GRIDDISK pour le RECOC1 sera de 282672.
Après le redimensionnement de RECOC1, sa taille finale sera de 47488896 MB.
Calculer la taille finale des GRIDDISK du DISKGROUP DATAC1 :
SQL> select dg.name, d.total_mb, d.os_mb, count(1) num_disks from v$asm_diskgroup dg, v$asm_disk d where dg.group_number = d.group_number group by dg.name, d.total_mb, d.os_mb; NAME TOTAL_MB OS_MB NUM_DISKS ------------------------------ ---------- ---------- ---------- DATAC1 409600 409600 168 RECOC1 565360 565360 168
Espace récupéré = RECOC1 actuel – RECOC1 Final
= 565360 – 282672 = 282688 MB
DATAC Espace Final = DATAC1 actuel + Espace récupéré
= 409600 + 282688 = 692288 MB
Arrondir la taille de 16MB pour la cellule de stockage :
select 16*TRUNC(&new_disk_size/16) new_disk_size from dual; NEW_DISK_SIZE ------------- 692288
La capacité brute de notre DISKGROUP DATAC1 sera de :
12 Disques par cellule * 14 cellule de stockage * 692288 = 116304384 MB
Maintenant qu’on a fait notre calcul, passons à l’action.
2- Diminuer la taille du DISKGROUP à la taille souhaitée
alter diskgroup RECOC1 resize all size 282672M rebalance power 64;
Soyez patient et attendez la fin de l’opération, exécuter la requête suivante pour s’assurer que s’est terminé :
SQL> set lines 250 pages 1000 SQL> col error_code form a10 SQL> select dg.name, o.* from gv$asm_operation o, v$asm_diskgroup dg where o.group_number = dg.group_number;
Vous ne devez pas avoir de ligne pour le résultat.
Vérifier que la taille à bien changé :
SQL> select name, total_mb, free_mb, total_mb - free_mb used_mb, round(100*free_mb/total_mb,2) pct_free from v$asm_diskgroup order by 1; NAME TOTAL_MB FREE_MB USED_MB PCT_FREE ------------------------------ ---------- ---------- ---------- ---------- DATAC1 68812800 9985076 58827724 14.51 RECOC1 47488896 35103336 12385560 73.92 SQL> select dg.name, d.total_mb, d.os_mb, count(1) num_disks from v$asm_diskgroup dg, v$asm_disk d where dg.group_number = d.group_number group by dg.name, d.total_mb, d.os_mb; NAME TOTAL_MB OS_MB NUM_DISKS ------------------------------ ---------- ---------- ---------- DATAC1 409600 409600 168 RECOC1 282672 565360 168
Voilà, la taille de RECOC1 est de : 47488896 donc ça a bien changé.
3- Diminuer la taille des GRIDDISKS à la taille souhaitée
Maintenant que nos disques ASM ont bien été redimensionné, il faut également redimensionner les GRIDDISK :
dcli -c EXACELL01 -l root "cellcli -e alter griddisk RECOC1_CD_00_EXACELL01 \ ,RECOC1_CD_01_EXACELL01 \ ,RECOC1_CD_02_EXACELL01 \ ,RECOC1_CD_03_EXACELL01 \ ,RECOC1_CD_04_EXACELL01 \ ,RECOC1_CD_05_EXACELL01 \ ,RECOC1_CD_06_EXACELL01 \ ,RECOC1_CD_07_EXACELL01 \ ,RECOC1_CD_08_EXACELL01 \ ,RECOC1_CD_09_EXACELL01 \ ,RECOC1_CD_10_EXACELL01 \ ,RECOC1_CD_11_EXACELL01 \ size=282672M " dcli -c EXACELL02 -l root "cellcli -e alter griddisk RECOC1_CD_00_EXACELL02 \ ,RECOC1_CD_01_EXACELL02 \ ,RECOC1_CD_02_EXACELL02 \ ,RECOC1_CD_03_EXACELL02 \ ,RECOC1_CD_04_EXACELL02 \ ,RECOC1_CD_05_EXACELL02 \ ,RECOC1_CD_06_EXACELL02 \ ,RECOC1_CD_07_EXACELL02 \ ,RECOC1_CD_08_EXACELL02 \ ,RECOC1_CD_09_EXACELL02 \ ,RECOC1_CD_10_EXACELL02 \ ,RECOC1_CD_11_EXACELL02 \ size=282672M " ... dcli -c EXACELL14 -l root "cellcli -e alter griddisk RECOC1_CD_00_EXACELL14 \ ,RECOC1_CD_01_EXACELL14 \ ,RECOC1_CD_02_EXACELL14 \ ,RECOC1_CD_03_EXACELL14 \ ,RECOC1_CD_04_EXACELL14 \ ,RECOC1_CD_05_EXACELL14 \ ,RECOC1_CD_06_EXACELL14 \ ,RECOC1_CD_07_EXACELL14 \ ,RECOC1_CD_08_EXACELL14 \ ,RECOC1_CD_09_EXACELL14 \ ,RECOC1_CD_10_EXACELL14 \ ,RECOC1_CD_11_EXACELL14 \ size=282672M "
à noter qu’il faut le faire pour toutes les cellules de stockages (les 14).
Vérification :
[root@exa01adm01 tmp]# dcli -g cell_group -l root "cellcli -e list griddisk attributes name,size where name like \'RECOC1.*\' " EXACELL01: RECOC1_CD_00_EXACELL01 276.046875G EXACELL01: RECOC1_CD_01_EXACELL01 276.046875G EXACELL01: RECOC1_CD_02_EXACELL01 276.046875G EXACELL01: RECOC1_CD_03_EXACELL01 276.046875G EXACELL01: RECOC1_CD_04_EXACELL01 276.046875G EXACELL01: RECOC1_CD_05_EXACELL01 276.046875G EXACELL01: RECOC1_CD_06_EXACELL01 276.046875G EXACELL01: RECOC1_CD_07_EXACELL01 276.046875G EXACELL01: RECOC1_CD_08_EXACELL01 276.046875G EXACELL01: RECOC1_CD_09_EXACELL01 276.046875G EXACELL01: RECOC1_CD_10_EXACELL01 276.046875G EXACELL01: RECOC1_CD_11_EXACELL01 276.046875G ...
4- Augmenter la taille du GRIDDISK à la taille souhaitée
Vérification :
[root@exa01adm01 tmp]# dcli -g ~/cell_group -l root "cellcli -e list celldisk attributes name,freespace" EXACELL01: CD_00_EXACELL01 276.0625G EXACELL01: CD_01_EXACELL01 276.0625G EXACELL01: CD_02_EXACELL01 276.0625G EXACELL01: CD_03_EXACELL01 276.0625G EXACELL01: CD_04_EXACELL01 276.0625G EXACELL01: CD_05_EXACELL01 276.0625G EXACELL01: CD_06_EXACELL01 276.0625G EXACELL01: CD_07_EXACELL01 276.0625G EXACELL01: CD_08_EXACELL01 276.0625G EXACELL01: CD_09_EXACELL01 276.0625G EXACELL01: CD_10_EXACELL01 276.0625G EXACELL01: CD_11_EXACELL01 276.0625G ...
dcli -c EXACELL01 -l root "cellcli -e alter griddisk DATAC1_CD_00_EXACELL01 \ ,DATAC1_CD_01_EXACELL01 \ ,DATAC1_CD_02_EXACELL01 \ ,DATAC1_CD_03_EXACELL01 \ ,DATAC1_CD_04_EXACELL01 \ ,DATAC1_CD_05_EXACELL01 \ ,DATAC1_CD_06_EXACELL01 \ ,DATAC1_CD_07_EXACELL01 \ ,DATAC1_CD_08_EXACELL01 \ ,DATAC1_CD_09_EXACELL01 \ ,DATAC1_CD_10_EXACELL01 \ ,DATAC1_CD_11_EXACELL01 \ size=692288M " ... dcli -c EXACELL14 -l root "cellcli -e alter griddisk DATAC1_CD_00_EXACELL14 \ ,DATAC1_CD_01_EXACELL14 \ ,DATAC1_CD_02_EXACELL14 \ ,DATAC1_CD_03_EXACELL14 \ ,DATAC1_CD_04_EXACELL14 \ ,DATAC1_CD_05_EXACELL14 \ ,DATAC1_CD_06_EXACELL14 \ ,DATAC1_CD_07_EXACELL14 \ ,DATAC1_CD_08_EXACELL14 \ ,DATAC1_CD_09_EXACELL14 \ ,DATAC1_CD_10_EXACELL14 \ ,DATAC1_CD_11_EXACELL14 \ size=692288M "
Vérification après le redimensionnement :
dcli -g cell_group -l root "cellcli -e list griddisk attributes name,size where name like \'DATAC1.*\' " EXACELL01: DATAC1_CD_00_EXACELL01 676.0625G EXACELL01: DATAC1_CD_01_EXACELL01 676.0625G EXACELL01: DATAC1_CD_02_EXACELL01 676.0625G EXACELL01: DATAC1_CD_03_EXACELL01 676.0625G EXACELL01: DATAC1_CD_04_EXACELL01 676.0625G EXACELL01: DATAC1_CD_05_EXACELL01 676.0625G EXACELL01: DATAC1_CD_06_EXACELL01 676.0625G EXACELL01: DATAC1_CD_07_EXACELL01 676.0625G EXACELL01: DATAC1_CD_08_EXACELL01 676.0625G EXACELL01: DATAC1_CD_09_EXACELL01 676.0625G EXACELL01: DATAC1_CD_10_EXACELL01 676.0625G EXACELL01: DATAC1_CD_11_EXACELL01 676.0625G
5- Augmenter la taille du DISKGROUP à la taille souhaitée
SQL> alter diskgroup DATAC1 resize all ;
Attendez jusqu’à la fin de l’opération de rebalance :
SQL> set lines 250 pages 1000 SQL> col error_code form a10 SQL> select dg.name, o.* from gv$asm_operation o, v$asm_diskgroup dg where o.group_number = dg.group_number;
Vérifier la taille de vos DISKGROUP :
SQL> select name, total_mb, free_mb, total_mb - free_mb used_mb, round(100*free_mb/total_mb,2) pct_free from v$asm_diskgroup order by 1; NAME TOTAL_MB FREE_MB USED_MB PCT_FREE ------------------------------ ---------- ---------- ---------- ---------- DATAC1 116304384 57439796 58864588 49.39 RECOC1 47488896 34542516 12946380 72.74 SQL> select dg.name, d.total_mb, d.os_mb, count(1) num_disks from v$asm_diskgroup dg, v$asm_disk d where dg.group_number = d.group_number group by dg.name, d.total_mb, d.os_mb; NAME TOTAL_MB OS_MB NUM_DISKS ------------------------------ ---------- ---------- ---------- DATAC1 692288 692288 168 RECOC1 282672 282672 168
Et voilà, nous arrivons à la fin de notre article de blog, see you dans le prochain !