Multiplexado ControlFile
Una buena práctica en nuestras bases de datos es tener multiplexado el ControlFile para evitar futuros desastres.
Como pequeña reseña, un ControlFile es un fichero binario, imprescindible en una base de datos, ya que una pérdida del mismo sería un desastre para nosotros. Contiene la estructura física de una base de datos incluyendo el nombre de la base de datos, localización y nombres de los datafiles\redologs, timestamp, información del checkpoint o current log sequence number por ejemplo.
Lo primero que vamos hacer es conectarnos a nuestra base de datos y ver el estado en el que se encuentra
SQL> Select Name, Open_Mode, Instance_Name From v$database, v$instance;
NAME OPEN_MODE INSTANCE_NAME
--------- -------------------- ----------------
XXX READ WRITE XXXXXX
Revisamos el path de nuestro ControlFile
SQL> column name format a60
SQL> select name from v$controlfile;
NAME
------------------------------------------------------------
+RECO/XXXXXX/CONTROLFILE/current.403.1157710073
Bien, hasta aquí todo correcto. Ahora tenemos que revisar los discos, a ver si tenemos posibilidad de poder realizar dicha tarea. Para poder consultar los discos, podemos hacerlo desde consola o consultando la vista V$ASM_DISKGROUP. Cualquiera de las dos opciones es válida, en mi caso he ido directamente a la consola
ASMCMD> lsdg
State Type Rebal Sector Logical_Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name
MOUNTED EXTERN N 512 512 4096 4194304 12582912 5348936 0 5348936 0 Y DATA/
MOUNTED EXTERN N 512 512 4096 4194304 4194304 4165756 0 4165756 0 N RECO/
Pues como podemos observar tenemos dos discos DATA and RECO. Vamos a modificar el parámetro control_files, paramos y abrimos en nomount
SQL> alter system set control_files='+RECO/XXXXXXX/CONTROLFILE/current.403.1157710073','+DATA' scope=spfile ;
System altered.
SQL> shu immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup nomount ;
ORACLE instance started.
Total System Global Area 3.2749E+10 bytes
Fixed Size 13902432 bytes
Variable Size 4294967296 bytes
Database Buffers 2.8253E+10 bytes
Redo Buffers 187420672 bytes
En este punto, lo que tenemos ahora es otro path para el controlfile, pero ese control file aún no esta multiplexado, ese paso lo tenemos que realizar desde rman
RMAN> restore controlfile from '+RECO/XXXX/CONTROLFILE/current.403.1157710073';
Starting restore at 08-JAN-24
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=467 device type=DISK
channel ORA_DISK_1: copied control file copy
output file name=+RECO/XXXXX/CONTROLFILE/current.413.1157731007
output file name=+DATA/XXXXX/CONTROLFILE/current.1070.1157731007
Finished restore at 08-JAN-24
Podemos ver que se ha restaurado una copia del fichero de control existente a una nueva localización, que en nuestro caso es '+DATA+
Volvemos a sqlplus y ejecutamos el cambio del parámetro
SQL> alter system set control_files='+RECO/XXXXX/CONTROLFILE/current.413.1157731007','+DATA/XXXXX/CONTROLFILE/current.1070.1157731007' scope=spfile ;
System altered.
SQL> shu immediate
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.
Total System Global Area 3.2749E+10 bytes
Fixed Size 13902432 bytes
Variable Size 4294967296 bytes
Database Buffers 2.8253E+10 bytes
Redo Buffers 187420672 bytes
Database mounted.
Database opened.
Si consultamos ahora la vista V$CONTROLFILE podemos ver que nuestro Controlfile se ha multiplexado con éxito.
SQL> column name format a60
SQL> Select Name From v$controlfile;
NAME
------------------------------------------------------------
+RECO/XXXXX/CONTROLFILE/current.413.1157731007
+DATA/XXXXX/CONTROLFILE/current.1070.1157731007
Espero que os sirva.