Este artigo simulará a recuperação de control file em um banco de dados com os arquivos multiplexados, além de preservar o seu local de origem. Em suma, ao menos 1 control file deve estar disponível e intacto para que possamos fazer o procedimento.
Reconhecendo o nosso laboratório:
[oracle@oel8 ~]$ sqlplus / as sysdba
SQL*Plus: Release 18.0.0.0.0 - Production on Tue Aug 17 19:57:30 2021
Version 18.13.0.0.0
Copyright (c) 1982, 2018, Oracle. All rights reserved.
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.13.0.0.0
SQL> SELECT NAME,OPEN_MODE,LOG_MODE FROM V$DATABASE;
NAME OPEN_MODE LOG_MODE
--------- -------------------- ------------
RMANDB READ WRITE ARCHIVELOG
SQL> SHO PARAMETER CONTROL_FILES;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_files string /oracle/dados/RMANDB/controlfi
le/o1_mf_h8nytrhd_.ctl, /oracl
e/fra/RMANDB/controlfile/o1_mf
_h8nytrty_.ctl
Para simular a perda, faremos a remoção do arquivo conforme abaixo, preservando ainda 1 control file:
SQL> !rm /oracle/dados/RMANDB/controlfile/o1_mf_h8nytrhd_.ctl
SQL>
Depois de pouco tempo, o Alert.log já reporta o problema:
2021-08-17T20:02:53.169969-03:00
Errors in file /oracle/18.0.0/base/diag/rdbms/rmandb/RMANDB/trace/RMANDB_mz00_3395.trc:
ORA-00202: control file: '/oracle/dados/RMANDB/controlfile/o1_mf_h8nytrhd_.ctl'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
Em certas ocasiões, a instância pode abortar ou pode continuar funcionando. Em meu caso, ao tentar rodar alguns comandos, o erro já é reportado:
SQL> SELECT NAME FROM V$DATABASE;
SELECT NAME FROM V$DATABASE
*
ERROR at line 1:
ORA-00210: cannot open the specified control file
ORA-00202: control file: '/oracle/dados/RMANDB/controlfile/o1_mf_h8nytrhd_.ctl'
ORA-27041: unable to open file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
Para iniciar o processo de recuperação, abortamos a instância, pois não é possível realizar um shutdown limpo se um control file está indisponível:
SQL> SHU ABORT;
ORACLE instance shut down.
SQL>
Agora basta copiarmos um control file intacto para o arquivo perdido:
SQL> !cp /oracle/fra/RMANDB/controlfile/o1_mf_h8nytrty_.ctl /oracle/dados/RMANDB/controlfile/o1_mf_h8nytrhd_.ctl
SQL> !ls -lthr /oracle/dados/RMANDB/controlfile/o1_mf_h8nytrhd_.ctl
-rw-r-----. 1 oracle oinstall 12M Aug 17 20:23 /oracle/dados/RMANDB/controlfile/o1_mf_h8nytrhd_.ctl
Agora é só subir o banco de dados:
SQL> STARTUP;
ORACLE instance started.
Total System Global Area 1610612016 bytes
Fixed Size 8658224 bytes
Variable Size 520093696 bytes
Database Buffers 1073741824 bytes
Redo Buffers 8118272 bytes
Database mounted.
Database opened.
SQL> SELECT NAME FROM V$DATABASE;
NAME
---------
RMANDB
Obs: Este procedimento foi criado pelo senhor Ahmed Baraka (www.ahmedbaraka.com) e foi apenas reproduzido por mim em um laboratório pessoal para fins de aprendizado.