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——————————————————-”