Oracle StandB - Pedro F. Carvalho
Transcrição
Oracle StandB - Pedro F. Carvalho
Pedro F. Carvalho Analista de Sistemas [email protected] COLOCANDO UM BANCO DE DADOS STANDY BY 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: Pedro F. Carvalho Analista de Sistemas [email protected] 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. 2. 3. 4. Preparar o servidor standby; Instalar o software Oracle; Se certificar se os dois servidores estão acessíveis entre si, na rede; 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… Pedro F. Carvalho Analista de Sistemas [email protected] É 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> sql> sql> sql> shutdown immediate startup mount alter database archivelog; shutdown immediate Pedro F. Carvalho Analista de Sistemas [email protected] 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: # Pedro F. Carvalho Analista de Sistemas [email protected] # 102.54.94.97 rino.acme.com # 38.25.63.10 x.acme.com 127.0.0.1 localhost 192.168.0.1 primary 192.168.0.2 standby # servidor de origem # host cliente x 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]$ oracle@standby:/oradata/producao/ [oracle@primary oracle]$ oracle@standby:/flash/archivelogs/arc1 [oracle@primary oracle]$ oracle@standby:/flash/archivelogs/arc2 scp /oradata/producao/* scp /flash/archivelogs/arc1/* scp /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. Pedro F. Carvalho Analista de Sistemas [email protected] 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: Pedro F. Carvalho Analista de Sistemas [email protected] [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 # # Autor : Eder Ferreira # # Data : 24/08/2007 # ##################################################### ##################### ORACLE_SID=producao REDE=pitt Pedro F. Carvalho Analista de Sistemas [email protected] 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…” } Pedro F. Carvalho Analista de Sistemas [email protected] 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/* } Pedro F. Carvalho Analista de Sistemas [email protected] 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 ‘{}’ \; ssh oracle@smtt<<EOO 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 Pedro F. Carvalho Analista de Sistemas [email protected] fi echo “————————————————–FIM——————————————————-”