Páginas

terça-feira, 6 de maio de 2014

Criar Standby Database

Criar Standby Database para versão standard

Olá a todos,

No artigo de hoje vou comentar sobre STANDBY DATABASE. Um banco de dados standby, também chamado de espera ou aguardando, é uma cópia transacional consistente de um banco de dados de produção, que é inicialmente criado a partir de uma cópia de backup do banco de dados primário. 

Em um próximo artigo, vou mostrar também, como é possível utilizar a versão standard do Oracle para atualizar um banco standby, sem precisar das ferramentas automatizadas da Oracle (DataGuard, por exemplo). Claro que não é a melhor opção, mas o suficiente para quem precisa montar uma segurança (replicação de dados) e tem a versão Standard do banco de dados.
Uma vez que o banco de dados standby é criado e configurado, devemos manter automaticamente o banco de dados standby através da transferência de dados de redo do banco de dados primário para o sistema de espera, onde os dados de redo são aplicados ao banco de dados standby. 

Um banco de dados Standby pode ser um desses tipos: 
  1. Banco de dados standby físico;
  2. Banco de dados standby lógico;
  3. Banco de dados standby instantâneo (snapshot);
Se for necessário, um físico ou um lógico pode assumir o papel de banco de dados principal e assumir o processamento da produção.

  1. Standby Database Físico
    Um banco de dados standby físico é uma cópia exata, bloco para bloco de um banco de dados primário. Um standby físico é mantido como uma cópia exata através de um processo chamado de Redo Apply, em que refazer os dados recebidos a partir de um banco de dados principal é continuamente aplicada a um banco de dados standby, utilizando os mecanismos de recuperação de banco de dados. Um standby físico pode ser aberto para acesso somente leitura e usado para descarregar as consultas de um banco de dados primário. Se uma licença para a opção ativa do Oracle Data Guard for comprada, Redo Apply pode estar ativo enquanto o standby físico está aberto, permitindo consultas para retornar resultados que são idênticos aos que seriam devolvidos a partir do banco de dados primário. Esse recurso é conhecido como o recurso de consulta em tempo real.
  2. Standby Database Lógico
    Um banco de dados standby lógico é inicialmente criado como uma cópia idêntica do banco de dados principal, mas pode ser alterado mais tarde para ter uma estrutura diferente. O banco de dados standby lógico é atualizado executando instruções SQL. Isso permite que os usuários acessem o banco de dados standby para consultas e relatórios a qualquer momento. Assim, o banco de dados standby lógico pode ser usado simultaneamente para proteção de dados e operações de reporte.

        O Data Guard aplica automaticamente as informações do arquivo de redo log arquivados ou em espera refazendo o arquivo de log para o banco de dados standby lógico, transformando os dados nos arquivos de log em instruções SQL e, em seguida, executar as instruções SQL no banco de dados standby lógico. Porque o banco de dados standby lógico é atualizado utilizando instruções SQL, deve permanecer aberto. Embora o banco de dados standby lógico é aberto no modo de leitura / escrita , as suas tabelas de destino para o SQL regenerados estão disponíveis apenas para operações de somente leitura. Embora essas tabelas estão sendo atualizados, eles podem ser usados simultaneamente para outras tarefas, como a elaboração de relatórios, somatórios e consultas . Além disso, essas tarefas podem ser otimizados através da criação de índices adicionais e visualizações materializadas nas tabelas mantidas .

            Um banco de dados standby lógico tem algumas restrições sobre os tipos
            de dados, tipos de tabelas, e os tipos de operações de DDL e DML.
          1. Standby Database Instantâneo - SNAPSHOT
            Um banco de dados standby instantâneo é de um tipo de banco de dados standby atualizável que fornece proteção de dados completo para um banco de dados primário. Um banco de dados standby instantâneo e recebe arquivos, mas não se aplica, refazer os dados de seu banco de dados primário. Refazer os dados recebidos do banco de dados primário é aplicado quando um banco de dados standby instantâneo é convertido novamente em um banco de dados físico de espera, depois de descartar todas as atualizações de locais para o banco de dados standby instantâneo. 

            Um banco de dados standby instantâneo normalmente diverge da sua base de dados primários ao longo do tempo, pois os dados de redo do banco de dados primário não é aplicada, uma vez que é recebido. Atualizações locais para o banco de dados instantâneo espera causará divergência adicional. Os dados na base de dados primário está totalmente protegido no entanto, por causa de uma espera instantâneo pode ser convertido de volta para uma base de dados de reserva física, a qualquer momento, e os dados recebidos a partir de redo o primário, então, ser aplicado.

          Criar Standby Database

          Bem pessoal, tendo conhecimento dos tipos de standby que poderemos criar com o SGBD Oracle, vamos colocar a mão na massa e criar o nosso, com a versão Standard. A princípio o que deveremos fazer é :
          1. Confirmar que o Banco de Dados esta em modo Archivelog;
          2. Fazer backup do Banco de Dados primário, gerando um controlfile para  ser usado no Banco de Dados Standby;
          3. Restaurar esse backup em outra máquina, e abrir o Banco em modo "mount" apenas, com o controlfile standby;
          4. Configurar/criar alguns scripts para automatizar a cópia e aplicação dos archives gerados no Banco Primário.
          Confirmar que o Banco de Dados esta em modo archivelog:
          SQL> select log_mode from v$database;
          LOG_MODE
          ————
          NOARCHIVELOG

          Outra forma de verificar se esta em archive log mode é:

          SQL> archive log list
          Database log mode              No Archive Mode
          Automatic archival             Disabled
          Archive destination            USE_DB_RECOVERY_FILE_DEST
          Oldest online log sequence     61
          Current log sequence           63

          Ok, vimos que o modo archivelog esta desabilitado, para habilitar precisamos parar o banco:
          SQL> shutdown immediate
          Database closed.
          Database dismounted.
          ORACLE instance shut down.

          Subindo a base no estado mount:
          SQL> startup mount;
          ORACLE instance started.
          Total System Global Area  535662592 bytes
          Fixed Size                  1337720 bytes
          Variable Size             327157384 bytes
          Database Buffers          201326592 bytes
          Redo Buffers                5840896 bytes
          Database mounted.

          Alterado o banco para o modo archivelog:
          SQL> alter database archivelog;
          Database altered.

          Abrindo o banco:
          SQL> alter database open;
          Database altered.

          Verificando o estado do archive log:
          SQL> archive log list;
          Database log mode              Archive Mode
          Automatic archival             Enabled
          Archive destination            USE_DB_RECOVERY_FILE_DEST
          Oldest online log sequence     78
          Next log sequence to archive   80
          Current log sequence           80

          Forçando a troca do archive log, com isso, podemos ver se já foi gerado o arquivo de archive log:
          SQL> alter system switch logfile;
          System altered.

          Fazer backup do banco de dados primário:
          ./opt/oracle/.profile --carregar as variárias de ambiente
          export ORACLE_SID=producao --nosso banco "chama" producao
          rman target / nocatalog msglog=/backup/rman/bkpRmanPROD.log

          #--------------------
          Forca um CheckPoint
          #--------------------
          sql 'alter system checkpoint';
          #-----------------------------------------------
          # Realiza CROSSCHECK para os backup's anteriores
          #-----------------------------------------------
          crosscheck backup device type disk;
          crosscheck copy   device type disk;
          crosscheck archivelog all;
          #-----------------------------
          # Deleta os backups anteriores
          #-----------------------------
          delete noprompt backup;
          #----------------------------------------------------------------------
          # Deleta todos os archives, preservando os gerados nas ultimas 24 horas
          #----------------------------------------------------------------------
          delete noprompt archivelog until time 'sysdate - 4';
          #-----------------------------
          # Executa backup dos Datafiles
          #-----------------------------
          run {
              allocate channel c1 device type disk
              format '/backup/rman/df_%d_%U.rman' maxpiecesize 8 G; 

              backup channel c1
              as compressed backupset
              database tag 'DATABASE_FULL';

              release channel c1;
              }
          #---------------------------------
          # Executa backup dos Archives Logs
          #---------------------------------
          run {
               allocate channel c1 device type disk
               format '/backup/rman/al_%d_%U.rman' maxpiecesize 8 G; 
            
               backup channel c1
               tag 'ARCHIVE_LOG'
               ( archivelog all skip inaccessible not backed up );
               release channel c1;
               }
          #-----------------------------------------
          # Executa backup do ControlFile Atualizado
          #-----------------------------------------
          run {
               allocate channel c1 device type disk
               format '/backup/rman/cfnormal_%d_%U.rman'; 
            
               backup channel c1
               tag 'CONTROL_FILE_NORMAL'
               current controlfile;
               release channel c1;
               }
          #-------------------------------------------------
          # Executa backup do StandBy ControlFile Atualizado
          #-------------------------------------------------
          run {
              allocate channel c1 device type disk
              format '/backup/rman/cfstdby_%d_%U.rman'; 
            
              backup channel c1
              tag 'CONTROL_FILE_STBY'
              current controlfile for standby;
              release channel c1;
              }
             exit;


          Se tudo deu certo até aqui, deveremos ter a pasta /backup/rman com os arquivos de backup contendo os datafiles e archiveslog, controlfile e standby controlfile. Todo esse conteúdo deve ser copiado para o outro servidor que conterá o standby database:
          scp -R server01:/backup/rman /backup/.


          Restaurar backup no servidor Standby:
          Devemos confirmar qual o nome do arquivo do controlfile standby que efetuamos o backup: cfstdby_%d_%U.rman 

          ./opt/oracle/.profile --carregar as variárias de ambiente
          export ORACLE_SID=producao --nosso banco "chama" producao
          rman target / nocatalog
          startup nomount;
          restore standby controlfile from '/backup/rman/cfstdby_PROD_ufnlsu7p_1_1.rman' ;
          sql 'alter database mount standby database' ;
          run {
          restore database ;
          }
          recover database ;
          exit ;

          Nesse ponto, nosso Banco de Dados Standby já deve estar ok, pronto para aplicar novos archives. Então basta copiá-los do servidor primário para o servidor Standby, e executar o comando abaixo e seguir as indicações:
          SQL> recover standby database;

          É isso ai pessoal, qualquer dúvida, podem entrar em contato ou comentar. Vou iniciar um novo post para elaborar os scripts que poderão ser usados para automatizar a cópia dos archives de um servidor para o outro. Um forte abraço e boa sorte a todos.

          5 comentários:

          1. Muito bom!
            Porém estou com algumas dúvida...
            Não preciso copiar o arquivo de inicialização do banco de produção e modificar conforme minha base standby?
            Toda vez que copiar o archivelogs do servidor de produção terei de fazer restore na base standby?
            Você tem os scripts para automatizar as tarefas?
            Se puderes me passar por email: gui.of@hotmail.com
            Obrigado!
            Abs

            ResponderExcluir
            Respostas
            1. Olá, gui.of@hotmail.com.
              Acabo de responder o seu comentário em privado, ok??!!
              À priori, o init deverá representar o ambiente em que esta instalado o banco de dados, mesmo porque esse ambiente de contingência não necessariamente deve ser idêntico ao de produção.

              Abraço.

              Excluir
            2. Oi Ricardo, tudo bem? queria muito saber no seu script, como vc faz a copia dos arquives de um ambiente que tem ASM para um que é file system, e como vc copia os redos...

              Excluir
          2. Bao tarde Ricardo, minha dúvida é a mesma do Anônimo, será que terias como enviar também pro meu email? kirrasc@gmail.com

            ResponderExcluir
          3. Excelente ajuda Ricardo, parabéns, muito boa explicação!!
            Uma dúvida, este processo seria apenas uni-direcional, ou seja, replicação dos dados gerados do servidor ativo para um de espera, certo?
            Existe alguma forma de configurar bi-direcional em um Standard Edition?
            Outra questão...
            Caso tenha problemas no servidor, terei de abrir a base Stand by normalmente ou terei de executar outra função? Tem alguma maneira de transferir o dados usados no stand by para o servidor de utilização após a manutenção realizada? Como devo proceder?

            Muito obrigado!!
            Abraços

            ResponderExcluir