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 "============================================================"

Écrire un commentaire

Optionnel