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