ORACLE E MAA (Maximum Availability Architecture) – Parte II
FAILOVER MANUAL
No artigo anterior demonstrei como configurar um DG para que você possa ter MAA no seu ambiente. Foram apresentados os passos para criar um DG entre um banco primary ORACLE RAC e standby também em ORACLE RAC. Até o momento o ambiente não está 100%, ainda não configuramos o DG para utilizar o broker e nem fast-start failover, tudo será manual.
A função básica do DG é proteger quanto a possíveis falhas inesperadas em nosso banco primary. Existem vários tipos de falhas que podem deixar indisponível um banco de dados: hardware, software, estagiário, DBA Senior; inúmeras.
Quando trabalhamos com o Oracle em RAC as falhas que podem deixar o seu ambiente indisponível por completo reduzem, no caso de uma falha de um único nó o outro assume a carga e o banco continua disponível ao usuário. Mas ele não protege para falhas mais complexas. Se o seu storage falhar? Ou se a sua rede apresentar problema e o seu RAC cair?
É nesses cenários que o DG pode ajudar, ele irá proteger seu banco Oracle contra possíveis falhas do seu ambiente primary. Com MAA você teria tudo replicado no outro ambiente e em um ambiente RAC você estará protegido contra falhas de ambos os nós.
SEGUNDO ARTIGO
Neste artigo vamos dar sequência ao anterior e simular um failover no ambiente. Neste artigo você verá os passos e o que fazer para realizar o failover do primary para o seu standby, tudo isso de forma manual.
AMBIENTE
Para recordar, temos um ambiente DG configurado com RAC conforme passos que vimos neste artigo. O DG está operando em MAXIMUM AVAILABILITY e com real-time-apply. Ainda não temos broker configurado e todos os passos necessitam de intervenção manual para a troca de papeis, incluindo a restauração do ambiente.
Para exemplificar a garantias que um DG nos dá, vamos criar uma tabela de controle para verificar se os dados estão salvos. Observe o momento que a tabela foi criada e que recebeu inserts de ambas as instâncias do RAC:
Instância MAA1
SQL> SELECT instance_name FROM v$instance;
INSTANCE_NAME
----------------
maa1
SQL> CREATE TABLE testedg(c1 DECIMAL(3,0), c2 DATE);
Table created.
SQL> INSERT INTO testedg VALUES(1, SYSDATE);
1 row created.
SQL> commit;
Commit complete.
SQL>
Instância MAA2
SQL> SELECT instance_name FROM v$instance;
INSTANCE_NAME
----------------
maa2
SQL> INSERT INTO testedg VALUES(2, SYSDATE);
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT c1, TO_CHAR(c2, 'DD/MM HH24:MI:SS') as momento FROM testedg;
C1 MOMENTO
---------- --------------
1 13/04 07:00:04
2 13/04 07:01:11
SQL>
FAILOVER
Aqui simularemos uma falha não planejada do primary, o banco de dados ficará indisponível e será chaveado para o banco standby com failover. Mas o que é failover? De forma bem resumida, o failover ocorre quando existe indisponibilidade completa do primary. Isso impede o banco primary de “ser avisado” da troca de papeis.
Antes de pensarmos em fazer o failover ou switchover precisamos saber se ele é necessário ou se podemos fazer sem perder dados. O primeiro ponto a ser avaliado em qualquer ambiente DG é se tanto primary e standby estão sincronizados, se eles não estiverem você provavelmente perderá dados.
Vamos partir do princípio que se você está configurando um ambiente DG é devido a importância do seu banco de dados. Se você está montando um ambiente MAA com DG+RAC a criticidade da informação que você gerencia é muito maior, você quer garantias. Além disso, a disponibilidade necessária para o ambiente está intimamente ligada a importância dos seus dados. Então, você monta um ambiente DG com RAC e não deixa primary e standby sincronizados? Você monta e prepara um standby que não suporta a carga do seu primary em caso de falha?
Primeiro, se o seu ambiente está sincronizado, faça o failover. Caso o seu ambiente não esteja sincronizado nem continue, você VAI perder dados. Se o seu ambiente não está ok, revise ele e o deixe tudo sincronizado, você vai ter noites mais tranquilas e as surpresas serão menores.
Criando a falha
Para iniciar vamos simular uma falha do ambiente, uma falha catastrófica como a perda do storage que derrubou ambas as instâncias do primary. Aqui, o que está nos redo não foi para os archives (como os dados da nossa tabela de teste por exemplo). Como exemplo, um simples abort já dá conta (lembre do RAC – ambos os nós tem que morrer):
[oracle@rac11pri01 ~]$ srvctl stop database -d maa -o abort
[oracle@rac11pri01 ~]$
O standby percebeu a falha no standby de forma imediata. Observe no alertlog da standby que está abaixo os horários de recebimento do último archivelog e do momento da falha do primary (faça uma relação com o que está na nossa tabela de controle que criamos previamente):
Sun Apr 13 05:57:45 2014
Media Recovery Waiting for thread 1 sequence 77 (in transit)
Recovery of Online Redo Log: Thread 1 Group 5 Seq 77 Reading mem 0
Mem# 0: +DG01/maastb/onlinelog/group_5.271.844716073
Mem# 1: +FRA/maastb/onlinelog/group_5.553.844716075
Sun Apr 13 07:20:08 2014
RFS[4]: Possible network disconnect with primary database
Sun Apr 13 07:20:08 2014
RFS[2]: Possible network disconnect with primary database
Sun Apr 13 07:20:08 2014
RFS[6]: Possible network disconnect with primary database
Sun Apr 13 07:20:08 2014
RFS[10]: Assigned to RFS process 2470
RFS[10]: Possible network disconnect with primary database
Sun Apr 13 07:20:08 2014
RFS[5]: Possible network disconnect with primary database
Sun Apr 13 07:20:08 2014
RFS[9]: Possible network disconnect with primary database
Sun Apr 13 07:20:09 2014
RFS[7]: Possible network disconnect with primary database
Sun Apr 13 07:20:09 2014
RFS[8]: Possible network disconnect with primary database
Com o alertlog observamos que o último archive foi recebido as 05:57:45 e a falha do primary foi detectada pelo standby as 07:20:09. Também identificamos que o standby detectou a falha mas não fez nada ainda. Não estamos com o broker para ele chavear automaticamente, e caso você consiga reativar seu ambiente primary tudo volta ao normal.
Verificando o Standby
Então, no meio da tarde você percebe que o seu RAC primary parou e o standby está esperando você se decidir o que fazer. A primeira coisa que você faz é ver seu standby pode chavear e se tornar primary. Conecte no standby e verifique o modo em que ele está operando
SQL> SELECT protection_mode, protection_level, database_role FROM v$database;
PROTECTION_MODE PROTECTION_LEVEL DATABASE_ROLE
-------------------- -------------------- ----------------
MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY PHYSICAL STANDBY
SQL> SELECT instance_name FROM gv$instance;
INSTANCE_NAME
----------------
maastb1
maastb2
SQL>
Com isso, você sabe que tem duas instâncias e um banco sincronizado com o primary e que está atuando como PHYSICAL STANDBY. Isso é bom e nos permite continuar com o failover. Se o seu protection_level não está igual ao protection_mode, você tem problemas e não está com primary e standby sincronizados.
Trocando os papeis
Como o primary morreu, o próximo passo que precisamos é parar a sincronização do standby. Como estamos em um failover alguns comandos devem “forçar” paradas ou configurações, precisamos forçar a parada na sincronia entre o primary e standby. Basicamente você conecta no standby e desliga a sincronia:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
Database altered.
SQL>
No alert da instancia:
Sun Apr 13 08:02:42 2014
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL
Sun Apr 13 08:02:42 2014
MRP0: Background Media Recovery cancelled with status 16037
Errors in file /u01/app/oracle/diag/rdbms/maastb/maastb1/trace/maastb1_pr00_2398.trc:
ORA-16037: user requested cancel of managed recovery operation
Sun Apr 13 08:02:42 2014
Managed Standby Recovery not using Real Time Apply
Recovery interrupted!
Recovered data files to a consistent state at change 2596057
Sun Apr 13 08:02:42 2014
MRP0: Background Media Recovery process shutdown (maastb1)
Managed Standby Recovery Canceled (maastb1)
Completed: ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL
Observe no alertlog que está acima o aviso de parada da sincronização, inclusive do real-time-apply. O próximo passo é marcar o fim da aplicação de qualquer redo, este comando “marca” e aplica no banco do standby todo e qualquer redo pendente recebido do primary:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
Database altered.
SQL>
No alertlog:
Observe o "enf-of-redo" marcado por failover.
Sun Apr 13 08:07:40 2014
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH
Attempt to do a Terminal Recovery (maastb1)
Media Recovery Start: Managed Standby Recovery (maastb1)
started logmerger process
Sun Apr 13 08:07:40 2014
Managed Standby Recovery not using Real Time Apply
Parallel Media Recovery started with 2 slaves
Sun Apr 13 08:07:42 2014
Begin: Standby Redo Logfile archival
End: Standby Redo Logfile archival
Terminal Recovery timestamp is '04/13/2014 08:07:42'
Terminal Recovery: applying standby redo logs.
Terminal Recovery: thread 1 seq# 77 redo required
Terminal Recovery:
Recovery of Online Redo Log: Thread 1 Group 5 Seq 77 Reading mem 0
Mem# 0: +DG01/maastb/onlinelog/group_5.271.844716073
Mem# 1: +FRA/maastb/onlinelog/group_5.553.844716075
Identified End-Of-Redo (failover) for thread 1 sequence 77 at SCN 0xffff.ffffffff
Terminal Recovery: thread 2 seq# 54 redo required
Terminal Recovery:
Recovery of Online Redo Log: Thread 2 Group 8 Seq 54 Reading mem 0
Mem# 0: +DG01/maastb/onlinelog/group_8.261.844716089
Mem# 1: +FRA/maastb/onlinelog/group_8.611.844716093
Identified End-Of-Redo (failover) for thread 2 sequence 54 at SCN 0xffff.ffffffff
Incomplete Recovery applied until change 2596059 time 04/13/2014 13:23:14
Media Recovery Complete (maastb1)
Terminal Recovery: successful completion
Sun Apr 13 08:07:44 2014
ARC0: Archiving not possible: error count exceeded
Sun Apr 13 08:07:44 2014
ARC1: Archiving not possible: error count exceeded
ARCH: Archival stopped, error occurred. Will continue retrying
ORACLE Instance maastb1 - Archival Error
ORA-16014: log 5 sequence# 77 not archived, no available destinations
ORA-00312: online log 5 thread 1: '+DG01/maastb/onlinelog/group_5.271.844716073'
ORA-00312: online log 5 thread 1: '+FRA/maastb/onlinelog/group_5.553.844716075'
Forcing ARSCN to IRSCN for TR 0:2596059
Attempt to set limbo arscn 0:2596059 irscn 0:2596059
Resetting standby activation ID 722049028 (0x2b099804)
Completed: ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH
Se você observar com detalhe o que ocorreu no alertlog acima irá notar que foi marcado um “End-Of-Redo” devido a failover nas duas threads recebidas do primary. O End-Of-Redo” marca o momento (SCN) que ocorreu a interrupção na aplicação dos redo’s recebidos da primary, tudo o que ocorrer após este SCN não terá vindo da primary. Ignore os erros de arquivamento listados no alertlog (ele não está conseguindo enviar archives e explicarei porque mais abaixo).
O próximo passo é efetivamente a troca de papeis, o standby passará a ser o primary. Primeiro você pode garantir/verificar se o standby está pronto para o ser primary:
SQL> SELECT switchover_status FROM v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
SQL>
Caso o comando acima retorne que existem sessões você pode forçar o kill destas. Recomenda-se que somente de prosseguimento caso apareça TO PRIMARY. Não de sequência caso o comando acima retorne outro valor.
Para trocar os papeis e fazer o standby assumir como primary execute:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
Database altered.
SQL>
No alert:
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN
ALTER DATABASE SWITCHOVER TO PRIMARY (maastb1)
Maximum wait for role transition is 15 minutes.
Backup controlfile written to trace file /u01/app/oracle/diag/rdbms/maastb/maastb1/trace/maastb1_ora_31327.trc
Standby terminal recovery start SCN: 2596057
RESETLOGS after incomplete recovery UNTIL CHANGE 2596059
Online log +DG01/maastb/onlinelog/group_1.257.844716051: Thread 1 Group 1 was previously cleared
Online log +FRA/maastb/onlinelog/group_1.568.844716053: Thread 1 Group 1 was previously cleared
Online log +DG01/maastb/onlinelog/group_2.268.844716057: Thread 1 Group 2 was previously cleared
Online log +FRA/maastb/onlinelog/group_2.564.844716059: Thread 1 Group 2 was previously cleared
Online log +DG01/maastb/onlinelog/group_3.269.844716063: Thread 2 Group 3 was previously cleared
Online log +FRA/maastb/onlinelog/group_3.562.844716065: Thread 2 Group 3 was previously cleared
Online log +DG01/maastb/onlinelog/group_4.270.844716067: Thread 2 Group 4 was previously cleared
Online log +FRA/maastb/onlinelog/group_4.559.844716071: Thread 2 Group 4 was previously cleared
Standby became primary SCN: 2596056
Sun Apr 13 08:20:09 2014
Setting recovery target incarnation to 2
Switchover: Complete - Database mounted as primary
Completed: ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN
O que tudo isso nos diz (comando e alertlog)? No comando você informou para ele passar a ser o banco primary (SWITCHOVER TO PRIMARY) e qualquer sessão existente será desconectada (SESSION SHUTDOWN). No alertlog temos a informação do SCN aplicado e que os redog do standby foram reiniciados, e para os esotéricos temos uma nova encarnação. Por fim, seu banco foi montado como primary.
Tudo muito bem até agora e pronto para abrir o banco:
SQL> ALTER DATABASE OPEN;
Database altered.
SQL>
No alert:
Observe os erros de TNS para os archives que apontam para a antiga primary
Sun Apr 13 08:25:05 2014
ALTER DATABASE OPEN
This instance was first to open
Picked broadcast on commit scheme to generate SCNs
Sun Apr 13 08:25:06 2014
Assigning activation ID 723258431 (0x2b1c0c3f)
Destination LOG_ARCHIVE_DEST_2 is UNSYNCHRONIZED
Destination LOG_ARCHIVE_DEST_2 no longer supports SYNCHRONIZATION
Thread 1 advanced to log sequence 2 (thread open)
Thread 1 opened at log sequence 2
Current log# 2 seq# 2 mem# 0: +DG01/maastb/onlinelog/group_2.268.844716057
Current log# 2 seq# 2 mem# 1: +FRA/maastb/onlinelog/group_2.564.844716059
Successful open of redo thread 1
MTTR advisory is disabled because FAST_START_MTTR_TARGET is not set
Sun Apr 13 08:25:07 2014
SMON: enabling cache recovery
Sun Apr 13 08:25:07 2014
Archived Log entry 46 added for thread 1 sequence 1 ID 0x2b1c0c3f dest 1:
Sun Apr 13 08:25:07 2014
...
...
...
***********************************************************************
Fatal NI connect error 12514, connecting to:
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac11pri-scan.tjsc.jus.br)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=maa)(CID=(PROGRAM=oracle)(HOST=rac11stb01.tjsc.jus.br)(USER=oracle))))
VERSION INFORMATION:
TNS for Linux: Version 11.2.0.3.0 - Production
TCP/IP NT Protocol Adapter for Linux: Version 11.2.0.3.0 - Production
Time: 13-APR-2014 08:25:07
Tracing not turned on.
Tns error struct:
ns main err code: 12564
TNS-12564: TNS:connection refused
ns secondary err code: 0
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0
Error 12514 received logging on to the standby
PING[ARC2]: Heartbeat failed to connect to standby 'maa'. Error is 12514.
[31327] Successfully onlined Undo Tablespace 2.
Undo initialization finished serial:0 start:1288905924 end:1288907124 diff:1200 (12 seconds)
Dictionary check beginning
Sun Apr 13 08:25:10 2014
Errors in file /u01/app/oracle/diag/rdbms/maastb/maastb1/trace/maastb1_dbw0_2288.trc:
ORA-01186: file 201 failed verification tests
ORA-01157: cannot identify/lock data file 201 - see DBWR trace file
ORA-01110: data file 201: '+DG01'
File 201 not verified due to error ORA-01157
Dictionary check complete
Verifying file header compatibility for 11g tablespace encryption..
Sun Apr 13 08:25:10 2014
minact-scn: Inst 1 is now the master inc#:4 mmon proc-id:2303 status:0x7
Verifying 11g file header compatibility for tablespace encryption completedminact-scn status: grec-scn:0x0000.00000000 gmin-scn:0x0000.00000000 gcalc-scn:0x0000.00000000
minact-scn: Master returning as live inst:2 has inc# mismatch instinc:0 cur:4 errcnt:0SMON: enabling tx recovery
Re-creating tempfile +DG01 as +DG01/maastb/tempfile/temp.276.844784711
Database Characterset is WE8MSWIN1252
No Resource Manager plan active
Starting background process GTX0
Sun Apr 13 08:25:14 2014
GTX0 started with pid=39, OS id=32334
Starting background process RCBG
Sun Apr 13 08:25:14 2014
RCBG started with pid=40, OS id=32336
replication_dependency_tracking turned off (no async multimaster replication found)
Starting background process QMNC
Sun Apr 13 08:25:15 2014
QMNC started with pid=41, OS id=32338
LOGSTDBY: Validating controlfile with logical metadata
LOGSTDBY: Validation complete
Sun Apr 13 08:25:16 2014
Completed: ALTER DATABASE OPEN
Peço que observe com calma o alertlog acima, ele nos dá algumas informações interessantes. Primeiro nos diz que o banco está abrindo e que o destino LOG_ARCHIVE_DEST_2 não está sincronizado. Lembram do artigo anterior em que já deixamos tudo pronto para uma eventual troca de papeis? Então, o novo primary está tentando se comunicar com o seu standby (que era o antigo primary) mas não está conseguindo (se você ver logo abaixo tem uma falha de TNS). Mais para baixo ele vai detectar que não tem a tablespace TEMP, ela foi criada e o banco aberto.
Caso queira investigar a falha do LOG_ARCHIVE_DEST_2 basta executar o comando abaixo:
SQL> COL dest_name FORMAT a20
SQL> COL error FORMAT a20
SQL> COL destination FORMAT a10
SQL> SELECT inst_id, dest_name, destination, status, error FROM gv$archive_dest_status WHERE status != 'INACTIVE';
INST_ID DEST_NAME DESTINATIO STATUS ERROR
---------- -------------------- ---------- --------- --------------------
2 LOG_ARCHIVE_DEST_1 VALID
2 LOG_ARCHIVE_DEST_2 maa VALID
1 LOG_ARCHIVE_DEST_1 VALID
1 LOG_ARCHIVE_DEST_2 maa ERROR ORA-12514:
TNS:listener does
not currently know
of service requested
in connect
descriptor
SQL>
Enquanto o antigo primary não volta nós podemos desligar o envio de dados do novo primary para o seu standby. Isso evita um monte de lixo no alertlog:
SQL> ALTER SYSTEM SET log_archive_dest_state_2 = 'DEFER' SCOPE = BOTH SID = '*';
System altered.
SQL>
Ajustando o novo primary
Um detalhe interessante, o Oracle automaticamente após um failover reduz o modo de proteção do seu banco. Assim, ele passa a operar em MAXIMUM PERFORMANCE. Você pode corrigir isso como o seguinte comando:
SQL> SELECT protection_mode, protection_level FROM v$database;
PROTECTION_MODE PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
SQL> ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;
Database altered.
SQL> SELECT protection_mode, protection_level FROM v$database;
PROTECTION_MODE PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM AVAILABILITY RESYNCHRONIZATION
SQL>
Vamos verificar se tudo foi replicado com sucesso e não perdemos qualquer informação? Na prática você vai fazer diversas validações nos seus dados para garantir isso, aqui vamos usar a nossa tabela de testes. Como você pode ver abaixo, tudo está lá:
SQL> SELECT c1, TO_CHAR(c2, 'DD/MM HH24:MI:SS') as momento FROM testedg;
C1 MOMENTO
---------- --------------
1 13/04 07:00:04
2 13/04 07:01:11
SQL>
CORRIGINDO CRS
Se você seguiu o artigo anterior irá notar que registramos no CRS que esta base é um standby e no caso de um restart do nó ele será aberto em modo mount. Como ocorreu a troca de papeis, precisamos corrigir o CRS. Iremos informar que ela é um banco primary e deve sempre iniciar em open (observe a lista de comandos):
[oracle@rac11stb01 ~]$ srvctl config database -d maastb -v
Database unique name: maastb
Database name:
Oracle home: /u01/app/oracle/product/11.2.0.3/db_1
Oracle user: oracle
Spfile:
Domain:
Start options: mount
Stop options: immediate
Database role: PHYSICAL_STANDBY
Management policy: AUTOMATIC
Server pools: maastb
Database instances: maastb1,maastb2
Disk Groups: DG01,FRA
Mount point paths:
Services:
Type: RAC
Database is administrator managed
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$ srvctl modify database -d maastb -s OPEN -r PRIMARY
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$ srvctl config database -d maastb -v
Database unique name: maastb
Database name:
Oracle home: /u01/app/oracle/product/11.2.0.3/db_1
Oracle user: oracle
Spfile:
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools: maastb
Database instances: maastb1,maastb2
Disk Groups: DG01,FRA
Mount point paths:
Services:
Type: RAC
Database is administrator managed
[oracle@rac11stb01 ~]$
Como você está em um ambiente RAC você deve abrir as outras instâncias:
SQL> SELECT instance_name, status FROM gv$instance;
INSTANCE_NAME STATUS
---------------- ------------
maastb1 OPEN
maastb2 MOUNTED
SQL> ALTER DATABASE OPEN;
Database altered.
SQL> SELECT instance_name FROM v$instance;
INSTANCE_NAME
----------------
maastb2
SQL>
BACKUP
Por fim, é imprescindível um backup do seu novo banco primary, será importante caso você precise criar ou recriar o seu standby (antigo primary). Um detalhe que pode poupar um pouco de tempo no futuro, eu não recomendaria fazer um backup e apagar os archive logs (DELETE ALL INPUT), lembre que o novo primary não sincronizou nada com o standby. Assim quando ele voltar ele irá precisar enviar os archives e caso eles não estejam disponível você irá precisar voltar backup. Até se você tentar deletar você receberá um warnig dizendo que eles são necessários.
Uma curiosidade, se você listar as suas cópias de archive irá ver que os últimos oriundos do antigo primary estão marcados como “TERMINAL”
RUN {
BACKUP FULL FORMAT '/tmp/bkpf-data-D-%d-DBID-%I-T-%T-NB-%s.bkp' DATABASE TAG 'BKP-FULL';
SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
BACKUP FORMAT '/tmp/bkpf-arch-D-%d-DBID-%I-T-%T-NB-%s.bkp' ARCHIVELOG ALL TAG 'BKP-FULL-ARCH';
BACKUP FORMAT '/tmp/bkp-spf-D-%d-DBID-%I-T-%T-NB-%s.bkp' SPFILE TAG 'BKP-FULL-SPFILE';
BACKUP FORMAT '/tmp/bkp-ctf-D-%d-DBID-%I-T-%T-NB-%s.bkp' CURRENT CONTROLFILE TAG 'BKP-FULL-CONTROL';
}
[oracle@rac11stb01 ~]$ rman target /
Recovery Manager: Release 11.2.0.3.0 - Production on Sun Apr 13 09:01:14 2014
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
connected to target database: MAA (DBID=722024964)
RMAN> RUN {
2> BACKUP FULL FORMAT '/tmp/bkpf-data-D-%d-DBID-%I-T-%T-NB-%s.bkp' DATABASE TAG 'BKP-FULL';
3> SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
4> BACKUP FORMAT '/tmp/bkpf-arch-D-%d-DBID-%I-T-%T-NB-%s.bkp' ARCHIVELOG ALL TAG 'BKP-FULL-ARCH';
5> BACKUP FORMAT '/tmp/bkp-spf-D-%d-DBID-%I-T-%T-NB-%s.bkp' SPFILE TAG 'BKP-FULL-SPFILE';
6> BACKUP FORMAT '/tmp/bkp-ctf-D-%d-DBID-%I-T-%T-NB-%s.bkp' CURRENT CONTROLFILE TAG 'BKP-FULL-CONTROL';
7> }
Starting backup at 13-APR-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=30 instance=maastb1 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
input datafile file number=00001 name=+DG01/maastb/datafile/system.275.844715965
input datafile file number=00002 name=+DG01/maastb/datafile/sysaux.264.844715965
input datafile file number=00003 name=+DG01/maastb/datafile/undotbs1.263.844715965
input datafile file number=00004 name=+DG01/maastb/datafile/undotbs2.262.844715965
input datafile file number=00005 name=+DG01/maastb/datafile/users.256.844715965
channel ORA_DISK_1: starting piece 1 at 13-APR-14
...
...
...
Starting backup at 13-APR-14
using channel ORA_DISK_1
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current control file in backup set
channel ORA_DISK_1: starting piece 1 at 13-APR-14
channel ORA_DISK_1: finished piece 1 at 13-APR-14
piece handle=/tmp/bkp-ctf-D-MAA-DBID-722024964-T-20140413-NB-29.bkp tag=BKP-FULL-CONTROL comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 13-APR-14
RMAN> LIST COPY OF ARCHIVELOG ALL;
List of Archived Log Copies for database with db_unique_name MAASTB
=====================================================================
Key Thrd Seq S Low Time
------- ---- ------- - ---------
7 1 56 A 12-APR-14
Name: +FRA/maastb/archivelog/2014_04_12/thread_1_seq_56.391.844718829
...
45 1 76 A 13-APR-14
Name: +FRA/maastb/archivelog/2014_04_13/thread_1_seq_76.389.844775859
47 1 77 A 13-APR-14
Name: +FRA/maastb/archivelog/2014_04_13/thread_1_seq_77.350.844784741 (TERMINAL)
4 2 33 A 12-APR-14
Name: +FRA/maastb/archivelog/2014_04_12/thread_2_seq_33.398.844717695
...
43 2 53 A 13-APR-14
Name: +FRA/maastb/archivelog/2014_04_12/thread_2_seq_53.381.844746645
48 2 54 A 13-APR-14
Name: +FRA/maastb/archivelog/2014_04_13/thread_2_seq_54.355.844784743 (TERMINAL)
...
53 2 3 A 13-APR-14
Name: +FRA/maastb/archivelog/2014_04_13/thread_2_seq_3.300.844786941
RMAN>
AMBIENTE FINAL
Aqui, temos um ambiente em que o banco primary foi chaveado através de failover para seu standby. O failover foi manual e não tivemos qualquer perda de dados devido a forma como o DG estava configurado: MAXIMUM AVAILABILITY e com real-time-apply.
Claro que isso não teria acontecido se primary e standby não estivessem sincronizados. Você já começa errado se o seu ambiente não está sincronizado (você nem deveria começar na realidade). Se você continuar com o ambiente não sincronizado você terá perda de dados, isso é fato.
Lembre-se que aqui tudo foi feito manualmente, em um ambiente MAA DG+RAC você teria o broker configurado (mas isso fica para artigos que virão a seguir). No próximo artigo veremos como fazer o reinstate do antigo primary, vamos fazer ele voltar e se tornar o standby.
Este artigo também foi publicado em meu blog pessoal.