Ok

En poursuivant votre navigation sur ce site, vous acceptez l'utilisation de cookies. Ces derniers assurent le bon fonctionnement de nos services. En savoir plus.

  • [ORACLE] ASM

    clean_asm_disks.sh

    #!/bin/bash

    # =================================================================

    # clean_asm_disks.sh → À exécuter en oracle AVANT tout delete Azure

    # Auteur : toi + moi

    # Objectif : garantir à 100 % que tu peux supprimer un disque sans crasher la base

    # =================================================================

     

    export ORACLE_SID=+ASM1 # ou +ASM2 sur l'autre nœud RAC

    export ORAENV_ASK=NO

    . oraenv > /dev/null 2>&1

     

    echo "================================================================="

    echo "VÉRIFICATION DE SÉCURITÉ ASM - $(date)"

    echo "Instance : ( ORACLE_SID - Host : )(hostname)"

    echo "================================================================="

     

    sqlplus -S / as sysasm <<EOF

     

    SET PAGESIZE 200 LINESIZE 200

    COL dg_name FORMAT A12

    COL disk_path FORMAT A50

    COL header_status FORMAT A12

    COL mount_status FORMAT A12

    COL mode_status FORMAT A12

    COL state FORMAT A10

    COL failgroup FORMAT A20

     

    PROMPT 

    PROMPT 1. État des diskgroups

    SELECT name, state, type FROM v$asm_diskgroup;

     

    PROMPT 

    PROMPT 2. Opérations de rebalance en cours ou en erreur

    SELECT group_number, operation, state, power, est_minutes FROM v$asm_operation;

    SELECT * FROM gv$asm_operation WHERE state!='DONE';

     

    PROMPT 

    PROMPT 3. Disques à risque (FORMER mais rebalance pas fini, ou MISSING)

    SELECT group_number,

           name,

           path disk_path,

           header_status,

           mount_status,

           mode_status,

           state,

           failgroup

    FROM v$asm_disk

    WHERE header_status IN ('FORMER','MISSING')

       OR (header_status='MEMBER' AND mode_status!='ONLINE')

    ORDER BY header_status, group_number;

     

    PROMPT 

    PROMPT 4. Disques vraiment supprimables en toute sécurité (rebalance 100% terminé)

    PROMPT → HEADER_STATUS = CANDIDATE ou PROVISIONED uniquement

    SELECT 'SUPPRIMABLE EN TOUTE SÉCURITÉ' statut,

           path disk_path,

           header_status,

           failgroup

    FROM v$asm_disk

    WHERE header_status IN ('CANDIDATE','PROVISIONED')

    UNION ALL

    SELECT 'ATTENTION - encore dans le diskgroup' statut,

           path, header_status, failgroup

    FROM v$asm_disk

    WHERE header_status = 'FORMER';

     

    PROMPT 

    PROMPT ================================================================

    PROMPT RÈGLE D’OR :

    PROMPT Seuls les disques en CANDIDATE ou PROVISIONED peuvent être

    PROMPT détachés/supprimés dans Azure sans aucun risque.

    PROMPT Si tu vois du FORMER → attends la fin du rebalance ou force le DROP DISK

    PROMPT ================================================================

    EOF

     

    echo

    echo "Fin du check : $(date)"

    echo "Tu peux supprimer dans Azure UNIQUEMENT les disques marqués SUPPRIMABLE EN TOUTE SÉCURITÉ"

    echo

     

    safe_clean_asm_disks.sh

    #!/bin/bash

    # ================================================================

    # safe_clean_asm_disks.sh → Version AUTO (nettoyage intelligent)

    # Exécuter en user oracle sur un nœud où +ASM est vivant

    # ================================================================

     

    export ORACLE_SID=+ASM1 # change en +ASM2 si tu es sur le nœud 2

    export ORAENV_ASK=NO

    . oraenv > /dev/null 2>&1

     

    LOG=/tmp/safe_clean_asm_$(date +%Y%m%d_%H%M%S).log

    exec > $LOG 2>&1

     

    echo "============================================================"

    echo "SAFE CLEAN ASM DISKS - Démarrage $(date)"

    echo "Instance : ( ORACLE_SID - Host : )(hostname)"

    echo "============================================================"

     

    # 1. Vérification préalable

    sqlplus -S / as sysasm <<EOF

    SET PAGESIZE 0 FEEDBACK OFF HEADING OFF

    SELECT COUNT(*) FROM v$asm_operation WHERE state IN ('RUN','WAIT');

    EXIT

    EOF

    REBAL_IN_PROGRESS=$(sqlplus -S / as sysasm <<EOF

    SET PAGESIZE 0 FEEDBACK OFF HEADING OFF

    SELECT COUNT(*) FROM v$asm_operation WHERE state IN ('RUN','WAIT');

    EXIT

    EOF

    )

     

    if [ "$REBAL_IN_PROGRESS" -gt 0 ]; then

        echo "ERREUR : Un rebalance est encore en cours !"

        echo " → Attends qu'il soit terminé avant de relancer ce script."

        exit 1

    fi

     

    # 2. Liste des disques FORMER (ceux qu’on peut nettoyer proprement)

    FORMER_DISKS=$(sqlplus -S / as sysasm <<EOF

    SET PAGESIZE 0 FEEDBACK OFF HEADING OFF

    SELECT name

    FROM v$asm_disk

    WHERE header_status = 'FORMER';

    EXIT

    EOF

    )

     

    if [ -z "$FORMER_DISKS" ]; then

        echo "Aucun disque en statut FORMER → Rien à nettoyer dans ASM."

        echo "Tu peux supprimer directement dans Azure les disques CANDIDATE/PROVISIONED si tu veux."

        echo "Fin du script."

        exit 0

    fi

     

    echo "Disques en statut FORMER détectés (on va les DROP proprement) :"

    echo "$FORMER_DISKS"

     

    # 3. DROP automatique par diskgroup avec rebalance en parallèle

    echo

    echo "Lancement du DROP DISK + rebalance (power 8 pour aller vite)..."

     

    sqlplus -S / as sysasm <<EOF

    WHENEVER SQLERROR EXIT FAILURE

    SET FEEDBACK ON ECHO ON

     

    -- On regroupe par diskgroup pour faire un seul ALTER par DG

    SELECT 'ALTER DISKGROUP ' || dg.name || ' DROP DISK ' ||

           LISTAGG(d.name, ',') WITHIN GROUP (ORDER BY d.name) || 

           ' REBALANCE POWER 8;'

    FROM v$asm_disk d

    JOIN v$asm_diskgroup dg ON d.group_number = dg.group_number

    WHERE d.header_status = 'FORMER'

    GROUP BY dg.name;

     

    -- Exécution réelle

    DECLARE

      v_sql VARCHAR2(4000);

    BEGIN

      FOR rec IN (

        SELECT dg.name dg_name,

               LISTAGG(d.name, ''',''') WITHIN GROUP (ORDER BY d.name) disk_list

        FROM v$asm_disk d

        JOIN v$asm_diskgroup dg ON d.group_number = dg.group_number

        WHERE d.header_status = 'FORMER'

        GROUP BY dg.name

      ) LOOP

        v_sql := 'ALTER DISKGROUP ' || rec.dg_name || 

                 ' DROP DISK ''' || rec.disk_list || ''' REBALANCE POWER 8';

        EXECUTE IMMEDIATE v_sql;

        DBMS_OUTPUT.PUT_LINE('Exécuté : ' || v_sql);

      END LOOP;

    END;

    /

     

    SET FEEDBACK OFF

    PROMPT

    PROMPT Nettoyage terminé.

    PROMPT Les disques viennent de passer en CANDIDATE/PROVISIONED.

    PROMPT Tu peux maintenant les détacher/supprimer dans Azure en toute sécurité.

    PROMPT

    EOF

     

    echo

    echo "============================================================"

    echo "Tout est propre dans ASM !"

    echo "Tu peux maintenant supprimer les disques dans Azure sans aucun risque."

    echo "Log complet : $LOG"

    echo "============================================================"