«

»

maio 29

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:

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:

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:

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.

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

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

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

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

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:

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:

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 dar um like. Abraços e até a próxima!

4 comentários

Pular para o formulário de comentário

  1. Yann

    Thank you for your script.
    It seems there is an error in your examples of .cfg files. There is a dot (.) in the EXPFILESIZE parameter value.
    Nevertheless, the script doesn’t work for me… 🙁 Don’t understand why…

    Yann

    1. DBA RJ

      Hi,
      I corrected the extra “dot”, thanks for the advise!

      What is the output of your log file in the log folder? If the script is not creating any log, you probably do not have write permission in the log folder that you unzipped.
      Test and tell me if it works!

  2. Yann

    Hi,
    No, I have write permission. Here is the log file. It seems the script hangs up…
    Thank you for your help.

    2013-06-05 16:11:05 – Beginning of the export process…
    2013-06-05 16:11:05 – Checking O.S…
    2013-06-05 16:11:06 – O.S: Linux
    2013-06-05 16:11:06 – Loading parameters “SHRTEST.cfg”
    2013-06-05 16:11:06 – Calling ORAENV…
    The Oracle base for ORACLE_HOME=/orabin/app/oracle/product/11.1.0/db_1 is /orabin/app/oracle
    2013-06-05 16:11:06 – Checking file extension…
    2013-06-05 16:11:06 – Extension: bzip2…

    1. DBA RJ

      Plase go inside the script folder and run: ksh -x expfull.sh youroraclesid

      Then paste all the output here. In the output may exist the username and password that you put in cfg file. Remove it before pasting for security.

  3. DAVID CARO

    Hi,

    Very good article about expdp and compress…We have AIX system…When do you plan to support AIX?

    Thanks and regards…

    1. DBA RJ

      Hi David, I’m glad you enjoyed.
      I don’t have any AIX system running DBs to adapt the code, but as all of them are UNIX based, I believe not many changes are necessary!

      Regards,
      Rodrigo

  4. Dennis Heltzel

    Your scripts have saved me a lot of work, as I was going to implement something much like this. I have done some enhancements by making the gzip/bzip process able to write it’s archives to a different location (on an NFS file system in my use case).

    Would you like me to send the changes back to you? If not, can I publish my version on my blog and link back to yours?

    1. DBA RJ

      I am very glad that the script have helped you. Please send me your version and you can also post it and link me back!

      Regards,
      Rodrigo

  5. Bhushan

    Thanks for sharing script, I am trying your script to compress 10TB DB in 10g and import to 12c, will impdp of 12c can load compress file *.dmp files or do I need to uncompress and make them available? your answer will help in setting direction for our upgrade. Thanks again

    1. DBA RJ

      Hi Bhushan,
      You’ll have to uncompress them in *.dmp files before using the 12c impdp. If you want to avoid the creation of “dmp” files to save space, I would recommend using datapump impdp through db link.
      Regards,
      Rodrigo

  6. Pascal

    hello,
    I have a little trouble lately with the script.
    I got the following error while far everything was ok:

    >>> Oracle log:
    ….
    Traitement du type d’objet SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
    ORA-31693: Echec du chargement/déchargement de l’objet de données de table “NXTP1″.”ECC_AUD_AUDIENCE” ; l’objet est ignoré en raison de l’erreur :
    ORA-31617: impossible d’ouvrir le fichier de vidage “/u02/app/oracle/dump/EXPDP_NXTDB_FULL_20141210_222928.01.dmp” pour écriture
    ORA-19505: échec d’identification du fichier “/u02/app/oracle/dump/EXPDP_NXTDB_FULL_20141210_222928.01.dmp”
    ORA-27037: impossible d’obtenir l’état du fichier
    Linux-x86_64 Error: 2: No such file or directory
    Additional information: 3
    . . export : “NXTP1″.”ECC_DEM_DEMAND” 1.543 GB 14928555 lignes
    ……

    >>> Script log:

    2014-12-10 22:29:28 – Checking O.S…
    2014-12-10 22:29:28 – O.S: Linux
    2014-12-10 22:29:28 – Loading parameters “NXTDB.cfg”
    2014-12-10 22:29:28 – Calling ORAENV…
    The Oracle base remains unchanged with value /u01/app/oracle
    2014-12-10 22:29:28 – Checking file extension…
    2014-12-10 22:29:28 – Extension: bzip2…
    2014-12-10 22:29:30 – Starting EXPDP of instance NXTDB…
    2014-12-10 22:29:30 – Loading custom expdp parameters: “SCHEMAS=nxtp1”
    2014-12-10 22:29:30 – Calling parallel script of compression…
    2014-12-10 22:29:30 – Beginning of the process to compact EXPDP…
    2014-12-10 22:36:03 – Compacting EXPDP_NXTDB_FULL_20141210_222928.01.dmp
    2014-12-10 22:51:35 – Compacting EXPDP_NXTDB_FULL_20141210_222928.02.dmp
    2014-12-10 23:11:51 – Compacting EXPDP_NXTDB_FULL_20141210_222928.03.dmp
    2014-12-10 23:29:18 – Compacting EXPDP_NXTDB_FULL_20141210_222928.04.dmp
    2014-12-10 23:37:25 – Export command returned: 5
    2014-12-10 23:37:25 – Cleaning files older than 1 days…
    2014-12-10 23:37:25 – Waiting the end of compress script…
    ….

    I feel that the first file is already compressed and removed while Oracle has always needed.
    I do not have a full backup but only a schema.

    I have had this error by implementing the pbzip2 compression tool in your script, then I’m fine with bzip2. bzip2 has worked well so far.

    Have you any idea?

    1. DBA RJ

      Somehow the expdp utility tried to reopen 1st Dump file even after it has reached the maximum size and there was no process locking it. It is like coming back to do something in an already generated file.
      I have no workaround for this, as the script can not predict if oracle is going to do that.
      I think I’ve already faced it before and what I did to solve was changing the size to a smaller value and increasing the number of parallel threads.

      Regards,
      Rodrigo

      1. Pascal

        Thank you very much for your comments.
        I can not use the parallel setting because I do not have an Oracle enterprise version.
        The error is truly random and I did not try to restore the backup. Perhaps it is correct.
        Thank you again for your script.

        Regards,
        Pascal

        1. jean

          Same problem for me.
          expdp needs to write in file 01 at the end of process.
          File 01 should not be processed while expdp is running.

  7. paul

    To use Data Pump Compression you need to purchace the Advanced Compression Option
    for Enterprise Edition. You can not just use it without licencing this option.

    1. DBA RJ

      Hi Paul.
      Thanks for reminding! But this article deals with another compression method.
      Regards

  8. Bruno

    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. DBA RJ

      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

  9. Sidiney

    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. DBA RJ

      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

  10. David

    Hi DBA RJ,

    This looks quite interesting. My question is though how is the import being handled then?
    My impression is that you’d need to provide the disc space you would have needed without compression anyways, when doing an import!

    Kind regards
    David

    1. DBA RJ

      Hi David,
      Yes you are absolutely right. For restoration, we’d need a disk space that could handle all the files uncompressed.

      Regards,
      Rodrigo

  11. siddharthasai

    can you please send me the usage of the script and i dont have log files or dumpfiles in the database
    i am doing an experiment on sun solaris 10g

    1. DBA RJ

      Hi Sidd,

      In this post I give some examples. Take a look and see if it applies to your case.

      Regards,

      DBA RJ

  12. Fabrizio Magni

    Nice script!!!
    I really love the idea to compress exdp “chunks”.

    I’m on HP-UX and I had to add this line:
    DPDIR=$(echo $DPDIR_PRE|tr -d ‘\r’)
    because in DPDIR a newline was added give an error in the expdp command later.

    Still great script.

    1. DBA RJ

      Thanks!

  13. foued

    Hi, thank you for sharing this nice post and scripts, grateful for that.
    Failed in AIX, then I managed to test it successfully in Linux.
    Foued

  14. Rajkishore

    Very good tool RJ.

    1. DBA RJ

      Thanks Rajkishore!

  15. Rafal

    I have a problem with your scripts on linux. In log i see only 2 lines:
    – Beginning of theexport process….
    – One argument is needed.
    Can you help me?

    1. DBA RJ

      Hello Rafal,

      Check instructions above. You are not passing the required parameter to the script.

      Thanks,
      Rodrigo

  16. Rafal

    Hi,
    Wich parameters You mean?

    BR,
    Rafal

    1. DBA RJ

      Hi Rafal,
      When you call expcron.sh or expfull.sh, you need to pass a command line parameter.
      Thanks,
      RJ

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">