ORACLE E MAA (Maximum Availability Architecture) – Parte V – Broker
Se você está acompanhando a série de artigos sobre MAA com Oracle RAC deve ter notado que gerenciar manualmente um ambiente com esta complexidade não é uma tarefa simples. São inúmeros detalhes e configurações que podem fazer você perder o ambiente através de um único comando, fica mais complicado quando você tem que lidar manualmente com failover, switchover e reinstate.
Felizmente com Data Guard podemos utilizar o Broker para nos auxiliar em algumas tarefas, automatizando diversas tarefas. Neste artigo vou mostrar como configurar e integrar o Broker ao nosso ambiente DG com Oracle RAC.
QUINTO ARTIGO
Como disse, neste artigo vamos ver como configurar o Broker em nosso ambiente, além disso vamos ver o que precisamos fazer para que fique corretamente configurado com um Oracle RAC. A intenção deste artigo é deixar o Broker completamente operacional e integrado e onde (no futuro) possamos realizar failover, reinstate e switchover de forma “automática”. Deixarei somente a configuração do Broker para este artigo.
Como já disse em artigos anteriores, a intenção é mostrar todos os passos envolvidos no processo. Procuro demonstrar e explicar todos os logs envolvidos para que você possa ter uma noção do que está acontecendo e vislumbrar algumas coisas que acontecem por “baixo dos panos”. Infelizmente isso faz com que os artigos fiquem extensos e neste artigo os logs ficarão maiores e agora teremos mais locais para acompanhar.
AMBIENTE
Até o momento nós temos um ambiente Oracle configurado para MAA, temos um Oracle RAC primary e um Oracle RAC no standby. Ambos sincronizados em MAXIMUM AVAILABILITY e com real-time apply. Também já vimos o que fazer no caso de um failover, a sua recuperação através de reinstate e o swicthover, tudo isso feito manualmente.
Para recapitular, o banco que está atuando como primary agora é o “maa” e o standby é o “maastb. O “maa” tem duas instâncias, a “maa1” e a “maa2”, o standby tem a “maastb1” e a “maastb2”.
BROKER
Mas o que é o Broker? De forma resumida o Broker é um framework/interface que centraliza o gerenciamento e monitoramento do DG, permitindo que tarefas como failover e resintate sejam realizadas mais rápidas e com maior segurança.
Para “acessar” o Broker utiliza-se o DGMGRL ao qual conecta-se para ter acesso as configurações. Sendo que estas ficam armazenadas em arquivos que definimos através de parâmetros do banco de dados. Sim, você terá que aprender uma nova “linguagem” para utilizar o Broker. Nada muito complexo, mas é algo a mais que terá que compreender e estar familiarizado.
O Broker utiliza o processo DataGuard Monitor DMON para monitorar o ambiente com base nas configurações definidas (tanto nos parâmetros do spfile quanto nos parâmetros do próprio Broker). O gerenciamento do Broker pode ser feito através do DGMGRL ou do Enterprise Manager/Grid Control. Dependendo da configuração definida nós podemos ter a presença do Observer para identificar falhas do ambiente (como o primary). Iremos ver com calma estes detalhes mais a frente.
Backup e Log File
O primeiro passo é um backup do spfile, o Broker poderá modificar os parâmetros do DG que definimos previamente no spfile. Assim, eu recomendo você fazer um backup do spfile do primary e do standby:
Na primary:
SQL> SELECT database_role FROM v$database;
DATABASE_ROLE
----------------
PRIMARY
SQL> CREATE pfile = '/tmp/pfile-primary.ora' FROM spfile;
File created.
SQL>
Na standby:
SQL> SELECT database_role FROM v$database;
DATABASE_ROLE
----------------
PHYSICAL STANDBY
SQL> CREATE pfile = '/tmp/pfile-standby.ora' FROM spfile;
File created.
SQL>
Acredito que seja importante saber em que local o log do Broker pode ser encontrado. Este log é parecido com um alertlog de uma instância e diversas informações importantes podem ser encontradas nele. A sua localização é na mesma pasta que o alertlog da instância e o seu nome é drc<nome_instancia>.log.
dg_broker_config_fileX
É através dos parâmetros dg_broker_config_file1 e dg_broker_config_file2 que os arquivos de configuração do Broker podem ser definidos. Será nestes arquivos que a configuração ficará salva.
Em um ambiente RAC acredito que seja importante (até fundamental) que os arquivos residam em um local que seja comum a todas as instâncias. Por padrão esta configuração não fica do ASM, eu recomendaria direcionar os parâmetros para lá. Observe abaixo como fazer isso (na primary e na standby):
Na primary:
SQL> SHOW PARAMETER broker
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dg_broker_config_file1 string /u01/app/oracle/product/11.2.0.3/db_1/dbs/dr1maa.dat
dg_broker_config_file2 string /u01/app/oracle/product/11.2.0.3/db_1/dbs/dr2maa.dat
dg_broker_start boolean FALSE
SQL> ALTER SYSTEM SET dg_broker_config_file1 = '+DATA/MAA/dr1maa.dat' SCOPE = BOTH SID = '*';
System altered.
SQL> ALTER SYSTEM SET dg_broker_config_file2 = '+FRA/MAA/dr2maa.dat' SCOPE = BOTH SID = '*';
System altered.
SQL>
No standby:
SQL> SHOW PARAMETER broker
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dg_broker_config_file1 string /u01/app/oracle/product/11.2.0.3/db_1/dbs/dr1maastb.dat
dg_broker_config_file2 string /u01/app/oracle/product/11.2.0.3/db_1/dbs/dr2maastb.dat
dg_broker_start boolean FALSE
SQL> ALTER SYSTEM SET dg_broker_config_file1 = '+DG01/MAASTB/dr1maastb.dat' SCOPE = BOTH SID = '*';
System altered.
SQL> ALTER SYSTEM SET dg_broker_config_file2 = '+FRA/MAASTB/dr2maastb.dat' SCOPE = BOTH SID = '*';
System altered.
SQL>
Como você pode ver acima, são definidos dois locais diferentes para evitar perder ambos de uma única vez. Além disso, observe que o Broker está desligado.
dg_broker_start
O parâmetro dg_broker_start define que o Broker ficará habilitado e iniciará junto com o seu banco de dados. Observe:
Na primary:
SQL> SELECT database_role FROM v$database;
DATABASE_ROLE
----------------
PRIMARY
SQL> ALTER SYSTEM SET dg_broker_start = TRUE SCOPE = BOTH SID = '*';
System altered.
SQL>
No alert da primary:
Sat May 03 08:25:02 2014
DMON started with pid=50, OS id=28996
Sat May 03 08:25:02 2014
ALTER SYSTEM SET dg_broker_start=TRUE SCOPE=BOTH SID='*';
Starting Data Guard Broker (DMON)
Na standby:
SQL> SELECT database_role FROM v$database;
DATABASE_ROLE
----------------
PHYSICAL STANDBY
SQL> ALTER SYSTEM SET dg_broker_start = TRUE SCOPE = BOTH SID = '*';
System altered.
SQL>
No alert da standby:
Sat May 03 08:27:38 2014
DMON started with pid=53, OS id=9756
Sat May 03 08:27:38 2014
ALTER SYSTEM SET dg_broker_start=TRUE SCOPE=BOTH SID='*';
Starting Data Guard Broker (DMON)
Sat May 03 08:27:53 2014
INSV started with pid=55, OS id=9763
Observe acima que o Broker foi habilitado tanto no primary e no standby. Além disso, o monitor do Broker iniciou automaticamente.
DGMGRL
Habilitar o start do Broker como fizemos acima não significa muito, precisamos interagir com ele, e tudo isso é feito através do dgmgrl. Como disse no início do artigo você terá que aprender mais uma linguagem, nada complexo ou muito extenso, mas se você quer Broker é o custo a ser pago.
Para acessar digite na linha de comando (de qualquer instância – preferencialmente primary):
[oracle@rac11pri01 ~]$ dgmgrl
DGMGRL for Linux: Version 11.2.0.3.0 - 64bit Production
Copyright (c) 2000, 2009, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
DGMGRL> CONNECT sys@maa>
Password:
Connected.
DGMGRL>
Veja que também conectamos na base de dados. Primeiramente conectamos na base primary com o usuário SYS e usamos o que está definido no TNSNAMES. Eu recomendo iniciar a configuração através da base que está atuando como primary.
Create Configuration
Depois de conectar no Broker precisamos criar a configuração dentro do Broker, basicamente você define quem é o banco primary e quem é o standby. Ao fazer isso o Broker irá ler seu spfile e configurar a si mesmo com base nestes parâmetros.
Claro que devemos tomar cuidado com o que definimos na configuração. Acredito que o mais importante seja o TNS do seu ambiente, certifique-se que todos os servidores do seu Oracle RAC primary tem entradas para o seu standby, e que todos os servidores do seu Oracle RAC standby tenham entradas para o seu primary. Se você não tem isso (deveria ter se seguiu todos os passos e artigos até aqui) corrija imediatamente. Quando criamos a configuração o Broker irá atrás do seu TNS para se conectar com o banco de dados, entendeu a importância?
Recapitulando novamente, o seu banco que está atuando como primary agora é o “maa” e o standby é o “maastb. O “maa” tem duas instâncias, a “maa1” e a “maa2”, o standby tem a “maastb1” e a “maastb2”.
Bom, para criar a configuração no Broker basta fazer os seguintes comandos através do dgmgrl:
DGMGRL> CREATE CONFIGURATION 'dgrac' AS
> PRIMARY DATABASE IS 'maa'
> CONNECT IDENTIFIER IS 'maa';
Configuration "dgrac" created with primary database "maa"
DGMGRL>
No alert to broker (nó 1)
No database profile named maa found in configuratio
Command Broker operation completed
ADD DATABASE
05/03/2014 09:09:40
DMON Registering service maa_DGB with listener(s)
Command ADD DATABASE completed
No alert do broker (nó 2)
Configuration does not exist, Data Guard broker ready
05/03/2014 15:09:39
No database profile named maa found in configuration
05/03/2014 15:09:40
DMON Registering service maa_DGB with listener(s)
Vamos entender o comando acima, observe que foi criada uma configuração chamada dgrac (CREATE CONFIGURATION) que tem como primary database o maa (PRIMARY DATABASE IS) e que a string de conexão é maa (CONNECT IDENTIFIER). Aqui vale um cuidado, se você especificar os nomes entre aspas duplas ele ficará sensível a caixa, assim toda a vez executar u comando terá que chamar com os nomes entre aspas. Observe nos logs do Broker que como o arquivo de configuração não existia e foi criado automaticamente.
Vamos ver como ficou a configuração atual:
DGMGRL> SHOW CONFIGURATION
Configuration - dgrac
Protection Mode: MaxAvailability
Databases:
maa - Primary database
Fast-Start Failover: DISABLED
Configuration Status:
DISABLED
DGMGRL> SHOW CONFIGURATION VERBOSE
Configuration - dgrac
Protection Mode: MaxAvailability
Databases:
maa - Primary database
Properties:
FastStartFailoverThreshold = '30'
OperationTimeout = '30'
FastStartFailoverLagLimit = '30'
CommunicationTimeout = '180'
FastStartFailoverAutoReinstate = 'TRUE'
FastStartFailoverPmyShutdown = 'TRUE'
BystandersFollowRoleChange = 'ALL'
Fast-Start Failover: DISABLED
Configuration Status:
DISABLED
DGMGRL>
O primeiro detalhe que destaco é o VERBOSE, boa parte dos comandos do dgmgrl tem a opção verbose. Como pode ver acima, a primeiro (sem o verbose) é uma descrição simples do ambiente e sem muitas informações importantes para nós. Já a segunda que foi definida com o verbose é bem mais detalhada.
Acima vimos que existe o banco “maa”, vamos verificar o que o Broker identificou do nosso ambiente. Detalhando um pouco mais o banco de dados no Broker temos:
DGMGRL> SHOW DATABASE VERBOSE maa
Database - maa
Role: PRIMARY
Intended State: OFFLINE
Instance(s):
maa1
maa2
Properties:
DGConnectIdentifier = 'maa'
ObserverConnectIdentifier = ''
LogXptMode = 'SYNC'
DelayMins = '0'
Binding = 'optional'
MaxFailure = '0'
MaxConnections = '1'
ReopenSecs = '300'
NetTimeout = '30'
RedoCompression = 'DISABLE'
LogShipping = 'ON'
PreferredApplyInstance = ''
ApplyInstanceTimeout = '0'
ApplyParallel = 'AUTO'
StandbyFileManagement = 'AUTO'
ArchiveLagTarget = '0'
LogArchiveMaxProcesses = '4'
LogArchiveMinSucceedDest = '1'
DbFileNameConvert = '+DG01/maastb, +DATA/maa, +FRA/maastb, +FRA/maa'
LogFileNameConvert = '+DG01/maastb, +DATA/maa, +FRA/maastb, +FRA/maa'
FastStartFailoverTarget = ''
InconsistentProperties = '(monitor)'
InconsistentLogXptProps = '(monitor)'
SendQEntries = '(monitor)'
LogXptStatus = '(monitor)'
RecvQEntries = '(monitor)'
SidName(*)
StaticConnectIdentifier(*)
StandbyArchiveLocation(*)
AlternateLocation(*)
LogArchiveTrace(*)
LogArchiveFormat(*)
TopWaitEvents(*)
(*) - Please check specific instance for the property value
Database Status:
DISABLED
DGMGRL>
Analisando o comando acima nós vemos que Broker identificou que a troca de redo entre as bases está em modo síncrono (LogXptMode) e que temos duas instâncias. Observe também que o Broker identificou que temos conversão de nomes de datafiles e redo’s.
Depois de adicionarmos o primary, vamos adicionar o banco standby ao Broker. Para isso executamos:
DGMGRL> ADD DATABASE 'maastb' AS
> CONNECT IDENTIFIER IS 'maastb';
Database "maastb" added
DGMGRL>
No alert do broker:
05/03/2014 12:37:24
ADD DATABASE
05/03/2014 12:37:31
Command ADD DATABASE completed
Observe que no comando acima nós não especificamos que o banco é standby, isso é lido pelo BROKER através das configurações do próprio banco. Analisando com mais detalhes o banco no Broker nós temos:
DGMGRL> SHOW DATABASE VERBOSE maastb
Database - maastb
Role: PHYSICAL STANDBY
Intended State: OFFLINE
Transport Lag: (unknown)
Apply Lag: (unknown)
Real Time Query: OFF
Instance(s):
maastb1
maastb2
Properties:
DGConnectIdentifier = 'maastb'
ObserverConnectIdentifier = ''
LogXptMode = 'SYNC'
DelayMins = '0'
Binding = 'OPTIONAL'
MaxFailure = '0'
MaxConnections = '1'
ReopenSecs = '300'
NetTimeout = '30'
RedoCompression = 'DISABLE'
LogShipping = 'ON'
PreferredApplyInstance = ''
ApplyInstanceTimeout = '0'
ApplyParallel = 'AUTO'
StandbyFileManagement = 'AUTO'
ArchiveLagTarget = '0'
LogArchiveMaxProcesses = '4'
LogArchiveMinSucceedDest = '1'
DbFileNameConvert = '+DATA/maa, +DG01/maastb, +FRA/maa, +FRA/maastb'
LogFileNameConvert = '+DATA/maa, +DG01/maastb, +FRA/maa, +FRA/maastb'
FastStartFailoverTarget = ''
InconsistentProperties = '(monitor)'
InconsistentLogXptProps = '(monitor)'
SendQEntries = '(monitor)'
LogXptStatus = '(monitor)'
RecvQEntries = '(monitor)'
SidName(*)
StaticConnectIdentifier(*)
StandbyArchiveLocation(*)
AlternateLocation(*)
LogArchiveTrace(*)
LogArchiveFormat(*)
TopWaitEvents(*)
(*) - Please check specific instance for the property value
Database Status:
DISABLED
DGMGRL>
Vamos fazer uma relação com os dois comandos anteriores. Observe a “Role” de ambos e os parâmetros DbFileNameConvert e LogFileNameConvert, eles estão invertidos (o que era desejado). Como estamos em ambiente Oracle RAC alguns parâmetros são específicos para cada instância e por isso aparecem com o asterisco (*).
Instâncias
Vamos dar uma olhada nas configurações específicas de cada instância presente no ambiente. Recomendo verificar cada uma para identificar quaisquer parâmetros que não foram devidamente carregados ou pela simples validação dos mesmos. Não detalharei cada um dos parâmetros, muitos são auto descritivos.
Para as instâncias do Oracle RAC primary:
DGMGRL> SHOW DATABASE maa
Database - maa
Role: PRIMARY
Intended State: OFFLINE
Instance(s):
maa1
maa2
Database Status:
DISABLED
DGMGRL> SHOW INSTANCE VERBOSE maa1
Instance 'maa1' of database 'maa'
Host Name: rac11pri01
PFILE:
Properties:
SidName = 'maa1'
StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.14)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maa_DGMGRL)(INSTANCE_NAME=maa1)(SERVER=DEDICATED)))'
StandbyArchiveLocation = 'USE_DB_RECOVERY_FILE_DEST'
AlternateLocation = ''
LogArchiveTrace = '0'
LogArchiveFormat = 'arch_%t_%s_%r.arc'
TopWaitEvents = '(monitor)'
Instance Status:
DISABLED
DGMGRL> SHOW INSTANCE VERBOSE maa2
Instance 'maa2' of database 'maa'
Host Name: rac11pri02
PFILE:
Properties:
SidName = 'maa2'
StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.16)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maa_DGMGRL)(INSTANCE_NAME=maa2)(SERVER=DEDICATED)))'
StandbyArchiveLocation = 'USE_DB_RECOVERY_FILE_DEST'
AlternateLocation = ''
LogArchiveTrace = '0'
LogArchiveFormat = 'arch_%t_%s_%r.arc'
TopWaitEvents = '(monitor)'
Instance Status:
DISABLED
DGMGRL>
Analisando com calma a saída acima identificarmos que existe um banco com duas instâncias. Além disso, que cada uma delas tem uma string de conexão única (StaticConnectIdentifier), sobre isso nós conversaremos depois.
Para as instâncias do Oracle RAC standby temos:
DGMGRL> SHOW DATABASE maastb
Database - maastb
Role: PHYSICAL STANDBY
Intended State: OFFLINE
Transport Lag: (unknown)
Apply Lag: (unknown)
Real Time Query: OFF
Instance(s):
maastb1
maastb2
Database Status:
DISABLED
DGMGRL> SHOW INSTANCE VERBOSE maastb1
Instance 'maastb1' of database 'maastb'
Host Name: rac11stb01
PFILE:
Properties:
SidName = 'maastb1'
StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.52)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maastb_DGMGRL)(INSTANCE_NAME=maastb1)(SERVER=DEDICATED)))'
StandbyArchiveLocation = 'USE_DB_RECOVERY_FILE_DEST'
AlternateLocation = ''
LogArchiveTrace = '0'
LogArchiveFormat = 'arch_%t_%s_%r.arc'
TopWaitEvents = '(monitor)'
Instance Status:
DISABLED
DGMGRL> SHOW INSTANCE VERBOSE maastb2
Instance 'maastb2' of database 'maastb'
Host Name: rac11stb02
PFILE:
Properties:
SidName = 'maastb2'
StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.51)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maastb_DGMGRL)(INSTANCE_NAME=maastb2)(SERVER=DEDICATED)))'
StandbyArchiveLocation = 'USE_DB_RECOVERY_FILE_DEST'
AlternateLocation = ''
LogArchiveTrace = '0'
LogArchiveFormat = 'arch_%t_%s_%r.arc'
TopWaitEvents = '(monitor)'
Instance Status:
DISABLED
DGMGRL>
Para o standby verificamos que ele foi identificado como PHYSICAL STANDBY e que não existe nenhum lag para transmissão ou recebimento do redo com a primary. Além disso identificamos a string de conexão de cada uma delas.
Enable Configuration
Acredito que você já deve ter notado em todas as saídas acima que a configuração do Broker não está habilitada. Até o momento o Broker somente leu as configurações do Data Guard e as armazenou em seus arquivos, entrou em cada instância e leu seus parâmetros.
Para habilitarmos o Broker a gerenciar o Data Guard executamos o comando abaixo:
DGMGRL> ENABLE CONFIGURATION;
Enabled.
DGMGRL>
Vamos analisar com calma os alertlog das instâncias e o log do broker. No arquivo de log do Broker das instâncias do Oracle RAC primary nós temos (o interessante aqui é a definição de qual será a instância do standby que irá aplicar os redo recebidos):
Log do Broker da instância primary maa1:
05/03/2014 13:31:04
ENABLE CONFIGURATION
05/03/2014 13:31:15
Creating process RSM0
05/03/2014 13:31:35
Command ENABLE CONFIGURATION completed
EDIT DATABASE maastb SET PROPERTY ActualApplyInstance = maastb1
Apply Instance for database maastb is maastb1
Command EDIT DATABASE maastb SET PROPERTY ActualApplyInstance = maastb1 completed
Log do Broker da instância primary maa2:
05/03/2014 19:31:16
Creating process RSM0
05/03/2014 19:31:35
Command ENABLE CONFIGURATION completed
No alertlog das instâncias do Oracle RAC primary temos:
Alertlog da instancia primary maa1:
Sat May 03 13:31:16 2014
RSM0 started with pid=55, OS id=6023
ALTER SYSTEM SET log_archive_trace=0 SCOPE=BOTH SID='maa1';
ALTER SYSTEM SET log_archive_format='arch_%t_%s_%r.arc' SCOPE=SPFILE SID='maa1';
ALTER SYSTEM SET standby_file_management='AUTO' SCOPE=BOTH SID='*';
ALTER SYSTEM SET archive_lag_target=0 SCOPE=BOTH SID='*';
ALTER SYSTEM SET log_archive_max_processes=4 SCOPE=BOTH SID='*';
ALTER SYSTEM SET log_archive_min_succeed_dest=1 SCOPE=BOTH SID='*';
ALTER SYSTEM SET db_file_name_convert='+DG01/maastb','+DATA/maa','+FRA/maastb','+FRA/maa' SCOPE=SPFILE;
ALTER SYSTEM SET log_file_name_convert='+DG01/maastb','+DATA/maa','+FRA/maastb','+FRA/maa' SCOPE=SPFILE;
ALTER SYSTEM ARCHIVE LOG
Sat May 03 13:31:25 2014
Deleted Oracle managed file +FRA/maa/archivelog/2014_04_12/thread_1_seq_50.527.844699551
LGWR: Standby redo logfile selected to archive thread 1 sequence 107
LGWR: Standby redo logfile selected for thread 1 sequence 107 for destination LOG_ARCHIVE_DEST_2
Thread 1 advanced to log sequence 107 (LGWR switch)
Current log# 1 seq# 107 mem# 0: +DATA/maa/onlinelog/group_1.272.843488553
Current log# 1 seq# 107 mem# 1: +FRA/maa/onlinelog/group_1.286.843488555
Sat May 03 13:31:33 2014
Deleted Oracle managed file +FRA/maa/archivelog/2014_04_12/thread_2_seq_29.522.844710453
Archived Log entry 514 added for thread 1 sequence 106 ID 0x2b1d0465 dest 1:
Deleted Oracle managed file +FRA/maa/archivelog/2014_04_12/thread_1_seq_51.261.844710453
Archived Log entry 515 added for thread 2 sequence 73 ID 0x2b1d0465 dest 1:
Alertlog da instancia primary maa2:
Sat May 03 19:31:16 2014
RSM0 started with pid=54, OS id=10114
ALTER SYSTEM SET log_archive_trace=0 SCOPE=BOTH SID='maa2';
ALTER SYSTEM SET log_archive_format='arch_%t_%s_%r.arc' SCOPE=SPFILE SID='maa2';
Sat May 03 19:31:30 2014
Deleted Oracle managed file +FRA/maa/archivelog/2014_04_12/thread_2_seq_28.524.844699553
LGWR: Standby redo logfile selected to archive thread 2 sequence 74
LGWR: Standby redo logfile selected for thread 2 sequence 74 for destination LOG_ARCHIVE_DEST_2
Thread 2 advanced to log sequence 74 (LGWR switch)
Current log# 4 seq# 74 mem# 0: +DATA/maa/onlinelog/group_4.262.843489103
Current log# 4 seq# 74 mem# 1: +FRA/maa/onlinelog/group_4.283.843489103
Analisando com calma as saídas acima identificamos algumas informações importantes, verificamos que ao habilitar o Broker algumas configurações foram modificadas. Observe que os parâmetros db_file_name_convert e log_file_name_convert foram modificados (para os mesmo valores já cadastrados, mas tudo bem). Um dos parâmetros que o Broker modificou foi o standby_file_management, se você notar ele também foi modificado para um valor que já havíamos definidos previamente.
No arquivo do arquivo de log do Broker das instâncias do standby não temos nenhuma informação muito relevante, só que a configuração do Broker foi habilitada. Já no alertlog do standby temos informações sobre parâmetros que foram modificados:
No alert da standby maastb1:
Sat May 03 13:27:56 2014
RSM0 started with pid=45, OS id=18329
Sat May 03 13:28:02 2014
NSV0 started with pid=56, OS id=18332
ALTER SYSTEM SET log_archive_trace=0 SCOPE=BOTH SID='maastb1';
ALTER SYSTEM SET log_archive_format='arch_%t_%s_%r.arc' SCOPE=SPFILE SID='maastb1';
Sat May 03 13:28:06 2014
Standby controlfile consistent with primary
RFS[2]: Selected log 5 for thread 1 sequence 107 dbid 722024964 branch 844762805
Sat May 03 13:28:11 2014
Archived Log entry 263 added for thread 1 sequence 106 ID 0x2b1d0465 dest 1:
Sat May 03 13:28:12 2014
Standby controlfile consistent with primary
RFS[4]: Selected log 8 for thread 2 sequence 74 dbid 722024964 branch 844762805
Sat May 03 13:28:13 2014
Archived Log entry 264 added for thread 2 sequence 73 ID 0x2b1d0465 dest 1:
Sat May 03 13:28:16 2014
Media Recovery Waiting for thread 1 sequence 107 (in transit)
Recovery of Online Redo Log: Thread 1 Group 5 Seq 107 Reading mem 0
Mem# 0: +DG01/maastb/onlinelog/group_5.271.844716073
Mem# 1: +FRA/maastb/onlinelog/group_5.553.844716075
Media Recovery Waiting for thread 2 sequence 74 (in transit)
Recovery of Online Redo Log: Thread 2 Group 8 Seq 74 Reading mem 0
Mem# 0: +DG01/maastb/onlinelog/group_8.261.844716089
Mem# 1: +FRA/maastb/onlinelog/group_8.611.844716093
No alert da standby maastb2:
Sat May 03 18:34:11 2014
Using STANDBY_ARCHIVE_DEST parameter default value as USE_DB_RECOVERY_FILE_DEST
Sat May 03 19:27:52 2014
NSV0 started with pid=43, OS id=10171
Sat May 03 19:27:56 2014
RSM0 started with pid=44, OS id=10175
ALTER SYSTEM SET log_archive_trace=0 SCOPE=BOTH SID='maastb2';
ALTER SYSTEM SET log_archive_format='arch_%t_%s_%r.arc' SCOPE=SPFILE SID='maastb2';
ALTER SYSTEM SET standby_file_management='AUTO' SCOPE=BOTH SID='*';
ALTER SYSTEM SET archive_lag_target=0 SCOPE=BOTH SID='*';
ALTER SYSTEM SET log_archive_max_processes=4 SCOPE=BOTH SID='*';
ALTER SYSTEM SET log_archive_min_succeed_dest=1 SCOPE=BOTH SID='*';
ALTER SYSTEM SET db_file_name_convert='+DATA/maa','+DG01/maastb','+FRA/maa','+FRA/maastb' SCOPE=SPFILE;
ALTER SYSTEM SET log_file_name_convert='+DATA/maa','+DG01/maastb','+FRA/maa','+FRA/maastb' SCOPE=SPFILE;
ALTER SYSTEM SET fal_server='maa' SCOPE=BOTH;
Por fim, vamos verificar como ficou a configuração no Broker agora:
DGMGRL> SHOW CONFIGURATION;
Configuration - dgrac
Protection Mode: MaxAvailability
Databases:
maa - Primary database
maastb - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS
DGMGRL> SHOW DATABASE maa;
Database - maa
Role: PRIMARY
Intended State: TRANSPORT-ON
Instance(s):
maa1
maa2
Database Status:
SUCCESS
DGMGRL> SHOW DATABASE maastb;
Database - maastb
Role: PHYSICAL STANDBY
Intended State: APPLY-ON
Transport Lag: 0 seconds
Apply Lag: 0 seconds
Real Time Query: OFF
Instance(s):
maastb1 (apply instance)
maastb2
Database Status:
SUCCESS
DGMGRL>
Pronto, agora você tem o Broker configurado e pronto para gerenciar seu ambiente DG. Isso não quer dizer muita coisa, ele não vai fazer failover ou switchover automático (ainda), ele só está “monitorando” o ambiente. Você deve estar se perguntando quais as vantagens do Broker, no que ele ajuda até o momento. Nós vamos ver em próximos artigos onde o Broker atua e o que ele proporciona, você ainda vai agradecer por ele existir.
Infelizmente nem tudo são flores, depois do Broker habilitado você deve esquecer a possibilidade de editar inúmeros parâmetros através do sqlplus. A partir de agora a melhor forma de editar qualquer configuração é através do dgmgrl. Se você editar parâmetros diretamente no sqlplus o Broker pode reclamar já que o que ele tem armazenado em seus arquivos de configuração difere do spfile.
CONEXÃO BROKER
Eu gostaria muito, mas muito mesmo, que a configuração do Broker para o ambiente Oracle RAC + DataGuard tivesse terminado aqui, mas infelizmente não. A alguns parágrafos acima eu citei o parâmetro StaticConnectIdentifier, basicamente ele define como o Broker se conecta na instância para eventuais configurações e operações (como resinstate, failover e switchover).
De certa forma, a conexão como está definida não irá funcionar em um primeiro momento, precisamos ajustar alguns detalhes para deixar o Broker 100% para um ambiente com Oracle RAC, ele precisa se conectar diretamente em cada instância. Observe as definições existentes hoje no Broker:
DGMGRL> SHOW INSTANCE maa1 StaticConnectIdentifier
StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.14)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maa_DGMGRL)(INSTANCE_NAME=maa1)(SERVER=DEDICATED)))'
DGMGRL>
DGMGRL> SHOW INSTANCE maa2 StaticConnectIdentifier
StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.16)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maa_DGMGRL)(INSTANCE_NAME=maa2)(SERVER=DEDICATED)))'
DGMGRL>
DGMGRL> SHOW INSTANCE maastb1 StaticConnectIdentifier
StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.52)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maastb_DGMGRL)(INSTANCE_NAME=maastb1)(SERVER=DEDICATED)))'
DGMGRL>
DGMGRL> SHOW INSTANCE maastb2 StaticConnectIdentifier
StaticConnectIdentifier = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.51)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maastb_DGMGRL)(INSTANCE_NAME=maastb2)(SERVER=DEDICATED)))'
DGMGRL>
Pelo que identificamos acima, a conexão utiliza um service_name específico para conexão, <nome_instância>_DGMGRL. Será esta string de conexão que o Broker irá usar para casos de failover, switchover e reinstate. Vamos começar testando uma dela no sqlplus para ver se ela está correta:
[oracle@rac11pri01 ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.3.0 Production on Sun May 4 07:40:05 2014
Copyright (c) 1982, 2011, Oracle. All rights reserved.
SQL> CONNECT system@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.14)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maa_DGMGRL)(INSTANCE_NAME=maa1)(SERVER=DEDICATED)))
Enter password:
ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect
descriptor
SQL> exit
[oracle@rac11pri01 ~]$
Como visto acima, a conexão não está funcionado e recebemos o famigerado ORA-12514, realmente nada bom. Assim, se o Broker precisar conectar na instância para qualquer operação ela não irá funcionar e isso piora em um ambiente Oracle RAC em que temos que ajustar para cada servidor do cluster.
A correção neste caso é um pouco trabalhosa e envolve em fazer o registro manual da instância no listener do nó. É um procedimento que já demonstrei como fazer (no primeiro artigo) e você terá que fazer em cada nó do seu ambiente (primary e standby), agora pense em um ambiente Exadata Full com 8 nós no cultas – é, o seu dia será “longo”.
Eu começo verificando a configuração atual do listener dos nós, neste caso a do nó 1 do primary:
[oracle@rac11pri01 ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 08:46:26
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 04-MAY-2014 07:54:05
Uptime 0 days 0 hr. 52 min. 21 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/grid/11.2.0.3/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/rac11pri01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.17.42.10)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.17.42.14)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
Instance "+ASM1", status READY, has 1 handler(s) for this service...
Service "maa" has 1 instance(s).
Instance "maa1", status READY, has 1 handler(s) for this service...
Service "maa_DGB" has 1 instance(s).
Instance "maa1", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@rac11pri01 ~]$
Vamos editar agora o listener.ora e adicionar a entrada para o registro estático do serviço de conexão a instância:
[oracle@rac11pri01 ~]$ cat /u01/app/grid/11.2.0.3/network/admin/listener.ora
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))) # line added by Agent
LISTENER_SCAN3=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN3)))) # line added by Agent
LISTENER_SCAN2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN2)))) # line added by Agent
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))) # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN3=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
[oracle@rac11pri01 ~]$
[oracle@rac11pri01 ~]$ vi /u01/app/grid/11.2.0.3/network/admin/listener.ora
[oracle@rac11pri01 ~]$
[oracle@rac11pri01 ~]$ cat /u01/app/grid/11.2.0.3/network/admin/listener.ora
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))) # line added by Agent
LISTENER_SCAN3=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN3)))) # line added by Agent
LISTENER_SCAN2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN2)))) # line added by Agent
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))) # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN3=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
#Adicionado devido ao Broker.
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=maa_DGMGRL)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.3/db_1)
(SID_NAME=maa1)
)
)
[oracle@rac11pri01 ~]$
Observe acima que definimos a entrada estática ao listener (SID_LIST_LISTENER) para o serviço do broker (maa_DGMGRL). Os cuidados aqui são os de sempre, o GLOBAL_DBNAME deve casar com o que o Broker tem no StaticConnectIdentifier para esta instância, o SID_NAME deve refletir a instância do nó e o ORACLE_HOME deve estar correto.
Como mudamos as configurações do listener, precisamos reiniciar ele. Lembre que como precisamos reiniciar teremos um downtime de conexão e até as conexões podem ser finalizadas, escolha o melhor momento para fazer isso. Reinicie o listener e verifique se a conexão com o serviço do Broker está correta:
[oracle@rac11pri01 ~]$ lsnrctl stop
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 09:28:31
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
The command completed successfully
[oracle@rac11pri01 ~]$
[oracle@rac11pri01 ~]$
[oracle@rac11pri01 ~]$ lsnrctl start
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 09:29:33
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Starting /u01/app/grid/11.2.0.3/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.3.0 - Production
System parameter file is /u01/app/grid/11.2.0.3/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/rac11pri01/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 04-MAY-2014 09:29:33
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/grid/11.2.0.3/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/rac11pri01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
Services Summary...
Service "maa_DGMGRL" has 1 instance(s).
Instance "maa1", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@rac11pri01 ~]$
[oracle@rac11pri01 ~]$
[oracle@rac11pri01 ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 09:29:42
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 04-MAY-2014 09:29:33
Uptime 0 days 0 hr. 0 min. 9 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/grid/11.2.0.3/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/rac11pri01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.17.42.10)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.17.42.14)(PORT=1521)))
Services Summary...
Service "maa" has 1 instance(s).
Instance "maa1", status READY, has 1 handler(s) for this service...
Service "maa_DGB" has 1 instance(s).
Instance "maa1", status READY, has 1 handler(s) for this service...
Service "maa_DGMGRL" has 1 instance(s).
Instance "maa1", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@rac11pri01 ~]$
[oracle@rac11pri01 ~]$
[oracle@rac11pri01 ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.3.0 Production on Sun May 4 09:40:18 2014
Copyright (c) 1982, 2011, Oracle. All rights reserved.
SQL> CONNECT system@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.14)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maa_DGMGRL)(INSTANCE_NAME=maa1)(SERVER=DEDICATED)))
Enter password:
Connected.
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters and Automatic Storage Management options
[oracle@rac11pri01 ~]$
Acima nós temos a parada, reinício e status do listener. Observe que no status o registro manual já aparece (bem como ao iniciarmos o listener). Por fim, a conexão específica ao serviço maa_DGMGRL já está operacional.
Para deixar o ambiente correto, fazemos o mesmo para todos os outros nós do primary e também para do standby (comandos e informações importantes marcadas em negrito):
Outro nó do primary (instância maa2):
[oracle@rac11pri02 ~]$ export ORACLE_HOME=/u01/app/grid/11.2.0.3
[oracle@rac11pri02 ~]$ cat /u01/app/grid/11.2.0.3/network/admin/listener.ora
LISTENER_SCAN3=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN3)))) # line added by Agent
LISTENER_SCAN2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN2)))) # line added by Agent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))) # line added by Agent
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))) # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN3=ON # line added by Agent
[oracle@rac11pri02 ~]$
[oracle@rac11pri02 ~]$
[oracle@rac11pri02 ~]$ vi /u01/app/grid/11.2.0.3/network/admin/listener.ora
[oracle@rac11pri02 ~]$
[oracle@rac11pri02 ~]$
[oracle@rac11pri02 ~]$ cat /u01/app/grid/11.2.0.3/network/admin/listener.ora
LISTENER_SCAN3=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN3)))) # line added by Agent
LISTENER_SCAN2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN2)))) # line added by Agent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))) # line added by Agent
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))) # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN3=ON # line added by Agent
#Adicionado devido ao Broker.
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=maa_DGMGRL)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.3/db_1)
(SID_NAME=maa2)
)
)
[oracle@rac11pri02 ~]$
[oracle@rac11pri02 ~]$ lsnrctl stop
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 09:47:32
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
The command completed successfully
[oracle@rac11pri02 ~]$
[oracle@rac11pri02 ~]$
[oracle@rac11pri02 ~]$ lsnrctl start
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 09:47:34
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Starting /u01/app/grid/11.2.0.3/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.3.0 - Production
System parameter file is /u01/app/grid/11.2.0.3/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/rac11pri02/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 04-MAY-2014 09:47:35
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/grid/11.2.0.3/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/rac11pri02/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
Services Summary...
Service "maa_DGMGRL" has 1 instance(s).
Instance "maa2", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@rac11pri02 ~]$
[oracle@rac11pri02 ~]$
[oracle@rac11pri02 ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 09:47:40
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 04-MAY-2014 09:47:35
Uptime 0 days 0 hr. 0 min. 5 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/grid/11.2.0.3/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/rac11pri02/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.17.42.15)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.17.42.16)(PORT=1521)))
Services Summary...
Service "maa_DGMGRL" has 1 instance(s).
Instance "maa2", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@rac11pri02 ~]$
[oracle@rac11pri02 ~]$ sqlplus /NOLOG
SQL*Plus: Release 11.2.0.3.0 Production on Sun May 4 09:48:56 2014
Copyright (c) 1982, 2011, Oracle. All rights reserved.
SQL> CONNECT SYSTEM@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.16)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maa_DGMGRL)(INSTANCE_NAME=maa2)(SERVER=DEDICATED)))
Enter password:
Connected.
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters and Automatic Storage Management options
[oracle@rac11pri02 ~]$
No primeiro nó do standby (instância maastb1):
[oracle@rac11stb01 ~]$ export ORACLE_HOME=/u01/app/grid/11.2.0.3
[oracle@rac11stb01 ~]$ cat /u01/app/grid/11.2.0.3/network/admin/listener.ora
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))) # line added by Agent
LISTENER_SCAN3=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN3)))) # line added by Agent
LISTENER_SCAN2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN2)))) # line added by Agent
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))) # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN3=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$ vi /u01/app/grid/11.2.0.3/network/admin/listener.ora
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$ cat /u01/app/grid/11.2.0.3/network/admin/listener.ora
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))) # line added by Agent
LISTENER_SCAN3=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN3)))) # line added by Agent
LISTENER_SCAN2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN2)))) # line added by Agent
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))) # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN3=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
#Adicionado devido ao Broker.
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=maastb_DGMGRL)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.3/db_1)
(SID_NAME=maastb1)
)
)
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$ lsnrctl stop
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 09:52:56
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
The command completed successfully
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$ lsnrctl start
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 09:53:23
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Starting /u01/app/grid/11.2.0.3/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.3.0 - Production
System parameter file is /u01/app/grid/11.2.0.3/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/rac11stb01/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 04-MAY-2014 09:53:23
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/grid/11.2.0.3/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/rac11stb01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
Services Summary...
Service "maastb_DGMGRL" has 1 instance(s).
Instance "maastb1", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 09:53:28
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 04-MAY-2014 09:53:23
Uptime 0 days 0 hr. 0 min. 5 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/grid/11.2.0.3/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/rac11stb01/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.17.42.48)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.17.42.52)(PORT=1521)))
Services Summary...
Service "maastb_DGMGRL" has 1 instance(s).
Instance "maastb1", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$
[oracle@rac11stb01 ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.3.0 Production on Sun May 4 09:53:56 2014
Copyright (c) 1982, 2011, Oracle. All rights reserved.
SQL> CONNECT SYSTEM@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.52)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maastb_DGMGRL)(INSTANCE_NAME=maastb1)(SERVER=DEDICATED)))
Enter password:
ERROR:
ORA-01033: ORACLE initialization or shutdown in progress
Process ID: 0
Session ID: 0 Serial number: 0
SQL> exit
[oracle@rac11stb01 ~]$
No segundo nó do standby (instância maastb2):
[oracle@rac11stb02 ~]$ export ORACLE_HOME=/u01/app/grid/11.2.0.3
[oracle@rac11stb02 ~]$ cat /u01/app/grid/11.2.0.3/network/admin/listener.ora
LISTENER_SCAN3=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN3)))) # line added by Agent
LISTENER_SCAN2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN2)))) # line added by Agent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))) # line added by Agent
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))) # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN3=ON # line added by Agent
[oracle@rac11stb02 ~]$
[oracle@rac11stb02 ~]$
[oracle@rac11stb02 ~]$ vi /u01/app/grid/11.2.0.3/network/admin/listener.ora
[oracle@rac11stb02 ~]$
[oracle@rac11stb02 ~]$
[oracle@rac11stb02 ~]$ cat /u01/app/grid/11.2.0.3/network/admin/listener.ora
LISTENER_SCAN3=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN3)))) # line added by Agent
LISTENER_SCAN2=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN2)))) # line added by Agent
LISTENER=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))) # line added by Agent
LISTENER_SCAN1=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_SCAN1)))) # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN1=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN2=ON # line added by Agent
ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER_SCAN3=ON # line added by Agent
#Adicionado devido ao Broker.
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=maastb_DGMGRL)
(ORACLE_HOME=/u01/app/oracle/product/11.2.0.3/db_1)
(SID_NAME=maastb2)
)
)
[oracle@rac11stb02 ~]$
[oracle@rac11stb02 ~]$
[oracle@rac11stb02 ~]$ lsnrctl stop
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 09:58:36
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
The command completed successfully
[oracle@rac11stb02 ~]$
[oracle@rac11stb02 ~]$
[oracle@rac11stb02 ~]$ lsnrctl start
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 09:58:39
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Starting /u01/app/grid/11.2.0.3/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 11.2.0.3.0 - Production
System parameter file is /u01/app/grid/11.2.0.3/network/admin/listener.ora
Log messages written to /u01/app/oracle/diag/tnslsnr/rac11stb02/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 04-MAY-2014 09:58:39
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/grid/11.2.0.3/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/rac11stb02/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
Services Summary...
Service "maastb_DGMGRL" has 1 instance(s).
Instance "maastb2", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@rac11stb02 ~]$
[oracle@rac11stb02 ~]$
[oracle@rac11stb02 ~]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 04-MAY-2014 09:58:43
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
Start Date 04-MAY-2014 09:58:39
Uptime 0 days 0 hr. 0 min. 3 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/grid/11.2.0.3/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/rac11stb02/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.17.42.50)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.17.42.51)(PORT=1521)))
Services Summary...
Service "maastb_DGMGRL" has 1 instance(s).
Instance "maastb2", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@rac11stb02 ~]$ sqlplus /NOLOG
SQL*Plus: Release 11.2.0.3.0 Production on Sun May 4 09:58:46 2014
Copyright (c) 1982, 2011, Oracle. All rights reserved.
SQL> CONNECT SYSTEM@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=10.17.42.51)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=maastb_DGMGRL)(INSTANCE_NAME=maastb2)(SERVER=DEDICATED)))
Enter password:
ERROR:
ORA-01033: ORACLE initialization or shutdown in progress
Process ID: 0
Session ID: 0 Serial number: 0
SQL> exit
[oracle@rac11stb02 ~]$
Observe atentamente o que temos acima e os comandos marcados em negrito. Para todos os servidores do luster (primary e standby) iniciamos registrando manualmente a instância no listener através da edição do listener.ora, reiniciamos o listener e testamos a conexão. Fique atento ao que foi registrado em cada listener, o nome do serviço muda entre primary e standby (maa_DGMGRL para maastb_DGMGRL) e as instância entre cada nó. Com tudo isso configurado nós temos o listener de cada nó preparado para receber conexões do Broker específicas para cada nó.
AMBIENTE FINAL
Chegamos a um ambiente com DataGuard para Oracle RAC tanto no primary e standby gerenciado pelo Broker. A configuração está ativa no Broker e tudo o que precisaremos configurar agora deve ser feito por ele sob pena de problemas de integridade entre arquivos de configuração. Além disso, como estamos com Oracle RAC deixamos tudo configurado para que o Broker consiga conectar em cada nó para realizar operações críticas.
Ainda não estamos com o ambiente 100%, se você notou acima nós não configuramos o Fast-Start Failover no Broker. No caso de uma falha do ambiente precisaremos intervir para chaveamento entre primary e standby. No próximo artigo iremos ver como fazer failover e reinstate através do Broker.
Este post também está publicado no meu blog pessoal.