sexta-feira, 6 de dezembro de 2013

Montar o Famoso Oracle Fail Over mais conhecido como Standby

Oracle Fail Over é muito utilizado para “meso-alta-disponibilidade”. Claro que não podemos chamar essa solução de alta-disponibilidade pois essa denominação é do Oracle Real Application Cluster (RAC). Qual ambiente de Banco de Dados não precisa de segurança? Alguns precisam de mais outros de menos mas, todos precisam de segurança!! Uma maneira eficaz de manter uma cópia do Banco de Dados é fazer, frequentemente, uma replicação de uma base de dados para outra, automaticamente.
Neste artigo, montaremos um fail over onde, o Banco de Dados standby ficará aberto somente para leitura e não possibilitará a alteração dos dados. A replicação será feita de 30 em 30 minutos mas poderá ser ajustada de acordo com a necessidade. Toda a operação será automatizada e feita através de um script. Fiquem atentos, pois todos os mínimos detalhes serão mostrados aqui para que possamos enriquecer nosso conhecimento.
Ah! Um detalhe…. esse ambiente será montado em linux podendo ser adaptado para windows facilemente!!
   
Primeiro passo:
Identificar os componentes do ambiente:
  1. Primary Database;
  2. Standby Database;
  3. Sites.
  
Segundo Passo:
Verificar os pré-requisitos para implementação do Standby:
  1. O sistema operacional dos dois servidores precisam ser os mesmos mas não necessariamente da mesma distribuição, por exemplo, se no primary database tiver um Linux Red Hat 4, no standby database deverá ter linux também mas poderá ter Red Hat 3 ou 5. Não pode montar esse ambiente que iremos criar se o Primary tiver linux e o Standby tiver outra plataforma como windows ou solaris, por exemplo.
  2. A estrutura do Banco de Dados dos dois servidores deve ser igual, por exemplo, se os diretórios udump, cdump, adump, etc do Primary estiver em /oracle/products/admin, no Standby devem estar no mesmo diretório. Da mesma forma com os dados, redo e controlfiles.
  3. Os servidores não precisam ser necessariamente iguais. Dependendo da aplicabilidade, não é preciso que sejam iguais, por exemplo, se a minha intenção é montar um banco standby apenas para backup, não é necessário que os dois servidores tenham a mesma robustez, posso aceitar um servidor inferior para o standby. Da mesma forma se a minha intenção for montar um standby apenas para leitura (com é o nosso caso).
Agora sim, já estamos prontos para colocarmos a mão na massa….
  
A primeira coisa à fazer é colocar nosso Banco de Dados Primary (Banco de Dados de produção) em modo archivelog, caso não esteja. Se seu banco não pode ser derrubado pó conta de contingência, devemos esperar o momento certo para isso. Esse momento será descrito daqui à pouco. Vamos definir onde os logs serão arquivados. Por questão de segurança, devemos definir 2 (dois ) locais para isso. Sendo assim, definiremos, caso não esteja definido, os locais /flash/archivelogs/arc1 e /flash/archivelogs/arc2.
Admitindo que nosso banco de dados de produção (primary) terá que ficar o menor tempo possível fora do ar, iremos “bolar um plano infalível”.
Esse plano infalível contém os seguinte passos:
  1. Preparar o servidor standby;
  2. Instalar o software Oracle;
  3. Se certificar se os dois servidores estão acessíveis entre si, na rede;
  4. Alterar os parêmetros (caso não esteja setado) log_archive_dest_1 e log_archive_dest_2 para apontar respectivamente para os diretórios /flash/archivelogs/arc1 e /flash/archivelogs/arc2;
  5. Derrubar o banco de produção;
  6. coloca-lo em modo mount;
  7. Habilitar o arquivamento;
  8. derrubar o banco de produção;
  9. copiar os arquivos para o servidor standby;
  10. Levantar o banco de produção;
  11. configurar o restante do ambiente, tranquilamente e sem riscos.
  
Agora que já temos um roteiro, vamos detalhar cada passo dele…
  
É aconselhável instalar o sistema operacional com o particionamento pertinentes ao Banco de Dados igual ao do servidor de produção.

Temos que definir alguns parâmetros como ip, nome do servidor, etc…

Servidor Primary:
IP: 192.160.0.1
Nome do Servidor: primary
Senha do usuário root: 123456
Senha do usuário oracle: oracle
  
Servidor Standby:
IP: 192.160.0.2
Nome do Servidor: standby
Senha do usuário root: 123456
Senha do usuário oracle: oracle
  
Depois de instalar o sistema operacional, basta instalar o software da Oracle. É importante lembrar que o ORACLE_HOME não precisa ser igual ao do servidor de produção.
Executemos um comando ping de um servidor para o outro apenas para nos certificarmos que estão “conversando” entre si.
Iremos criar o diretório admin no servidor standby. Esse diretório deve ser criado juntamente com seus subdiretórios (adump, cdump, udump, etc). Não é necessário copiar os arquivos contidos nesses diretórios, basta apenas criar/copiar os diretórios vazios. Criemos também os diretórios (vazios) do repositório dos dados (exemplo, /oradata/db) e dos logs (/flash/archivelogs/arc1 e /flash/archivelogs/arc1).
Vamos agora alterar, no banco de produção pois, o banco standby ainda não foi criado, os parâmetros log_archive_dest_1 e log_archive_dest_2 para apontar, respectivamente, para /flash/archivelogs/arc1 e /flash/archivelogs/arc2. Faremos isso com os seguintes comandos:
sql> alter system set log_archive_dest_1=’LOCATION=/flash/archivelogs/arc1’ scope=spfile;
sql> alter system set log_archive_dest_2=’LOCATION=/flash/archivelogs/arc2’ scope=spfile;
Depois de alterar as localizações dos archivelogs, vamos derrubar o banco de produção, montá-lo, colocarmos em modo archivelog, derruba-lo novamente:

sql> shutdown immediate
sql> startup mount
sql> alter database archivelog;
sql> shutdown immediate
Teremos que criar um standby controlfile apartir do banco de produção (primary). Para fazermos isso, basta executarmos os comandos abaixo:
sql> startup mount
sql> alter database create standby controlfile as ‘/orace/ctrlstandby.ora’;
sql> shutdown immediate
  
  
Agora iremos copiar todos os arquivos do banco de dados de produção para o servidor standby. Os arquivos devem ficar no mesmo diretório no servidor standby!!! Os controlfiles não serão copiados, ao invés disso, o novo controlfile que acabamos de criar (stanbdby.ctl) será copiado para o servidor standby colocando-o na mesma localização que se encontra os controlfiles no servidor de produção (primary). Depois de copiar o standby controlfile, teremos que renomeá-lo para o mesmo nome dos controlfiles do servidor de produção. Sabemos que o Oracle precisa ter pelo menos 3 (três) controlfiles e que todos eles são iguais, sendo assim, basta fazermos três copias do standby controlfile e renomeá-los.

Para efetuar essa cópia, fica à seu critério a forma como proceder, ou seja, você pode criar uma partição NFS, colocar os arquivos num hd externo e levar para o servidor standby, copiar utilizando o scp, etc. Vamos utilizar o scp para realizar essa operação. Para que os servidores “conversem” entre si, sem complicações, vamos editar o arquivo hosts dos dois servidores (esse método também se aplica para o windows):

[root@primary /]$ vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1          localhost.localdomain   localhost
192.168.0.1     primary
192.168.0.2     standby
  
No caso do windows, clique em iniciar>executar e digite %systemroot%\system32\drivers\etc\hosts e edite o arquivo:
# Copyright (c) 1993-1999 Microsoft Corp.
#
# Este é um arquivo HOSTS de exemplo usado pelo Microsoft TCP/IP para Windows.
#
# Este arquivo contém os mapeamentos de endereços IP para nomes de host. Cada
# entrada deve ser mantida em uma linha individual. O endereço IP deve
# ser colocado na primeira coluna, seguido do nome de host correspondente.
# O endereço IP e o nome do host devem ser separados por pelo menos um
# espaço.
#
# Adicionalmente, comentários (como estes) podem ser inseridos em linhas
# individuais ou após o nome de computador indicado por um símbolo ‘#’.
#
# Por exemplo:
#
#      102.54.94.97     rino.acme.com           # servidor de origem
#       38.25.63.10     x.acme.com              # host cliente x
127.0.0.1       localhost
192.168.0.1     primary
192.168.0.2     standby
  
Depois de editar o arquivo hosts dos dois servidores, vamos copiar os arquivos do Banco de Dados de Produção (primary) para o servidor standby, utilizando o scp:

[oracle@primary oracle]$ scp /oradata/producao/* oracle@standby:/oradata/producao/
[oracle@primary oracle]$ scp /flash/archivelogs/arc1/* oracle@standby:/flash/archivelogs/arc1
[oracle@primary oracle]$ scp /flash/archivelogs/arc2/* oracle@standby:/flash/archivelogs/arc2

Ao executar o scp pela primeira vez, ele deve pedir a senha do usuário oracle do servidor standby, basta informar e efetuar a cópia. Dependendo do tamanho do banco de dados, do link entre os dois servidores e da tolerância da indisponibilidade do banco de produção, pode-se adotar outro método para transferência desses arquivos.
Depois de copiar os arquivos, mesmo que o banco standby não esteja no ar, já pode levantar o banco de dados de produção (primary).

sql> startup

Como sabemos, para podermos iniciar qualquer Banco de Dados Oracle, precisamos de um SPFILE ou PFILE. O nosso banco standby será inicado com o PFILE, sendo assim, teremos que criar um pfile para o banco standby:
 sql> create pfile=’/oracle/initstandby.ora’ from spfile; 

  
Pronto, agora basta copiar o initstandby.ora para o diretório $ORACLE_HOME/dbs do servidor standby.
Está tudo no seu devido lugar, se quisermos neste momento levantar o banco standby, podemos!! Mas não iremos fazê-lo agora…. vamos deixar para a AUTOMATIZAÇÂO. Para isso, precisamos fazer alguns preparativos para a automatização.
 Nesse nosso projetinho, iremos automatizar a replicação com SCP mas nada impede de usar o NFS que além de ser mais fácil, é mais rápido também. Mesmo assim, iremos fazer da forma mais difícil pois, quem está preparado para o mais difícil, tira o mais fácil de letra!! Caso você tenha copiado os arquivos via SCP, lembra que o sistema operacional pediu autenticação (senha)? Então, na automatização ele não pode pedir senha…. sendo assim, vamos configurar o ambiente para trabalhar com trust connection. 
Para configurar o ambiente para não pedir senha (será útil tanto para ssh como para scp), basta seguirmos as instruções abaixo:
É importante salientar que não recomendável que essa configuração seja feita para o usuário ROOT, por questões de segurança. Sendo assim, iremos fazer para o usuário ORACLE do sistema operacional.
Entre com o usuário ORACLE no servidor de produção e execute o seguinte comando:
 [oracle@standby: ~]$ ssh-keygen -t dsa
Generating public/private dsa key pair.Enter file in which to save the key (/home/oracle/.ssh/id_dsa):
Created directory ‘/home/acesso/.ssh’.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/oracle/.ssh/id_dsa.
Your public key has been saved in /home/oracle/.ssh/id_dsa.pub.
The key fingerprint is:
84:fe:az:f7:ee:9f:6f:45:b7:66:96:11:9u:81:50:7f oracle@oracle
Esse procedimento criará 2 (dois ) arquivos: id_dsa e id_dsa.pub
Agora digite:
[oracle@primary: ~]$ cd ~/.ssh
[oracle@primary: ~]$ cp id_ds.pub authorized_keys 
Descomente a linha: AuthorizedKeysFile %h/.ssh/authorized_keys    no arquivo /etc/ssh/sshd_config.
Agora, reinicie o SSH e vamos testar localmente com o seguinte comando:
 [oracle@primary: ~]$ ssh localhost
Last login: Sun Dec 15 18:51:32 2002 from server.linuxajuda.org
Linux 2.4.18.
[oracle@primary:~]$
Pronto, agora vamos configurar para acessar remotamente o servidor standby sem pedir senha. Envie sua chave pública para o standby com o seguinte comando:

[oracle@primary: ~]$ scp id_dsa.pub oracle@standby:/home/oracle
oracle@standby’s password:
id_dsa.pub 100% |*****************************| 612 00:00

 
Pronto! Agora logamos no standby e inserimos nossa chave no authorized_keys dele
[oracle@primary: ~]$ ssh oracle@standby
Insira pela ultima vez a sua senha e execute o seguinte comando:
  [oracle@standby: ~]$ cat id_dsa.pub >> .ssh/authorized_keys 
Caso o arquivo de destino não existit, basta criá-lo:
 [oracle@standby: ~]$ touch .ssh/authorized_keys 
O standby também tem que ter a linha descomentada no /etc/ssh/sshd_config

[
oracle@standby:~/.ssh]$ ssh oracle@standby
Last login: Mon Nov 03 19:11:54 2003 from server.linuxajuda.org
Linux 2.4.18.
[oracle@standby~]$

 
Se chegamos até aqui, então já foi uma grande vitória!! Só faltam alguns passos para completarmos o processo de automação.
Agora iremos criar um usuário chamado standbypitt no banco de produção (primary) com a senha 123bypitt e conceder a role connect e DBA para este usuário.
Abaixo segue de graça, uma mão na roda, o script de replicação que ainda faz o backup dos archivelogs. Para fazer a replicação, basta executar esse script. Para fazer o backup basta executar esse script com o parâmetro BACKUP:
 [oracle@producao: scripts]$ ./replicação.sh BACKUP  
Basta criar os diretório que aparecem no script ou alterá-lo para melhor se adequar ao seu ambiente e pronto!!! Lembrando que esse script deverá ser executado no servidor de produção (primary) com o usuário oracle e, para automatizar, basta agendá-lo no crontab e fazê-lo executar o script de 30 em 30 minutos. A execução do script com o parâmetro BACKUP, sugiro que seja feito uma vez por dia no minuto 15, já que a replicação será feita ao 0 (zero) minutos e aos 30 (trinta) minutos.
  
#!/bin/sh
##########################################################################
# Objetivo: Replicar dados do Banco de Dados                             #
#                                                                        #
##########################################################################
  
ORACLE_SID=producao
REDE=pitt
export ORACLE_SIDBACKUP=BACKUP   crialog()
{
 DATA=`date +%Y_%m_%d_%H_%M_%S`
 echo “Erro na rede…”                                       >> /oracle/scripts/log/erro_$DATA.log
 echo “Nao foi possivel acessar STANDBY…” >> /oracle/scripts/log/erro_$DATA.log
 echo “Falha no processo de $1″                       >> /oracle/scripts/log/erro_$DATA.log
 }  
testarede(){  
REDE=`ping standby -c 1 | grep 100% | grep packet | grep loss`
 }
 switchlog(){
sqlplus standbypitt/123bypitt <<EOS   
  alter system switch logfile;   
  @/oracle/scripts/current_log.sql;
exit
EOS
echo “Gerou archive”
}

testacopia()
{
testarede
echo $REDE
case $REDE in
    “”)  copia ;;
    *)   crialog “copia dos archives…”;;
esac
}
copia()
{
    sleep 5
    rsync -e ssh -Pazv /flash/archivelogs/arc2/ oracle@standby:/flash/archivelogs/arc2
echo “copiou…”
}
   
replica()
{
ssh oracle@standby<<EOO
sqlplus / as sysdba<<EOS
shutdown immediate       
startup nomount      
alter database mount standby database;  
recover automatic  standby database;      
exit
EOS 
sqlplus / as sysdba<<EOS    
       shutdown immediate      
       startup nomount      
       alter database mount standby database;      
       alter database open read only;
       @/oracle/scripts/current_log.sql
       exit
EOS 
find /flash/archivelogs/arc2arc2/ -atime 3  -exec rm -f ‘{}’ \;
EOO   
DATA=`date +%Y_%m_%d`  
zip /oradata/backup/arcbackup/backup_{$DATA}_.zip /flash/archivelogs/arc2/*#  
rm -rf /flash/archivelogs/arc2/* 
}
backup()
{
 DATA=`date +%Y_%m_%d_%H_%M_%S`
 zip /oradata/backup/arcbackup/arcbackup_$DATA.zip /flash/archivelogs/arc1/* 
find /flash/archivelogs/arc1/ -atime 3 -exec rm -f ‘{}’ \; 
find /flash/archivelogs/arc2/ -atime 3 -exec rm -f ‘{}’ \; 
       rm -rf /flash/archivelogs/arc2/*
EOO
}
   
echo “————————————————-COMECO————————————————–”
testarede
echo $REDE
case $REDE in
    “”) switchlog
        testacopia
        ;;
    *)  crialog “copia dos archives…”;;
esac
  
testarede
echo $REDE
case $REDE in
    “”) replica
        ;;
    *)  crialog “replicacao dos dados…”;;
esac
 if [ "$1" == "$BACKUP" ] then 
    backup
fi  

echo “————————————————–FIM——————————————————-”

Nenhum comentário:

Postar um comentário