Redimensionner un DISKGROUP sur EXADATA

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 !