Fala galera, espero que todos estejam bem! Recentemente visando refazer alguns laboratórios de backup e restore, documentei um procedimento passo a passo para a recuperação de um diskgroup por completo. Espero que o material possa ser util para alguns DBAs que gostariam de revisar esse procedimento.
Situação atual
Possuo um diskgroup DATA e um diskgroup de FRA. Ambos funcionando normalmente.
select GROUP_NUMBER, NAME,TOTAL_MB, FREE_MB, USABLE_FILE_MB from v$ASM_DISKGROUP;SQL> 2 3GROUP_NAME SECTOR_SIZE BLOCK_SIZE ALLOCATION_UNIT_SIZE STATE TYPE TOTAL_MB FREE_MB USED_MB PCT_USED------------------------------ ----------- ---------- -------------------- -------- ------- ---------- ------- ------- --------DATA 512 4096 4194304 MOUNTED EXTERN 76776 54212 22564 29.39FRA 512 4096 4194304 MOUNTED EXTERN 51188 25048 26140 51.07SQL> SQL> SQL> SQL>GROUP_NUMBER NAME TOTAL_MB FREE_MB USABLE_FILE_MB------------ ------------------------------ ----------- ---------- -------------- 1 DATA 76776 54212 54212 2 FRA 51188 25048 25048
Nesse exemplo, vou realizar uma simulação de perda do diskgroup DATA, vou desmontar e simplesmente dropar tudo que eu tenho nele mas em uma situação real isso poderia significar alguma deleção de disco do SO, algo relacionado a isso.
SQL> ALTER DISKGROUP DATA DISMOUNT FORCE;Diskgroup altered.SQL> drop diskgroup DATA including contents;Diskgroup dropped.
Após isso, não tenho mais o diskgroup de dados e o meu banco já vai estar 100% fora do ar
[grid@ol8-grid ~]$ asmcmdASMCMD> lsFRA/ASMCMD>
Início da Recuperação
1. Setar o DBID e subir o banco em NOMOUNT
No caso desse laboratório, foi necessário setar o DBID do banco manualmente. Para encontrar ele é bem simples, por default o arquivo de autobackup que o Oracle cria já possui o DBID, normalmente o diretório do autobackup do controlfile é configurado no próprio RMAN:
CONFIGURE CONTROLFILE AUTOBACKUP ON;CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '+FRA/%F';
O arquivo estaria com uma numeração parecida com essa:
c-1234567890-20260402-00
Nesse caso, o DBID do banco seria “1234567890”
RMAN> set dbid=1234567890
Agora basta startar o banco como NOMOUNT
RMAN> startup nomount;
2. Restaurar o controlfile
Nessa parte você já consegue restaurar o controlfile através do próprio autobackup
RMAN> RESTORE CONTROLFILE FROM AUTOBACKUP;
Você também pode especificar diretamente o arquivo do backup de controlfile
RMAN> RESTORE CONTROLFILE FROM '+FRA/CDBPROD/CONTROLFILE/controlfile_path';Starting restore at 02-APR-26using channel ORA_DISK_1channel ORA_DISK_1: copied control file copyoutput file name=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/cntrlcdbprod.dbfFinished restore at 02-APR-26RMAN>
Pro caso do autobackup não estar ativado no seu ambiente (o que não considero uma boa prática) você provavelmente vai ter um problema na hora de setar o DBID e seguir com o processo, é possível que nessa etapa do controlfile você receba o erro:
ORA-01103: database name 'CDBPROD' in control file is not 'DUMMY’
Para essa situação da pra fazer o seguinte:
Validar o db_name do banco (que estará em NOMOUNT)
SQL> SHOW PARAMETER db_name;NAME TYPE VALUE------------------------------------ ----------- ------------------------------db_name string DUMMYSQL>
Confirmarmos que o problema é esse, agora uma alternativa seria subir o banco com um init alternativo com o db_name correto
$ vi /tmp/initcdb.oradb_name=CDBPRODdb_block_size=8192compatible=19.0.0
STARTUP NOMOUNT PFILE='/tmp/initcdb.ora';
Restaurar o controlfile novamente
RMAN> RESTORE CONTROLFILE FROM '+FRA/CDBPROD/CONTROLFILE/Current.256.1209584243';Starting restore at 02-APR-26using target database control file instead of recovery catalogallocated channel: ORA_DISK_1channel ORA_DISK_1: SID=435 device type=DISKchannel ORA_DISK_1: copied control file copyoutput file name=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/cntrlcdbprod.dbfFinished restore at 02-APR-26RMAN>
Agora que o Controlfile foi restaurado, você pode reiniciar a instancia em MOUNT novamente subindo o SPFILE original
3. Restore do diskgroup
Para recriar o diskgroup DATA basta usar o comando abaixo
RUN { SET NEWNAME FOR DATABASE TO '+DATA'; RESTORE DATABASE; SWITCH DATAFILE ALL;}
Esse comando irá mandar todos os datafiles para o novo diskgroup DATA
4. Reabrir o banco
RMAN> recover database;Starting recover at 02-APR-26using channel ORA_DISK_1applied offline range to datafile 00009offline range RECID=45 STAMP=1229524994applied offline range to datafile 00010offline range RECID=44 STAMP=1229524994applied offline range to datafile 00011offline range RECID=43 STAMP=1229524994applied offline range to datafile 00012offline range RECID=42 STAMP=1229524994starting media recoveryarchived log for thread 1 with sequence 51 is already on disk as file +FRA/CDBPROD/ARCHIVELOG/2026_04_02/thread_1_seq_51.262.1229524933archived log for thread 1 with sequence 52 is already on disk as file +FRA/CDBPROD/ARCHIVELOG/2026_04_02/thread_1_seq_52.261.1229524931archived log file name=+FRA/CDBPROD/ARCHIVELOG/2026_04_02/thread_1_seq_51.262.1229524933 thread=1 sequence=51archived log file name=+FRA/CDBPROD/ARCHIVELOG/2026_04_02/thread_1_seq_52.261.1229524931 thread=1 sequence=52media recovery complete, elapsed time: 00:00:03Finished recover at 02-APR-26RMAN>RMAN> ALTER DATABASE OPENouRMAN> ALTER DATABASE OPEN RESETLOGS;
Dessa forma o meu diskgroup DATA estará de volta e o meu banco de produção estará operacional novamente
SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB READ WRITE NOSQL> select open_mode from v$database;OPEN_MODE--------------------READ WRITESQL>SQL> SET LINE 200SELECT name group_name, sector_size sector_size, block_size block_size, allocation_unit_size allocation_unit_size, state state, type type, total_mb total_mb, free_mb free_mb, (total_mb - free_mb) used_mb, ROUND((1- (free_mb / total_mb))*100, 2) pct_usedFROM v$asm_diskgroup ORDER BY name/select GROUP_NUMBER, NAME,TOTAL_MB, FREE_MB, USABLE_FILE_MB from V$ASM_DISKGROUP;SQL> 2 3GROUP_NAME SECTOR_SIZE BLOCK_SIZE ALLOCATION_UNIT_SIZE STATE TYPE TOTAL_MB FREE_MB USED_MB PCT_USED------------------------------ ----------- ---------- -------------------- ----------- ------ ---------- ---------- ---------- ----------DATA 512 4096 4194304 CONNECTED EXTERN 76776 43392 33384 43.48FRA 512 4096 4194304 CONNECTED EXTERN 51188 25048 26140 51.07SQL> SQL> SQL> SQL>GROUP_NUMBER NAME TOTAL_MB FREE_MB USABLE_FILE_MB------------ ------------------------------ ---------- ---------- -------------- 2 FRA 51188 25048 25048 1 DATA 76776 43392 43392SQL>