$title =

Recuperação do Oracle após falha no Diskgroup

;

$conteúdo = [

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 3
GROUP_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.39
FRA 512 4096 4194304 MOUNTED EXTERN 51188 25048 26140 51.07
SQL> 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 ~]$ asmcmd
ASMCMD> ls
FRA/
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-26
using channel ORA_DISK_1
channel ORA_DISK_1: copied control file copy
output file name=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/cntrlcdbprod.dbf
Finished restore at 02-APR-26
RMAN>

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 DUMMY
SQL>

Confirmarmos que o problema é esse, agora uma alternativa seria subir o banco com um init alternativo com o db_name correto

$ vi /tmp/initcdb.ora
db_name=CDBPROD
db_block_size=8192
compatible=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-26
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=435 device type=DISK
channel ORA_DISK_1: copied control file copy
output file name=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/cntrlcdbprod.dbf
Finished restore at 02-APR-26
RMAN>

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-26
using channel ORA_DISK_1
applied offline range to datafile 00009
offline range RECID=45 STAMP=1229524994
applied offline range to datafile 00010
offline range RECID=44 STAMP=1229524994
applied offline range to datafile 00011
offline range RECID=43 STAMP=1229524994
applied offline range to datafile 00012
offline range RECID=42 STAMP=1229524994
starting media recovery
archived log for thread 1 with sequence 51 is already on disk as file +FRA/CDBPROD/ARCHIVELOG/2026_04_02/thread_1_seq_51.262.1229524933
archived log for thread 1 with sequence 52 is already on disk as file +FRA/CDBPROD/ARCHIVELOG/2026_04_02/thread_1_seq_52.261.1229524931
archived log file name=+FRA/CDBPROD/ARCHIVELOG/2026_04_02/thread_1_seq_51.262.1229524933 thread=1 sequence=51
archived log file name=+FRA/CDBPROD/ARCHIVELOG/2026_04_02/thread_1_seq_52.261.1229524931 thread=1 sequence=52
media recovery complete, elapsed time: 00:00:03
Finished recover at 02-APR-26
RMAN>
RMAN> ALTER DATABASE OPEN
ou
RMAN> 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 NO
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ WRITE
SQL>
SQL> SET LINE 200
SELECT 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_used
FROM v$asm_diskgroup ORDER BY name
/
select GROUP_NUMBER, NAME,TOTAL_MB, FREE_MB, USABLE_FILE_MB from V$ASM_DISKGROUP;SQL> 2 3
GROUP_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.48
FRA 512 4096 4194304 CONNECTED EXTERN 51188 25048 26140 51.07
SQL> SQL> SQL> SQL>
GROUP_NUMBER NAME TOTAL_MB FREE_MB USABLE_FILE_MB
------------ ------------------------------ ---------- ---------- --------------
2 FRA 51188 25048 25048
1 DATA 76776 43392 43392
SQL>

];

$namorado(a) =

;

$category =

;

$author =

;