Para melhor visualização, recomendo resolução de no mínimo 1024 x 768 e navegador Mozilla Firefox


terça-feira, 15 de setembro de 2009

Gerando backups lógicos de banco de dados no Linux através de um script Perl ...

Por Eduardo Legatti

Olá,

Antes de mostrar o script em "perl" para geração de backups lógicos do Oracle no Linux, através dos utilitários de exportação fornecidos junto com o banco de dados Oracle, irei repetir o que já foi comentado nos artigos de Outubro/2008 e Dezembro/2008: O desenvolvimento de um plano de backup e recuperação é extremamente importante para um servidor de banco de dados. É lógico que, dependendo do caso, um plano adequado de backup e recuperação não tem que ser necessariamente o mais elaborado e complexo ... na verdade, ele precisa ser aquele que irá servir melhor às necessidades de cada negócio. Em geral os tipos de backups dos bancos de dados Oracle se classificam em três categorias simples:

* Backup do sistem operacional (OS)
* Backups gerenciados pelo RMAN (Recovery Manager)
* Backups lógicos

Em resumo, cada tipo de método de backup tem suas próprias vantagens e desvantagens. O processo de criação de uma boa estratégia de backup e recuperação envolve a avaliação dos méritos e problemas desses diferentes tipos de backups, e sua combinação conforme a necessidade para criar um nível aceitável de proteção efetivo.

Vale a pena salientar que o utilitário de exportação não pode ser considerado como uma ferramenta para criação de um método efetivo de backup. Eu diria que ele possibilita um backup lógico, pelo fato de que não é possível aplicar um histórico de redo log nos objetos importados provenientes de um arquivo de exportação. Um backup lógico de um banco de dados envolve a leitura de um conjunto de registros do banco de dados e a gravação destes em um arquivo. Esses registros são lidos independentes das suas localizações físicas. Acredito que uma estratégia robusta de backup possa incluir tanto backups físicos como lógicos. Em geral, bancos de dados de produção contam com backups físicos como seu principal método de backup e backups lógicos servem como um método secundário. Por outro lado, para bancos de dados de desenvolvimento e para pequenos processamentos de movimentação de dados, os backups lógicos podem ser uma solução aceitável e viável.

Portanto, os arquivos dumps gerados pelo utilitário de exportação podem ser utilizados como um recurso complementar ao backup físico de banco de dados para proteção contra erros de usuário. Por exemplo, um backup lógico pode ser útil quando um usuário elimina ou trunca uma tabela acidentalmente ou quando o DBA precisa restaurar uma tabela que apresente erros lógicos, ou uma operação qualquer que tenha afetado somente um subconjunto do banco de dados. Neste caso, um dump de exportação atualizado seria uma alternativa mais rápida e menos traumática do que realizar uma recuperação incompleta de banco de dados, seja ela gerenciada pelo usuário ou através do recovery manager (RMAN). Em todo caso, e dependendo do cenário, isso dependerá muito da versão Oracle utilizada pelo fato de a partir do Oracle 10g, nós já termos a proteção da lixeira (recyclebin) para segmentos que foram dropados e inclusive recursos da tecnologia flashback.

No mais, abaixo existem dois scripts escritos em "perl" que realizam o backup lógico (FULL export) do banco de dados. Eu digo dois porque, o primeiro, faz uso do utilitário de exportação tradicional (exp) para uso no caso de versões Oracle anteriores ao Oracle 10g e, o segundo, faz uso do utilitário Export Data Pump (expdp) para uso nas versões à partir do Oracle 10g.

Em resumo, o script irá gerar o arquivo dump de exportação, compactá-lo através de um utilitário fornecido pelo sistema operacional, renomeá-lo com informações de data, hora e minuto de criação e, por fim, realizar a exclusão de arquivos dump de exportação (compactados) antigos, ou seja, somente os 20 últimos arquivos gerados serão mantidos. Utilizarei o "cron" do linux para agendar a execução diária do script, como demonstrarei mais abaixo:

-- Verificando se o pacote perl está instalado
[root@linux ~]# rpm -q perl
perl-5.8.8-10.el5_0.2

Afim de não expor a senha do usuário DBA de banco de dados SYSTEM no script, irei criar como demonstrado abaixo, um usuário de banco de dados com os privilégios necessários para a realização da exportação FULL.

SQL> create user adm identified by adm
2 default tablespace users
3 quota unlimited on users;

Usuário criado.

SQL> grant create session,create table,exp_full_database to adm;

Concessão bem-sucedida.

Vale a pena salientar que o privilégio de sistema "create table" concedido ao usuário ADM se faz necessário para uso do utilitário Export Data Pump. A única configuração necessária para se realizar no script será o de informar, através da variável $destinoBackup, o local onde deverão ser gerados os backups lógicos do banco de dados. Para quem for utilizar o Export Data Pump (expdp), esta variável deverá ter o mesmo caminho que foi definido no objeto "directory".

-- Script para uso do utilitário exp
#!/usr/bin/perl -w
$destinoBackup = '/backup/oracle/exp';
opendir($destinoBackup,'.') || die "O diretorio de backup($destinoBackup) não existe";
print "Iniciando backup lógico...\n";
system("su - oracle -c \"exp adm/adm file=$destinoBackup/bkpfull.dmp full=y\"");
print "Compactando backup...\n";
system("gzip $destinoBackup/bkpfull.dmp");
@time = localtime(time);
$dataHora = (1900+$time[5])."\-".($time[4]+1)."\-$time[3]_$time[2]-$time[1]h";
system("mv $destinoBackup/bkpfull.dmp.gz $destinoBackup/bkpfull_$dataHora.dmp.gz");
system("find $destinoBackup -mtime +20 -name \"*.dmp.gz\" -exec rm {} ".'\;');

Para uso do Export Data Pump, irei criar o objeto "directory" como demonstrado abaixo:

SQL> create directory exp_dir as '/backup/oracle/expdp';

Diretório criado.

SQL> grant read,write on directory exp_dir to adm;

Concessão bem-sucedida.

-- Script para uso do utilitário expdp
#!/usr/bin/perl -w
$destinoBackup = '/backup/oracle/expdp';
opendir($destinoBackup,'.') || die "O diretorio de backup($destinoBackup) não existe";
print "Iniciando backup lógico...\n";
system("su - oracle -c \"expdp adm/adm directory=exp_dir dumpfile=bkpfull.dmp full=y\"");
print "Compactando backup...\n";
system("gzip $destinoBackup/bkpfull.dmp");
@time = localtime(time);
$dataHora = (1900+$time[5])."\-".($time[4]+1)."\-$time[3]_$time[2]-$time[1]h";
system("mv $destinoBackup/bkpfull.dmp.gz $destinoBackup/bkpfull_$dataHora.dmp.gz");
system("find $destinoBackup -mtime +20 -name \"*.dmp.gz\" -exec rm {} ".'\;');

Independente do utilitário de exportação escolhido, irei mover o script de backup para o diretório /usr/bin e criar uma entrada no "crontab" de forma a agendar a execução do mesmo como, por exemplo, todos os dias às 22:00. Se porventura ocorrer de algum usuário vir a utilizar o banco de dados durante o horário de realização do backup, então seria prudente adicionar a cláusula CONSISTENT=Y ao comando do utilitário de exportação tradicional (exp).

[root@linux ~]# cd /usr/bin
[root@linux ~]# ls -l bkpora
-rwxr-xr-x 1 oracle dba 651 Set 15 08:20 bkpora

[root@linux ~]# crontab -l
00 22 * * * bkpora

Abaixo está um exemplo de execução do script na qual utilizei o Export Data Pump como utilitário de exportação:

[root@linux ~]# ./bkpora
Iniciando backup lógico...

Export: Release 10.2.0.1.0 - Production on Terça-Feira, 15 Setembro, 2009 08:25:57

Copyright (c) 2003, 2005, Oracle. All rights reserved.

Conectado a: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
Iniciando "ADM"."SYS_EXPORT_FULL_01": adm/******** directory=exp_dir
dumpfile=bkpfull.dmp full=y
Estimativa em andamento com o método BLOCKS...
Processando o tipo de objeto DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
Estimativa total usando o método de BLOCKS: 29.93 MB
Processando o tipo de objeto DATABASE_EXPORT/TABLESPACE
Processando o tipo de objeto DATABASE_EXPORT/SYS_USER/USER
Processando o tipo de objeto DATABASE_EXPORT/SCHEMA/USER
Processando o tipo de objeto DATABASE_EXPORT/ROLE
.
.
.
Conjunto de arquivos de dump para ADM.SYS_EXPORT_FULL_01 é:
/backup/oracle/expdp/bkpfull.dmp
O job "ADM"."SYS_EXPORT_FULL_01" foi concluído com sucesso em 08:28:16

Compactando backup...
[root@linux ~]#

prod-web:~ # cd /backup/oracle/expdp
prod-web:/backup/oracle/expdp # ls -lh
total 13M
drwxr-xr-x 2 oracle oinstall 4,0K 2009-09-15 08:10 .
drwxr-xr-x 9 oracle oinstall 4,0K 2009-09-15 08:09 ..
-rw-r----- 1 oracle dba 13M 2009-09-15 08:28 bkpfull_2009-9-15_08-28h.dmp.gz
-rw-r--r-- 1 oracle dba 23K 2009-08-26 08:28 export.log

No mais, ao longo dos dias, será possível visualizar os arquivos gerados como demonstrado no exemplo abaixo, mas, sempre que for possível eu recomendaria movê-los para um local seguro.

[root@linux ~]# ls -lhatr
total 3,8G
drwxr-xr-x 4 root root 4,0K Mai 27 22:05 ..
-rw-r--r-- 1 oracle dba 182M Jul 31 22:05 bkpfull_2009-7-31_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 1 22:05 bkpfull_2009-8-1_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 2 22:05 bkpfull_2009-8-2_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 3 22:04 bkpfull_2009-8-3_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 4 22:05 bkpfull_2009-8-4_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 5 22:05 bkpfull_2009-8-5_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 6 22:04 bkpfull_2009-8-6_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 7 22:05 bkpfull_2009-8-7_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 8 22:05 bkpfull_2009-8-8_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 9 22:05 bkpfull_2009-8-9_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 183M Ago 10 22:05 bkpfull_2009-8-10_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 183M Ago 11 22:05 bkpfull_2009-8-11_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 12 22:05 bkpfull_2009-8-12_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 13 22:05 bkpfull_2009-8-13_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 14 22:05 bkpfull_2009-8-14_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 15 22:05 bkpfull_2009-8-15_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 16 22:05 bkpfull_2009-8-16_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 17 22:05 bkpfull_2009-8-17_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 18 22:05 bkpfull_2009-8-18_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 19 22:05 bkpfull_2009-8-19_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 183M Ago 20 22:05 bkpfull_2009-8-20_22-6h.dmp.gz

Google+

4 comentários:

David Ricardo disse...

Execlente Post Eduardo, muito, mais muito util mesmo, programação PERL é sem dúvida uma "carta na manga", já vi coisas incriveis feitas em PERL.
Muito bom post.
Abraço e Sucesso!!!

Eduardo Legatti disse...

Olá David,

Dentre as várias aplicações de uso e além de ser multi-plataforma, realmente o perl para shell scripting é uma mão na roda ;-)

Abraços e até mais ...

Aderbal Machado disse...

Excelente Post Eduardo, obrigado por compartilhar, desculpe minha ignorância, como se restaura um backup lógico?

Abraços.

Aderbal.

Eduardo Legatti disse...

Olá Aderbal,

Um backup lógico no Oracle (dump) pode ser gerado pelos utilitários de exportação (exp, expdp) e restaurados pelos utilitários (imp, impdp).

Vale a pena salientar que os utilitários (exp/imp) ficaram obsoletos depois do lançamento dos utilitários expdp/impdp) a partir do Oracle 10g.

expdp = Datapump Export
impdp = Datapump Import

Exemplo utilizando (expdp/impdp):

-- exportação
expdp system/manager schemas=SCOTT DUMPFILE=scott.dmp

-- restauração
impdp system/manager schemas=SCOTT DUMPFILE=scott.dmp

Para maiores informações e exemplo,s você pode verificar na documentação oficial do Oracle.

http://docs.oracle.com/cd/B19306_01/server.102/b14215/dp_import.htm

Abraços e até mais

Legatti

Postagens populares