Como executar expdp com compressão de dados no Oracle 10g e 11g

This post is also available in: English

Muitas pessoas ainda relutam em utilizar o Oracle export Data Pump (expdp) no 10g por não haver um método eficaz de compressão via pipe como existe no simples comando export (exp). A partir da versão 11g, a Oracle adicionou o parâmetro "COMPRESS=ALL" que ajuda na compactação do arquivo dump gerado, mas ainda assim utiliza mecanismos internos do Oracle para compressão, sem possibilitar ao usuário escolher a melhor forma de compactação. Ele também exige que você adquira a "Advanced Compression Option".

Para resolver isso, desenvolvi um script que executa uma compressão em paralela dos arquivos dumps gerados pelo expdp, fazendo de uma forma eficiente como o pipe e se utilizando do artifício de tamanho máximo do arquivo de DUMP do expdp, ainda podendo aproveitar o paralelismo.

1) Como o script funciona?

Ao chamarmos o expdp, definimos um valor para o parâmetro "FILESIZE" de, por exemplo, 1GB:
ex: expdp full=Y directory=... dumpfile=expfile.%u.dmp logfile=expfile.log filesize=1G

Desta forma, supondo que o total do seu DUMP seja de 30 GBs, o expdp irá gerar o primeiro arquivo de 1GB e quando terminar, começará a gravar o segundo. Neste momento, um script paralelo de compressão irá compactar o primeiro arquivo gerado enquanto o segundo arquivo está sendo gravado pelo banco. A compressão poderá usar bzip2, gzip ou qualquer outro algorítmo de sua preferência e presente no seu servidor.

O script pode ainda se aproveitar do parâmetro "PARALLEL" e começar a gravar diversos arquivos em paralelo. Conforme estes forem chegando ao tamanho definido pelo "FILESIZE", a compressão vai sendo executada em background tornando o export muito mais rápido:
ex: expdp full=Y directory=... dumpfile=expfile.%u.dmp logfile=expfile.log filesize=1G parallel=8

Este script suporta também export parciais de schemas (via parametrização). Por default, ele executará um FULL do banco, com um dos comandos abaixo (conforme escolhido na parametrização):

  • EXPDP: expdp full=y directory=... dumpfile=... logfile=... filesize=... parallel=...
  • EXP:      exp file=... log=... full=y consistent=y compress=n buffer=9999999 statistics=none direct=y

2) Requisitos

  • O script foi testado em Linux, HP-UX e Solaris. Na verdade, o requisito básico é que existam comandos primários de unix (cd, mktemp, mkfifo, awk, head, etc).
  • Necessário que o banco que deseja ser feito o backup esteja cadastrado no oratab da máquina (exp e expdp) ou remotamente no TNSNAMES (apenas para exp remoto).
  • O script de compressão que for desejado deve estar instalado (gzip, bzip2, zip, compress, ...).

3) Como instalar?

Baixe ele aqui!

Descompacte a árvore de diretórios "exp" do zip acima na pasta que deseja configurar o Data Pump. Nesta árvore ficarão apenas os shell scripts, arquivos de configuração e logs. Os dumps gerados ficarão em um destino parametrizável.

exp-tree

A pasta possui 3 subdiretórios básicos:

  • Pasta SH - Contém os shells responsáveis pelo export e compressão. Não é necessário alterá-los.
  • Pasta CFG - Contém os arquivos de configuração parametrizável para cada instância.
  • Pasta LOG - Contém os logs das execuções.

A pasta SH contém 4 shells:

  • expcron.sh - Esse shell apenas centraliza a execução de tudo e salva o log. É ele que deverá sempre ser chamado.
  • expfull.sh - Esse shell faz toda a lógica do processo de export do Oracle.
  • expdpcompress.sh - Esse shell faz toda a lógica de compressão dos dumps do Oracle.
  • expfunctions.sh - Esse shell possui métodos e funções que serão utilizados pelos outros scripts.

A pasta CFG conterá o arquivo de configuração da instância:

  • orcl.cfg - O nome do arquivo deverá ser exatamente o mesmo do sid da instância presente no oratab e que se deseja efetuar o export, acrescentado de ".cfg". Se não existir este arquivo, o processo tentará localizar um arquivo com o nome "default.cfg" neste mesmo diretório.

A pasta LOG inicialmente estará vazia e conterá os logs das execuções.

Coloque as permissões nos diretórios e arquivos existentes conforme abaixo:

[oracle@ec12mntrjr001 exp]$ ls -laR ./
./:
total 24
drwxr-x---  5 oracle dba      4096 Mar 24 12:09 .
drwx------ 15 oracle oinstall 4096 Mar 24 12:08 ..
drwx------  2 oracle dba      4096 Mar 24 12:08 cfg
drwxr-x---  2 oracle dba      4096 Mar 24 12:08 log
dr-xr-x---  2 oracle dba      4096 Mar 24 12:08 sh

./cfg:
total 12
drwx------ 2 oracle dba 4096 Mar 24 12:08 .
drwxr-x--- 5 oracle dba 4096 Mar 24 12:09 ..
-rw------- 1 oracle dba 1138 Aug 23  2013 default.cfg

./log:
total 8
drwxr-x--- 2 oracle dba 4096 Mar 24 12:08 .
drwxr-x--- 5 oracle dba 4096 Mar 24 12:09 ..

./sh:
total 36
dr-xr-x--- 2 oracle dba 4096 Mar 24 12:08 .
drwxr-x--- 5 oracle dba 4096 Mar 24 12:09 ..
-r-xr-x--- 1 oracle dba 2268 Aug 28  2013 expcron.sh
-r-xr-x--- 1 oracle dba 4885 Nov 28 11:25 expdpcompress.sh
-r-xr-x--- 1 oracle dba 8818 Aug 29  2013 expfull.sh
-r-xr-x--- 1 oracle dba 3699 Nov 28 11:35 expfunctions.sh
[oracle@ec12mntrjr001 exp]$

4) Configurando

O arquivo de configuração "oracle_sid.cfg" existente na pasta cfg (onde oracle_sid é o SID da instância a ser feito o backup) requer os seguintes parâmetros:

- EXPTYPE

Parâmetro opcional que especifica o tipo do export e binário do Oracle a ser chamado ("exp" ou "expdp"). Aceita os valores "EXP" ou "EXPDP". Se omisso, o valor default "EXP" será usado.
Ex: EXPTYPE=EXPDP

- EXPRETENTION

Parâmetro obrigatório que determina o tempo de retenção dos backups antigos, em dias. Após o final do processo, arquivos de dumps anteriores a "EXPRETENTION" dias serão deletados.
Ex: EXPRETENTION=3

- EXPUSER

Parâmetro obrigatório que define usuário e senha que farão conexão no banco para efetuar o export. É recomendado criar um usuário para esta finalidade exclusiva, concedendo ao usuário apenas os grant necessários, conforme abaixo:

create user expuser identified by asb378 default tablespace USERS temporary tablespace TEMP profile DEFAULT quota unlimited on users;
grant exp_full_database to expuser;
grant create session to expuser;
grant create table to expuser;

Ex: EXPUSER=expuser/asb378

- EXPDEST

Parâmetro obrigatório que define a pasta onde ficará o dump. Essa pasta também deverá existir dentro da instância caso a variável "EXPTYPE" seja "EXPDP", conforme abaixo:

create or replace directory EXPDP1 as '/u02/export/dump';
grant read,write on directory EXPDP1 to expuser;

Ex: EXPDEST=/u02/export/dump

- COMPALG

Parâmetro obrigatório que determina a linha de comando para execução da ferramenta de compactação. Atualmente, suporta apenas Gzip ou Bzip2.
Bzip2 é mais lento mas o arquivo é muito menor o arquivo. Caso o script a ser executado seja o "expdp", essa compactação se dará em background ao término de cada parte. Caso seja "exp", a compactação será via PIPE.
Ex: COMPALG="bzip2 -9"

- EXPPARALLEL

Parâmetro obrigatório caso a variável "EXPTYPE" seja "EXPDP". Especifica a quantidades de jobs paralelos que executarão o export, sendo passado para o parâmetro "PARALLEL" do comando "expdp". Nao ultrapassar 2x o numero de CPUs. Se for um dump pequeno, deixar em "1". Caso a variável "EXPTYPE" seja "EXP" ou nula, este parâmetro é ignorado.
Ex: EXPPARALLEL=2

- EXPFILESIZE

Parâmetro obrigatório caso a variável "EXPTYPE" seja "EXPDP". Especifica o tamanho máximo de cada arquivo de dump, sendo passado para o parâmetro "FILESIZE" do comando "expdp". Não deixar muito pequeno pois o limite máximo são 99 arquivos. O tamanho deve ser especificado no formato de GBs. Caso a variável "EXPTYPE" seja "EXP" ou nula, este parâmetro é ignorado.
Ex: EXPFILESIZE=3G

- TARCOMPACT

Parâmetro obrigatório caso a variável "EXPTYPE" seja "EXPDP". Especifica se ao final do processo, juntará todos os arquivos do export compactados em um único TAR (1=Sim, 0=Não). Caso a variável "EXPTYPE" seja "EXP" ou nula, este parâmetro é ignorado.
Ex: TARCOMPACT=0

- RESOLVTNS

Parâmetro opcional e só se aplica caso a variável "EXPTYPE" seja "EXP" ou nula. Especifica a string de conexão dentro do TNSNAMES caso esteja sendo feito um backup de um servidor remoto. Apenas funciona para "exp", não "expdp". Caso a variável "EXPTYPE" seja "EXPDP" e esse parâmetro esteja especificado, o processo apontará um alerta e irá parar.
Ex: RESOLVTNS=orcl.world

- EXPPARAM

Parâmetro opcional que altera os parâmetros default do comando "exp" ou do "expdp". Caso seja omitido, o valor a ser usado será:

  • EXPDP:EXPPARAM="full=Y flashback_time=systimestamp"
  • EXP: EXPPARAM="full=y consistent=y compress=n statistics=none direct=y buffer=9999999"

Ex: EXPPARAM="full=y consistent=y compress=n statistics=none direct=y buffer=9999999 rows=n"

- EXPDEBUG

Parâmetro opcional que irá gerar no arquivo de log um trace de tudo que está sendo feito pelo script. Caso omitido, o valor default utilizado é 0 (DESLIGADO).
Ex: EXPDEBUG=1

Exemplo de cenários:

a) Exemplo de configuração para export data pump (expdp) sem execuções em paralelo, tamanho máximo por dump de 3 GBs.

EXPTYPE=EXPDP
EXPRETENTION=7
EXPUSER=expuser/asb378
EXPDEST=/u02/export/dump
COMPALG="bzip2 -9"
EXPPARALLEL=1
EXPFILESIZE=3G
TARCOMPACT=0

b) Exemplo de configuração para export data pump (expdp) com 8 execuções em paralelo, tamanho máximo por dump de 2 GBs.

EXPTYPE=EXPDP
EXPRETENTION=7
EXPUSER=expuser/asb378
EXPDEST=/u02/export/dump
COMPALG="bzip2 -9"
EXPPARALLEL=8
EXPFILESIZE=2G
TARCOMPACT=0

c) Exemplo de configuração para export simples (exp).

EXPTYPE=EXP
EXPRETENTION=7
EXPUSER=expuser/asb378
EXPDEST=/u02/export/dump
COMPALG="bzip2 -9"

d) Exemplo de configuração para export simples (exp) da estrutura do schema SCOTT.

EXPTYPE=EXP
EXPRETENTION=7
EXPUSER=expuser/asb378
EXPDEST=/u02/export/dump
COMPALG="bzip2 -9"
EXPPARAM="owner=scott consistent=y compress=n statistics=none direct=y buffer=9999999 rows=n"

e) Exemplo de configuração para export remoto simples (exp) via TNSNAMES.

EXPTYPE=EXP
EXPRETENTION=7
EXPUSER=expuser/asb378
EXPDEST=/u02/export/dump
COMPALG="bzip2 -9"
RESOLVTNS=orcl.world

5) Executando

Para executar o script de export, devemos executar o shell expcron.sh passando como parâmetro exatamente o sid da instância conforme escrito no arquivo oratab.
Desta forma, o script irá buscar na pasta de configuração pelo arquivo "oracle_sid.cfg" da instância, ou pelo arquivo "default.cfg", caso o primeiro não exista.

Exemplo de execução pontual:

[oracle@orasrv ~]$ cat /etc/oratab
#
orcldb:/u01/app/oracle/product/11.2.3/db_1:Y
[oracle@orasrv ~]$ $EXPORT_HOME/sh/expcron.sh orcldb &
[1] 17637$

O log da execução será gravado na pasta de log "$EXPORT_HOME/log".

Exemplo de agendamento do backup na crontab (mais comum), todos os dias às 21h:

[oracle@orasrv ~]$ crontab -l
00 21 * * * /u02/export/exp/sh/expcron.sh orcldb

OBS 1: O script não aceita execução em servidores que possuem 2 ORACLE_SID's idênticos em ORACLE_HOME's diferentes. O script também não aceita ser executado como root, por razões de segurança.

OBS 2: Se o método de export for export remoto simples (exp) via TNSNAMES, obviamente não existe a exigência da presença do sid no arquivo oratab da máquina. O único parâmetro da execução do comando "expcron.sh" apenas será utilizado para localizar o arquivo de configuração "oracle_sid.cfg" e nele será lida a string do nome a ser buscado no TNSNAMES.

6) Sáida do script

Além do arquivo de log gerado no diretório "$EXPORT_HOME/log", a saída do script será obviamente um arquivo DUMP compactado (no caso de "exp") ou vários arquivos DUMPS compactados inseridos dentro de uma pasta criada pelo processo (no caso de "expdp"). Se a variável "TARCOMPACT" tiver sido definida com "1", o diretório inteiro será colocado em um arquivo container ".tar".
O log da saída do comando de export também será gerado junto com o arquivo dump.

7) Conclusão

Agora podemos executar o expdp com um método efeciênte de compactação de arquivos. Se a compactação estiver muito lenta, experimente alterar o segundo parâmetro do comando "gzip" (ou "bzip2") para "--fast" (ou "-1"). Se os arquivos tiverem muito grandes, faça o oposto, troque para "--best" (ou "-9").

Experimente e deixe abaixo qualquer dúvida ou sugestão.
Baixe ele aqui!

Gostou? Não deixe de comentar ou deixar um 👍!

8 comentários

Pular para o formulário de comentário

    • Bruno em fevereiro 25, 2015 às 14:10
    • Responder

    Muito legal o script, porém, o expdp é gerado com a intenção de em algum dia utilizá-lo para importa-lo na base. Como ficariam os scripts para fazer o impdp de arquivos compactados sem haver a necessidade de descompactá-los?

    1. Fala Bruno,

      Tudo bem? Então, infelizmente não tem como fazer o impdp sem descompactá-los. O IMPDP trabalha de uma forma não sequencial e, dependendo dos parâmetros passados, ele pode ir em qualquer pedaço de qualquer DUMP gerado. Por isso todos eles precisam estar presentes.

      Abcs,
      Rodrigo

    • Sidiney em março 28, 2015 às 21:37
    • Responder

    Olá Rodrigo,

    Muito bom seu post, aproveitando, queria ver se voce consegue me ajudar, nao tenho nenhuma experiencia com oracle e estou iniciando agora.. To com um problema aqui na hora do exp versao 10g

    EXP-00056: ORACLE error 942 encountered
    ORA-00942: table or view does not exist
    EXP-00056: ORACLE error 942 encountered
    ORA-00942: table or view does not exist
    EXP-00056: ORACLE error 942 encountered
    ORA-00942: table or view does not exist
    EXP-00056: ORACLE error 942 encountered
    ORA-00942: table or view does not exist

    Volta e meia da esse erro ai, as vezes sem eu alterar nada o backup ocorre com sucesso. analisando os logs são tabelas temporárias do sistema pela nomenclatura, saberia me dizer como posso resolver esse problema?

    Obrigado desde já.

    1. Oi Sidiney,

      Que tabelas são essas? Tem como obter o DDL? Pode ser que sejam external tables cujo arquivo de referência esteja sendo criado e removido, por isso a intermitência.. mas isso é um chute, seria necessário entender a montagem delas.

      Abcs

    • Davi Godoy em novembro 8, 2018 às 16:42
    • Responder

    Olá!
    Obrigado pelo excelente script.
    Tenho algumas dúvidas:
    1) É possível exclui automaticamente após compactar, ou só depois de concluir todo o processo. Creio que isso irá poupar espaço.
    2) É possível compactar os dumps em outra pasta, ou movê-los para lá após o processo?

    Att,

    1. Oi Davi,
      1 - Ele compacta e exclui o original automaticamente.
      2 - Vc define onde ele irá gerar os arquivos atráves do parâmetro EXPDEST.

      Abcs,
      RJ

        • Davi Godoy em novembro 9, 2018 às 00:12
        • Responder

        Agradeço por sua rápida resposta.
        Realmente o tópico 1 está perfeito.
        Quanto ao 2 minha dúvida é se o local final pode ser uma pasta diferente do diretório de exportação do oracle.

        1. Oi Davi, desculpe a demora para essa. Pode apenas no caso do modo ser exp. Para expdp, seria necessário acrescentar uma linha no script para realizar este move.
          Abcs,
          RJ

Deixe um comentário

Seu e-mail não será publicado.