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
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.
Pingback: Oracle e MAA – Artigo IX – Failover Automático
Pingback: Oracle e MAA – Artigo VIII – Fast-Start Failover
Pingback: Oracle e MAA – Artigo X | Blog Fernando Simon