Oracle e MAA – Artigo 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

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.

3 Responses to Oracle e MAA – Artigo V – Broker

  1. Pingback: Oracle e MAA – Artigo IX – Failover Automático

  2. Pingback: Oracle e MAA – Artigo VIII – Fast-Start Failover

  3. Pingback: Oracle e MAA – Artigo X | Blog Fernando Simon

Leave a Reply

Your email address will not be published. Required fields are marked *