No artigo de hoje irei apresentar um método para recuperação de dados no Oracle Database 10G, utilizando a ferramenta predileta dos DBAs para Backup and Recovery: o RMAN (Recovery Manager).
O método que irei apresentar neste artigo, é muito útil para recuperação em BDs de produção, pois permite recuperar os dados desejados em um BD auxiliar e posteriormente exportá-los p/ o BD de produção, sem a necessidade de tirá-lo do ar. O BD de produção permanece ONLINE durante todo o processo de recuperação, o que não é possível em muitos cenários sem a utilização de um BD auxiliar!
Outro ponto importante deste método de recuperação, é que ele permite selecionar o ponto no tempo dos dados que você precisa restaurar, ou seja, ele permite, por exemplo, que você restaure os dados de 1 semana atrás de uma ou mais tabelas!
O método que irei apresentar neste artigo, é muito útil para recuperação em BDs de produção, pois permite recuperar os dados desejados em um BD auxiliar e posteriormente exportá-los p/ o BD de produção, sem a necessidade de tirá-lo do ar. O BD de produção permanece ONLINE durante todo o processo de recuperação, o que não é possível em muitos cenários sem a utilização de um BD auxiliar!
Outro ponto importante deste método de recuperação, é que ele permite selecionar o ponto no tempo dos dados que você precisa restaurar, ou seja, ele permite, por exemplo, que você restaure os dados de 1 semana atrás de uma ou mais tabelas!
O BD auxiliar, nesse contexto, pode ser entendido como um BD temporário que será utilizado para:
- Recuperar os dados de somente um Tablespace (ao invés do BD inteiro);
- Permitir que sejam selecionados os objetos (Ex.: tabelas e packages) que precisam ser recuperados e posteriormente, exportá-los p/ o BD de produção.
O roteiro do processo de recuperação utilizando Tablespace Point in Time Recovery, que será apresentado neste artigo, eu criei no mês passado (09/2011) utilizando como base o artigo (que me ajudou muito) RMAN – Tablespace Point in Time Recovery do Blog do Bruno Murassaki. No artigo do Murassaki, ele propõe criar o BD auxiliar na mesma máquina do BD de produção. Para diminuir riscos de segurança, eu prefiro criar o BD auxiliar em uma máquina separada e é esta a principal diferença entre o artigo dele e o meu. Outra diferença, é que proponho a criação do BD auxiliar utilizando o DBCA (Database Configuration Assistant).
O roteiro de recuperação será composto de 3 fases:
1- Criação de um BD auxiliar, em uma máquina diferente da máquina do BD de produção;
2- Recuperação dos dados de 1 semana atrás (19/10/2011 12:30h), de um tablespace chamado TSEXEMPLO, de um BD de produção chamado PROD;
3- Exportação dos dados desejados do BD auxiliar p/ o BD de produção.
------------------------------------------------------------------------
ROTEIRO PASSO-A-PASSO
------------------------------------------------------------------------
Termos e comandos utilizados neste roteiro:
a) BD TARGET: neste cenário será o BD de produção.
b) BD AUXILIAR: BD temporário em que os dados serão recuperados p/ posteriormente serem exportados p/ o BD de produção. O BD auxiliar deve ter o mesmo nome (SID) do BD de produção.
Para utilizar este roteiro é necessário ter conhecimentos prévios de RMAN e de administração de Oracle Database, pois ele não apresenta todos os comandos necessários para realizar cada passo, como por exemplo, como instalar o BD usando DBCA e como iniciar um BD em modo NOMOUNT. Também é necessário estar atento para substituir os valores necessários dos exemplos de acordo com a sua necessidade.
Passo 1- Criação do BD auxiliar:
Criar BD auxiliar em uma máquina de testes, separada do BD target, via DBCA, utilizando como template o BD target. Durante o processo de instalação é necessário configurar os seguintes parâmetros de inicialização:
- DB_FILES: Configure para o mesmo valor do Bd target.
Ex.: DB_FILES = 1000
- DB_FILE_NAME_CONVERT: Configure para conter o valor do diretório de datafiles do BD target e um valor correspondente ao mesmo diretório p/ o BD auxiliar. Todos os diretórios de datafiles do bd target devem estar contidos neste parâmetro. Antes de configurar este parâmetro crie no bd auxiliar os diretórios correspondentes.
Ex.: DB_FILE_NAME_CONVERT = '/oradata/prod','/oradata/aux','/oraind/prod/','/oraind/aux'
- LOG_FILE_NAME_CONVERT: Configure p/ conter o valor do diretório de logfiles do bd target e um valor correspondente ao mesmo diretório p/ o BD auxiliar. Todos os diretórios de logfiles do bd target devem estar contidos neste parâmetro. Antes de configurar este parâmetro, crie no BD auxiliar os diretórios correspondentes.
Ex.: LOG_FILE_NAME_CONVERT='/oralog/prod/log1','/oralog/aux/log1'
- SGA_TARGET, SGA_MAX_SIZE e PGA_AGGREGATE_TARGET: Configure para conter um valor que possa ser configurado na máquina de testes, de acordo com a qtde. de RAM disponível.
Passo 2- Recuperação dos dados desejados utilizando o BD auxiliar:
a) Copie p/ a máquina do BD auxiliar a pasta contendo todas as peças de backup e archive logs (se existir) do BD target;
b) Na máquina do BD auxiliar acrescente no arquivo tnsnames.ora um álias p/ a instância do BD target. Nome sugerido: PROD.
c) Na máquina do BD auxiliar, inicie o BD auxiliar em modo NOMOUNT:
a) Copie p/ a máquina do BD auxiliar a pasta contendo todas as peças de backup e archive logs (se existir) do BD target;
b) Na máquina do BD auxiliar acrescente no arquivo tnsnames.ora um álias p/ a instância do BD target. Nome sugerido: PROD.
c) Na máquina do BD auxiliar, inicie o BD auxiliar em modo NOMOUNT:
d) Na máquina do BD auxiliar, conecte-se no RMAN referenciando o BD target e o bd auxiliar:
Ex.: export ORACLE_SID=bd_auxiliar
rman target sys/XXX@bd_target auxiliary sys/YYY
e) No prompt de comandos do RMAN, execute o restore e recover de um controlfile do BD target no BD auxiliar e monte o BD auxiliar (que também será chamado de BD clone):
Ex.:
run{
set until time "to_date('2011-10-19-12:30:00','yyyy-mm-dd-hh24:mi:ss')";
restore clone controlfile;
sql clone 'alter database mount clone database';
sql 'alter system archive log current';
sql 'begin dbms_backup_restore.AutoBackupFlag(FALSE); end;';
}
f) Execute o restore e recover dos principais datafiles (system, sysaux e undo) do BD target e do(s) datafile(s) correspondente(s) ao tablespace que será recuperado. Para este passo será necessário consultar no BD target o número do(s) datafile(s) desejado(s), através da consulta abaixo:
select file_id from DBA_DATA_FILES where TABLESPACE_NAME = 'TSEXEMPLO';
Depois execute no prompt do RMAN, o script:
RUN{
set until time "to_date('2011-10-19-12:30:00','yyyy-mm-dd-hh24:mi:ss')";
set newname for datafile 1 to "/oradata/aux/system01.dbf";
set newname for datafile 2 to "/oradata/aux/undotbs01.dbf";
set newname for datafile 3 to "/oradata/aux/aux01.dbf";
set newname for datafile 211 to "/oradata/aux/exemplo.dbf";
switch clone tempfile all;
restore clone datafile 1, 2, 3, 211;
switch clone datafile all;
sql clone "alter database datafile 1 online";
sql clone "alter database datafile 2 online";
sql clone "alter database datafile 3 online";
sql clone "alter database datafile 211 online";
recover clone database tablespace "TSEXEMPLO", "SYSAUX", "SYSTEM", "UNDOTBS1" delete archivelog;
alter clone database open resetlogs;
sql clone "create tablespace temp datafile '/oradata/aux/temp01.dbf' size 500K";
}
Passo 3- Exportação dos dados desejados, do BD auxiliar para o BD de produção:
a) Na máquina do BD auxiliar, execute um export convencional (Datapump não irá funcionar) do(s) schema(s) referente(s) ao tablespace recuperado:
Ex.: exp userid sys/XXX as sysdba file=file.dmp log=file.log owner=YYY
Ex.: exp userid sys/XXX as sysdba file=file.dmp log=file.log owner=YYY
Obs.: Substitua XXX pela senha do usuário SYS no Bd auxiliar e YYY pelo nome do usuário que vc precisa recuperar os dados
b) Na máquina do BD target, apague o(s) objeto(s) que vc irá recuperar:
Ex.: DROP TABLE SCHEMA.TABLE_NAME;
b) Na máquina do BD target, apague o(s) objeto(s) que vc irá recuperar:
Ex.: DROP TABLE SCHEMA.TABLE_NAME;
c) Na máquina do BD target copie o dump gerado no item a) deste passo e faça um import convencional dos dados desejados:
Ex.: export ORACLE_SID=bd_target
imp userid =sys/XXX as sysdba file=file.dmp log=file.log full=y
Obs.: Substitua XXX pela senha do usuário sys
Ex.: export ORACLE_SID=bd_target
imp userid =sys/XXX as sysdba file=file.dmp log=file.log full=y
Obs.: Substitua XXX pela senha do usuário sys
d) Pronto, agora é só conferir se os dados foram recuperados com sucesso!
Para mais informações sobre RMAN Tablespace Point-in-Time Recovery, consulte a documentação oficial da Oracle no link:
http://download.oracle.com/docs/cd/B19306_01/backup.102/b14191/rcmtspit.htm.
Por hoje é só!
[]s
Referências:
Olá Fabio, gostaria de tirar uma dúvida em relação a ambiente de produção x ambiente de teste... Como posso manter os dados do ambiente de teste em relação ao ambiente de produção sempre atualizados? Existe alguma maneira sem ser utilizando a questao do Backup/Restore full do ambiente de produção para o de teste? Pois tenho receio que isso possa sobescrever procedures, functions, ou ate mesmo apaga-las, seja em oracle, postgresql e etc...Qual seria a maneira mais eficiente de manter um ambiente de teste atualizado quando fosse solicitado?
ResponderExcluirTiago, não conheço mas já ouvi dizer que existem ferramentas que ajudam neste trabalho de atualização dos dados em ambientes de teste ou homologação. No Oracle, o que costuma-se utilizar muito é o DataPump, uma ferramenta que permite você exportar/importar dados de um BD para outro, que por padrão não substitui os objetos, porém existe aí outro problema: os dados ficarão exatamente iguais e muitos sistemas, em ambiente de testes, teriam que ter estes dados "desconfigurados", diferentes dos dados reais. Para resolver este último problema a Oracle tem um produto chamado Oracle Data Masking, que infelizmente não conheço, pois é necessário pagar licenciamento adicional para o seu uso.
Excluir[]s