Multiplexado ControlFile

·

3 min read

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.