Dende a versión 11g, a posibilidade de descargar os backups RMAN nunha BD standby física (non aplica en standby lóxica) é completa, podendo facer copia do controlfile para recuperar calquera rol Data Guard (primaria ou standby). Podemos polo tanto facer copias da BD nunha standby sen preocuparnos de cómo xerar, de ser preciso, un controlfile CURRENT nun escenario de disaster recovery de producción, xa que Oracle xestionará de xeito automático e transparente a conversión de rol que sexa preciso (aplica tamén a unha standby a partires dun controlfile current). Como requisito, precisamos configurar correctamente as BDs primaria e standby no catálogo RMAN, importante para unha correcta execución dos backups e escenarios de recuperación nesta configuración. Esta funcionalidade de intercambio de roles de controlfile entre primaria e standby aparece documentada dende a versión 11.1 de base de datos. Nesta documentación indícase, que os metadatos almacenados no catálogo RMAN permiten facer un seguimento correcto de tódolos nomes dos ficheiros das BDs que compoñen a configuración Data Guard, sendo posible o intercambio de datafiles e controlfiles.
Recentemente, facendo unha validación de restore cruzado nun cliente, atopei con que aparentemente esta premisa non se cumpría, e a restauración do controlfile mantiña o controlfile da BD como standby. Tras diferentes probas e consulta de información e notas Metalink, atopamos que o problema estaba a ser o bug 18455956, que en realidade só se presenta nun escenario no que a restauración do controlfile é executado sen conexión ó catálogo RMAN, que era xusto a proba que queriamos validar para facer unha apertura con resetlogs sen con elo impactar ó resto da configuración de Data Guard rexistrada no mesmo catálogo, evitando engadir unha nova encarnación “falsa” derivada desta proba. O obxectivo era derivar todas as tarefas de backup a unha BD standby, pero este problema fíxome plantexar a necesidade de ter que facer backups do controlfile primario (axudado, todo sexa dito, por un erro na documentación de certificación Data Guard de Oracle University onde se indicaba que os controlfiles non son intercambiables entre primary e standby).
Para verificar as posibilidades reais, creamos unha BD single instance nun servidor, e unha standby física noutro. Para simplificar as cousas, as dúas máquinas son en realidade un clúster con Grid Infrastructure, que comparten acceso a un filesystem ACFS montado en /acfs/desdata. A BD primaria ten por nome alberto e a standby bertodg (nomenclatura de Sergio a quen debo agradecer que montase este contorno nun tempo récord coa súa maxia usando gdbClone!). Antes de facer as probas de restauración, executamos en bertodg (standby) simplemente o comando backup database que fixo un backup á FRA configurada no mesmo filesystem. Polo tanto é un escenario sinxelo onde os backups das BDs están dispoñibles nos dous contornos sen necesidade de copiar datos previamente ou telos que recatalogar antes de restaurar.
Restauración de BD primaria con copia de standby con conexión a catálogo RMAN
Conectados á BD alberto e ó catálogo, nesta proba o script RMAN restaura explicitamente o controfile do backup feito previamente na BD bertodg. Pese a ser un standby controlfile, e sen especificar nada no comando RMAN, este é restaurado de xeito automático como un current controlfile válido para unha BD primaria.
[oracle@nodo1 ~]$ rman target / catalog=usrcat/xxxxxx@rman RMAN> run { shutdown immediate; startup nomount; restore controlfile from '/acfs/desdata/bertodg/BERTODG/backupset/2017_09_29/o1_mf_ncsnf_TAG20170929T120630_dww6sbyk_.bkp'; alter database mount; restore database; recover database noredo; alter database open resetlogs; }2> 3> 4> 5> 6> 7> 8> 9> 10> database closed database dismounted Oracle instance shut down connected to target database (not started) Oracle instance started Total System Global Area 4275781632 bytes Fixed Size 2260088 bytes Variable Size 2449474440 bytes Database Buffers 1811939328 bytes Redo Buffers 12107776 bytes Starting restore at 29/09/2017 12:54:12 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=212 device type=DISK channel ORA_DISK_1: restoring control file channel ORA_DISK_1: restore complete, elapsed time: 00:00:01 output file name=/acfs/desdata/alberto/control01.ctl Finished restore at 29/09/2017 12:54:13 database mounted released channel: ORA_DISK_1 Starting restore at 29/09/2017 12:54:17 Starting implicit crosscheck backup at 29/09/2017 12:54:17 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=212 device type=DISK Crosschecked 1 objects Finished implicit crosscheck backup at 29/09/2017 12:54:18 Starting implicit crosscheck copy at 29/09/2017 12:54:18 using channel ORA_DISK_1 Crosschecked 2 objects Finished implicit crosscheck copy at 29/09/2017 12:54:18 searching for all files in the recovery area cataloging files... cataloging done List of Cataloged Files ======================= File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_28/o1_mf_1_34_06sfjc3k_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_28/o1_mf_1_1_dwsnj7rf_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_28/o1_mf_1_2_dwsnjx2d_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_28/o1_mf_1_3_dwsnlrhm_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_28/o1_mf_1_4_dwsnlvhy_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_28/o1_mf_1_5_dwt92r23_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_28/o1_mf_1_6_dwt92wjf_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_28/o1_mf_1_7_dwtrr0tq_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_29/o1_mf_1_8_dwvggf46_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_29/o1_mf_1_1_dww55lnk_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_29/o1_mf_1_2_dww55q9x_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_29/o1_mf_1_3_dww5rdbj_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_29/o1_mf_1_4_dww7z6wb_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_29/o1_mf_1_1_dww7z75j_.arc File Name: /acfs/desdata/alberto/ALBERTO/archivelog/2017_09_29/o1_mf_1_2_dww7zbnc_.arc using channel ORA_DISK_1 channel ORA_DISK_1: restoring datafile 00001 input datafile copy RECID=11 STAMP=955976061 file name=/acfs/desdata/.ACFS/snaps/bertodg/BERTODG/datafile/o1_mf_system_03sfjd9o_.dbf destination for restore of datafile 00001: /acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_system_02sfjc33_.dbf channel ORA_DISK_1: copied datafile copy of datafile 00001 output file name=/acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_system_02sfjc33_.dbf RECID=15 STAMP=955976062 channel ORA_DISK_1: restoring datafile 00002 input datafile copy RECID=12 STAMP=955976061 file name=/acfs/desdata/.ACFS/snaps/bertodg/BERTODG/datafile/o1_mf_sysaux_04sfjd9o_.dbf destination for restore of datafile 00002: /acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_sysaux_03sfjc33_.dbf channel ORA_DISK_1: copied datafile copy of datafile 00002 output file name=/acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_sysaux_03sfjc33_.dbf RECID=16 STAMP=955976065 channel ORA_DISK_1: restoring datafile 00003 input datafile copy RECID=13 STAMP=955976061 file name=/acfs/desdata/.ACFS/snaps/bertodg/BERTODG/datafile/o1_mf_undotbs1_05sfjd9o_.dbf destination for restore of datafile 00003: /acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_undotbs1_04sfjc33_.dbf channel ORA_DISK_1: copied datafile copy of datafile 00003 output file name=/acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_undotbs1_04sfjc33_.dbf RECID=17 STAMP=955976068 channel ORA_DISK_1: restoring datafile 00004 input datafile copy RECID=14 STAMP=955976061 file name=/acfs/desdata/.ACFS/snaps/bertodg/BERTODG/datafile/o1_mf_users_06sfjd9r_.dbf destination for restore of datafile 00004: /acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_users_05sfjc3i_.dbf channel ORA_DISK_1: copied datafile copy of datafile 00004 output file name=/acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_users_05sfjc3i_.dbf RECID=18 STAMP=955976068 datafile 1 switched to datafile copy input datafile copy RECID=19 STAMP=955976069 file name=/acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_system_02sfjc33_.dbf datafile 2 switched to datafile copy input datafile copy RECID=20 STAMP=955976069 file name=/acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_sysaux_03sfjc33_.dbf datafile 3 switched to datafile copy input datafile copy RECID=21 STAMP=955976069 file name=/acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_undotbs1_04sfjc33_.dbf datafile 4 switched to datafile copy input datafile copy RECID=22 STAMP=955976069 file name=/acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_users_05sfjc3i_.dbf Finished restore at 29/09/2017 12:54:29 Starting recover at 29/09/2017 12:54:30 using channel ORA_DISK_1 renamed tempfile 1 to /acfs/desdata/.ACFS/snaps/alberto/ALBERTO/datafile/o1_mf_temp_dwsmc1kp_.tmp in control file Finished recover at 29/09/2017 12:54:31 database opened new incarnation of database registered in recovery catalog starting full resync of recovery catalog full resync complete starting full resync of recovery catalog full resync complete
Restauración de BD primaria con copia de standby sen conexión a catálogo RMAN
Repetimos a proba anterior, pero esta vez sen conectar a catálogo RMAN. Funcionan a restauración e a recuperación, pero non é posible abrir a BD porque o controlfile non foi convertido durante o proceso e segue marcado como standby.
[oracle@nodo1 ~]$ rman target / Recovery Manager: Release 11.2.0.4.0 - Production on Sun Oct 1 15:57:04 2017 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. connected to target database: ALBERTO (DBID=2724215542) RMAN> run { shutdown immediate; startup nomount; restore controlfile from '/acfs/desdata/bertodg/BERTODG/backupset/2017_09_29/o1_mf_ncsnf_TAG20170929T120630_dww6sbyk_.bkp'; alter database mount; restore database; recover database noredo; alter database open resetlogs; }2> 3> 4> 5> 6> 7> 8> 9> 10> using target database control file instead of recovery catalog database closed database dismounted Oracle instance shut down connected to target database (not started) Oracle instance started Total System Global Area 4275781632 bytes Fixed Size 2260088 bytes Variable Size 2449474440 bytes Database Buffers 1811939328 bytes Redo Buffers 12107776 bytes Starting restore at 01/10/2017 15:57:24 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=212 device type=DISK channel ORA_DISK_1: restoring control file channel ORA_DISK_1: restore complete, elapsed time: 00:00:01 output file name=/acfs/desdata/alberto/control01.ctl Finished restore at 01/10/2017 15:57:25 database mounted released channel: ORA_DISK_1 Starting restore at 01/10/2017 15:57:30 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=212 device type=DISK skipping datafile 1; already restored to file /acfs/desdata/.ACFS/snaps/bertodg/BERTODG/datafile/o1_mf_system_03sfjd9o_.dbf skipping datafile 2; already restored to file /acfs/desdata/.ACFS/snaps/bertodg/BERTODG/datafile/o1_mf_sysaux_04sfjd9o_.dbf skipping datafile 3; already restored to file /acfs/desdata/.ACFS/snaps/bertodg/BERTODG/datafile/o1_mf_undotbs1_05sfjd9o_.dbf skipping datafile 4; already restored to file /acfs/desdata/.ACFS/snaps/bertodg/BERTODG/datafile/o1_mf_users_06sfjd9r_.dbf restore not done; all files read only, offline, or already restored Finished restore at 01/10/2017 15:57:31 Starting recover at 01/10/2017 15:57:31 using channel ORA_DISK_1 Finished recover at 01/10/2017 15:57:32 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of alter db command at 10/01/2017 15:57:33 ORA-01666: control file is for a standby database
Verificamos que o controlfile non foi transformado en CURRENT durante a operación de RESTORE CONTROLFILE.
SQL> select controlfile_type from v$database; CONTROL ------- STANDBY
Bug 18455856
Parece lóxico que ó non contar co catálogo non sexa posible tomar a decisión de converter un controlfile a un tipo diferente do momento no que se fixo backup, xa que Oracle non ten a referencia do rol que desempeña a BD que restauramos dentro da configuración Data Guard. De feito, o comando RESTORE CONTROLFILE pode ser empregado, xa dende 11gR1, en 3 posibles variantes:
- RESTORE CONTROLFILE. O controlfile é restaurado na BD á que estamos conectado e o seu tipo será determinado en función do rol asignado á BD no catálogo RMAN ó que estamos conectados. A BD sobre a que estamos traballando manterá o mesmo rol que tiña rexistrada no catálogo antes de iniciar a recuperación.
- RESTORE PRIMARY CONTROLFILE. Con este comando forzamos que o controlfile que restauramos, sexa un backup dunha primary ou dunha standby, sexa configurado como BACKUP para o seu uso como BD primaria.
- RESTORE STANDBY CONTROLFILE. O controlfile restaurado será configurado como STANDBY independentemente do rol que tivese a BD dende a que foi feito o backup.
Deste xeito, temos a opción de restaurar un controlfile de maneira automática en función do rol se conectamos a un repositorio RMAN, e temos a opción de facer unha conversión específica en caso de que vaiamos a cambiar o rol da BD ou que non poidamos determinalo de xeito automático ó non conectar a un catálogo. Se consultamos a nota Step by Step method to create Primary/Standby Database from Standby Backup (Doc ID 1604251.1), vemos que, como consecuencia da correción do bug 7553431, aparece un novo bug, o 18455956. Sen o correspondente parche aplicado, o comando RESTORE PRIMARY CONTROLFILE non fai a conversión precisa se non estamos empregando un catálogo RMAN cando recuperamos unha copia feita nunha standby. Se conectamos a catálogo RMAN (workaround proposto no bug), desaparece o problema.
No noso escenario, comprobamos que o parche 18455956 non está instalado, cun nivel de PSU de abril de 2017.
[oracle@nodo1 ~]$ $ORACLE_HOME/OPatch/opatch lsinventory | grep "Patch Set Update" Patch description: "Database Patch Set Update : 11.2.0.4.170418 (24732075)" Sub-patch 24006111; "Database Patch Set Update : 11.2.0.4.161018 (24006111)" Sub-patch 23054359; "Database Patch Set Update : 11.2.0.4.160719 (23054359)" Sub-patch 22502456; "Database Patch Set Update : 11.2.0.4.160419 (22502456)" Sub-patch 21948347; "Database Patch Set Update : 11.2.0.4.160119 (21948347)" Sub-patch 21352635; "Database Patch Set Update : 11.2.0.4.8 (21352635)" Sub-patch 20760982; "Database Patch Set Update : 11.2.0.4.7 (20760982)" Sub-patch 20299013; "Database Patch Set Update : 11.2.0.4.6 (20299013)" Sub-patch 19769489; "Database Patch Set Update : 11.2.0.4.5 (19769489)" Sub-patch 19121551; "Database Patch Set Update : 11.2.0.4.4 (19121551)" Sub-patch 18522509; "Database Patch Set Update : 11.2.0.4.3 (18522509)" Sub-patch 18031668; "Database Patch Set Update : 11.2.0.4.2 (18031668)" Sub-patch 17478514; "Database Patch Set Update : 11.2.0.4.1 (17478514)" [oracle@nodo1 ~]$ $ORACLE_HOME/OPatch/opatch lsinventory | grep 18455956 [oracle@nodo1 ~]$
Ó ser así, podemos verificar que a restauración falla cando non empregamos catálogo, incluso especificando a opción PRIMARY, como podemos ver na seguinte proba:
[oracle@nodo1 ~]$ rman target / Recovery Manager: Release 11.2.0.4.0 - Production on Sun Oct 1 15:58:16 2017 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. connected to target database: ALBERTO (DBID=2724215542) RMAN> run { shutdown immediate; startup nomount; restore primary controlfile from '/acfs/desdata/bertodg/BERTODG/backupset/2017_09_29/o1_mf_ncsnf_TAG20170929T120630_dww6sbyk_.bkp'; alter database mount; restore database; recover database noredo; alter database open resetlogs; }2> 3> 4> 5> 6> 7> 8> 9> 10> database dismounted Oracle instance shut down connected to target database (not started) Oracle instance started Total System Global Area 4275781632 bytes Fixed Size 2260088 bytes Variable Size 2449474440 bytes Database Buffers 1811939328 bytes Redo Buffers 12107776 bytes Starting restore at 01/10/2017 15:58:17 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=212 device type=DISK channel ORA_DISK_1: restoring control file channel ORA_DISK_1: restore complete, elapsed time: 00:00:01 output file name=/acfs/desdata/alberto/control01.ctl Finished restore at 01/10/2017 15:58:19 database mounted released channel: ORA_DISK_1 Starting restore at 01/10/2017 15:58:23 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=212 device type=DISK skipping datafile 1; already restored to file /acfs/desdata/.ACFS/snaps/bertodg/BERTODG/datafile/o1_mf_system_03sfjd9o_.dbf skipping datafile 2; already restored to file /acfs/desdata/.ACFS/snaps/bertodg/BERTODG/datafile/o1_mf_sysaux_04sfjd9o_.dbf skipping datafile 3; already restored to file /acfs/desdata/.ACFS/snaps/bertodg/BERTODG/datafile/o1_mf_undotbs1_05sfjd9o_.dbf skipping datafile 4; already restored to file /acfs/desdata/.ACFS/snaps/bertodg/BERTODG/datafile/o1_mf_users_06sfjd9r_.dbf restore not done; all files read only, offline, or already restored Finished restore at 01/10/2017 15:58:24 Starting recover at 01/10/2017 15:58:24 using channel ORA_DISK_1 Finished recover at 01/10/2017 15:58:25 RMAN-00571: =========================================================== RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS =============== RMAN-00571: =========================================================== RMAN-03002: failure of alter db command at 10/01/2017 15:58:25 ORA-01666: control file is for a standby database
Alternativas sen uso de catálogo
Agora que coñecemos tanto o problema como o seu alcance, podemos empregar diferentes alternativas como solución. A primeira pasa por recrear o controlfile dende a propia BD standby para a recuperación da BD primaria.
Pode resultar interesante saber que neste punto unha apertura en modo read only da BD funcionará e polo tanto teremos acceso ós datos.
SQL> alter database open read only; Database altered.
Outra solución pasa pola apertura da BD recuperada, que será unha standby, como unha BD primaria, forzando un failover da mesma. Previamente para evitar erros eliminamos os standby logs e tamén deshabilitamos a flashback database, para evitar erros na apertura no intento de habilitar flashback database.
SQL> select * from v$logfile; GROUP# STATUS TYPE MEMBER IS_ ---------- ------- ------- -------------------------------------------------------------------------------- --- 3 ONLINE /acfs/desdata/bertodg/BERTODG/onlinelog/o1_mf_3_dwsnjzp0_.log NO 2 ONLINE /acfs/desdata/bertodg/BERTODG/onlinelog/o1_mf_2_dwsnjzkj_.log NO 1 ONLINE /acfs/desdata/bertodg/BERTODG/onlinelog/o1_mf_1_dwsnjzdr_.log NO 4 STANDBY /acfs/desdata/bertodg/BERTODG/onlinelog/o1_mf_4_dww5rdg9_.log NO 5 STANDBY /acfs/desdata/bertodg/BERTODG/onlinelog/o1_mf_5_dww5rdgy_.log NO 6 STANDBY /acfs/desdata/bertodg/BERTODG/onlinelog/o1_mf_6_dww5rdg2_.log NO SQL> alter database clear logfile group 4; Database altered. SQL> alter database clear logfile group 5; Database altered. SQL> alter database clear logfile group 6; Database altered. SQL> alter database open; alter database open * ERROR at line 1: ORA-38760: This database instance failed to turn on flashback database SQL> alter database flashback off; Database altered. SQL> alter database open; Database altered. SQL> alter database flashback on; Database altered. SQL> select controlfile_type from v$database; CONTROL ------- CURRENT
Resumo
Debemos empregar catálogo RMAN sempre para facer copias nun contorno Data Guard. Pese a elo, hai escenarios, como unha proba de restauración para validar os procedementos internos de backup, nas que nos pode interesar evitar o uso do catálogo para non interferir na configuración real de copias. En casos como este, debemos ser conscientes se estamos na versión 11.2.0.4 (non afecta a 11.2.0.3 ou anteriores) da existencia do bug 18455856 polo que teremos que optar, ben pola aplicación do correspondente parche, ben pola procedimentación do escenario tendo en conta a limitación na conversión a primary controlfile cando non nos conectamos ó catálogo RMAN.
Créditos
Ilustración: Alicia Constela