Social Icons

19 de mar. de 2018

Compressão de dados no Oracle 12c com o Data Pump


     

Olá pessoal,

     Neste post vou mostrar como utilizar a compressão de dados BASIC no Data Pump, utilizando um parâmetro novo no Oracle 12c, suas vantagens e desvantagens, e os cuidados que precisamos tomar com licenciamento antes de usá-lo.
     
    Na empresa em que trabalho, recentemente migramos os ambientes de Bancos de Dados de homologação e desenvolvimento para a versão 12cR2, e desde então comecei a estudar mais a fundo alguns recursos novos que parecem ser interessantes para nós. Entre eles fui entender melhor o que são os algoritmos de compressão do Data Pump, que nasceram na versão 12c, e que podem ser utilizados através do novo parâmetro COMPRESSION_ALGORTHM

     Compressão no Data Pump está presente no Oracle desde a versão 10G, porém ela efetuava compressão somente de metadados (COMPRESSION=METADATA_ONLY). No 11G foi criada a opção para compressão também de dados e o parâmero COMPRESSION que passou a aceitar os seguintes valores: NONE (desabilita compressão), METADATA_ONLY (somente metadados, valor padrão)DATA_ONLY (somente dados, requer option Advanced Compression) e ALL (dados + metadados, requer option Advanced Compression). No 12C a compressão foi estendida para permitir escolher 1 entre 4 opções de compressão:
     - Compressão básica (COMPRESSION_ALGORITHM=BASIC), que é o algoritmo padrão.
     - Compressão baixa (COMPRESSION_ALGORITHM=LOW);
     - Compressão média (COMPRESSION_ALGORITHM=MEDIUM);
     - Compressão alta (COMPRESSION_ALGORITHM=HIGH). 

     Quando li nos docs oficiais da Oracle que foi criada uma opção de compressão com o nome BASIC, fiquei contente, pois de início imaginei que ela pudesse ser gratuita (sem a necessidade de pagar pelo uso de uma option adicional) para uso no Oracle Database, visto que, já existem opções de compressão com o nome BASIC no nível de tabelas e também no nível de backups, e ambas não exigem licenciamento adicional da option "Advanced Compression". Pesquisei nos docs oficiais da option "Advanced Compression" no Oracle 12cR2 e não encontrei informações muito esclarecedoras sobre as questões de uso da compressão BASIC no Data Pump e a necessidade de licenciamento da referida option, mas isso ficou mais claro quando encontrei o link https://docs.oracle.com/database/121/SUTIL/GUID-F81B5F5F-9F40-4EB0-99B8-47C45179DE5E.htm#SUTIL4051 contendo informações sobre o uso do parâmetro COMPRESSION_ALGORITHM e a seguinte frase: "This feature requires that the Oracle Advanced Compression option be enabled" (ver Imagem 01).
     
Imagem 01 - Uso do parâmetro COMPRESSION_ALGORITHM no Data Pump
  
     Não fiquei muito contente ao ler a frase acima e achei muito estranho e confuso a Oracle começar a cobrar, somente na compressão do Data Pump, por um algoritmo com nome BASIC, então abri um SR no MOS e também entrei em contato por telefone/e-mail com o pessoal da Oracle que cuida dos contratos de licenciamento da empresa em que trabalho. Em ambos tive a mesma resposta, informando que era realmente necessário adquirir a option "Advanced Compression" para usar a compressão básica no Data Pump. Apesar das respostas não serem muito agradáveis, fiquei muito satisfeito com os esclarecimentos do Eder Couto (Consultor da Oracle), que me forneceu muitos detalhes sobre o assunto, cujos detalhes me fizeram tirar as minhas próprias conclusões do porquê da Oracle começar a cobrar somente agora pelo algoritmo BASIC. Quando ele foi criado para efetuar compressão de tabelas (a partir da versão 9iR2) e compressão de backups (a partir da versão 10G), não existia ainda uma option que cobrava por recursos de compressão de dados.
   
     A option "Advanced Compression" foi criada a partir do Oracle 11GR1, então o que foi criado antes dela (ainda) permanece gratuito, mas a Oracle já está cobrando pelo que foi criado depois, como neste caso, a compressão BASIC no Data Pump! - É meu amigo, a Oracle está cada vez mais agressiva com relação aos preços e cobrança de seus produtos!
   
     Para finalizar este artigo, seguem abaixo os resultados e conclusão de alguns testes que fiz utilizando paralelismo e a compressão BASIC para gerar o dump de um schema de testes que tinha 3 pequenas tabelas:
  
   
1- Gerando o dump com paralelismo e sem compressão:
  
expdp fabio@bd directory=DADOS dumpfile=expdp_fabio_sc_%u.dmp 
   logfile=expdp_fabio.log parallel=4


Export: Release 12.2.0.1.0 - Production on Mon Feb 26 13:51:31 2018

Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.
Password:

Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Starting "FABIO"."SYS_EXPORT_SCHEMA_01":  fabio/********@bd directory=DADOS dumpfile=expdp_fabio_sc_%u.dmp logfile=expdp_fabio_sc.log parallel=4
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_BODY
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
.  estimated "FABIO"."TAB1"                          8.185 KB
.  estimated "FABIO"."TAB2"                          6.216 KB
.  estimated "FABIO"."TAB3"                          5.087 KB
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_SPEC
Processing object type SCHEMA_EXPORT/FUNCTION/FUNCTION
Processing object type SCHEMA_EXPORT/PACKAGE/COMPILE_PACKAGE/PACKAGE_SPEC/ALTER_PACKAGE_SPEC
Processing object type SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTION
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/DOMAIN_INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
. . exported "FABIO"."TAB1"                          8.585 KB      50 rows
. . exported "FABIO"."TAB2"                          6.429 KB       2 rows
. . exported "FABIO"."TAB3"                          5.101 KB       1 rows
Master table "FABIO"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for FABIO.SYS_EXPORT_SCHEMA_01 is:
  /u01/dumps/expdp_fabio_sc_01.dmp
  /u01/dumps/expdp_fabio_sc_02.dmp
  /u01/dumps/expdp_fabio_sc_03.dmp
  /u01/dumps/expdp_fabio_sc_04.dmp

Job "FABIO"."SYS_EXPORT_SCHEMA_01" successfully completed at Mon Feb 26 23:52:53 2018 elapsed 0 00:01:17

   
2- Gerando o dump com paralelismo e compressão BASIC:
  
expdp fabio@bd directory=DADOS dumpfile=expdp_fabio_%u.dmp 
   logfile=expdp_fabio.log parallel=4 COMPRESSION=ALL COMPRESSION_ALGORITHM=BASIC

Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

Starting "FABIO"."SYS_EXPORT_SCHEMA_01":  fabio/********@bd directory=DADOS dumpfile=expdp_fabio_%u.dmp logfile=expdp_fabio.log parallel=4 COMPRESSION=ALL COMPRESSION_ALGORITHM=BASIC
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_BODY
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
.  estimated "FABIO"."TAB1"                          8.185 KB
.  estimated "FABIO"."TAB2"                          6.216 KB
.  estimated "FABIO"."TAB3"                          5.087 KB
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/PACKAGE/PACKAGE_SPEC
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/FUNCTION/FUNCTION
Processing object type SCHEMA_EXPORT/PACKAGE/COMPILE_PACKAGE/PACKAGE_SPEC/ALTER_PACKAGE_SPEC
Processing object type SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTION
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/TABLE/INDEX/DOMAIN_INDEX/INDEX
. . exported "FABIO"."TAB1"                          5.507 KB   50 rows
. . exported "FABIO"."TAB2"                          5.085 KB    2 rows
. . exported "FABIO"."TAB3"                           4.75 KB    1 rows
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Master table "FPRADO"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for FABIO.SYS_EXPORT_SCHEMA_01 is:
  /u01/dumps/expdp_fabio_01.dmp
  /u01/dumps/expdp_fabio_02.dmp
  /u01/dumps/expdp_fabio_03.dmp
  /u01/dumps/expdp_fabio_04.dmp
Job "FPRADO"."SYS_EXPORT_SCHEMA_01" successfully completed at Mon Feb 26 23:50:41 2018 elapsed 0 00:03:12

  
    Comparando as 2 execuções acima, podemos verificar que em meus testes, o tempo de geração do dump sem compressão ficou quase 3 vezes (286%) mais rápido. Agora vamos comparar o tamanho dos dumps:

$ ll -trh
-rw-r--r-- 1 oracle oinstall 2.6K Feb 26 13:50 expdp_fabio.log
-rw-r----- 1 oracle oinstall  56K Feb 26 13:50 expdp_fabio_04.dmp
-rw-r----- 1 oracle oinstall  64K Feb 26 13:50 expdp_fabio_03.dmp
-rw-r----- 1 oracle oinstall  28K Feb 26 13:50 expdp_fabio_02.dmp
-rw-r----- 1 oracle oinstall 8.0K Feb 26 13:50 expdp_fabio_01.dmp
-rw-r----- 1 oracle oinstall 8.0K Mar 19 11:33 expdp_fabio_sc_04.dmp
-rw-r----- 1 oracle oinstall 328K Mar 19 11:33 expdp_fabio_sc_03.dmp
-rw-r----- 1 oracle oinstall 432K Mar 19 11:33 expdp_fabio_sc_02.dmp
-rw-r----- 1 oracle oinstall 228K Mar 19 11:33 expdp_fabio_sc_01.dmp
-rw-r--r-- 1 oracle oinstall 2.3K Mar 19 11:33 expdp_fabio_sc.log
   
     Verificando acima o tamanho dos arquivos de dump das 2 execuções, podemos ver que o tamanho total dos arquivos de dump gerados sem compressão ficou igual a 996K, enquanto que, o tamanho total dos arquivos de dump gerados com compressão BASIC ficou igual a 156K, ou seja, o dump com compressão de dados ficou 6,38 X menor (638%). 

     Conclusão: apesar de termos que pagar o licenciamento de uma option adicional para usar a compressão BASIC no Data Pump, ela oferece uma ótima taxa de compressão que talvez valha a pena o investimento (análise isso, bote tudo na ponta do lápis), principalmente se você tiver VLDBs (very large DBs). Lembre-se também que recursos de compressão consomem mais CPU. Nos meus testes o tempo de geração dos dumps com compressão ficou quase 3 X maior, ou seja, piorou quase 3 X. Você também pode economizar não gastando com a option "Advanced Compression" e compactar os dumps de outras formas. Veja por exemplo os artigos Compressão de dumps do Oracle Data Pump e Como executar expdp com compressão de dados no Oracle 10g e 11g.
  

Por hoje é só!
Espero que você tenha gostado do conteúdo deste artigo! 
Comentários e questões são sempre bem-vindos!

[]s
  

6 comments:

  1. Fabio, valeu por esclarecer essa informação... A Oracle é muito confusa em termos de licenciamento e essa é mais uma prova. O pior é não poder limitar o uso de recursos de acordo com as options que nós efetivamente temos adquirido. Um desavisado pode estar usando essa feature sem saber que é parte do ACO. Mais um ótimo artigo, amigo. Bom trabalho!

    ResponderExcluir
  2. Puxa fabio... valeu pelas dicas. Nunca me passou pela cabeça por se tratar de algo q aparenta ser simples. Oracle sempre a surpreender. Agora vou ter mais cuidado. Obgado Fábio por partilhar conhecimentos

    ResponderExcluir
    Respostas
    1. Adilson, licenciamento Oracle é tão complexo que o próprio pessoal da Oracle se confunde. Eles demoraram um pouco para me responder essas questões que fiz sobre a compressão BASIC no Data Pump.
      []s

      Excluir
  3. Fabio boa noite, eu tenho um servidor oracle linux com um banco de dados produção e outro homologação os dois no mesmo servidor, o que muda é apenas a instancia, os dois tem as mesma estrutura, e dados, só que já tem uns dois meses que a base de homologação não é atualizada com os dados da produção, hoje rodei o seguinte export.

    expdp userid=\"/ as sysdba\" full=y dumpfile=base_yano.dmp logfile=logbase_yano.log flashback_time=systimestamp

    isso na base de produção queria saber qual o comando para rodar na base homologação.

    tem que excluir os dados homologação, tabelas, algos do tipo ou basta rodar o import pode me da uma força.

    instancias:
    PROD = PRODUÇÃO
    HOM = HOMOLOGAÇÃO

    ResponderExcluir
    Respostas
    1. Basta executar o import na homologação com algum comando similar a:
      impdp \"/ as sysdba\"@HOM full=Y directory=NOME__ORACLE_DIRECTORY dumpfile=base_yano.dmp logfile=impdp_logbase_yano.log

      Excluir

 

LINKS ÚTEIS

Total de visualizações de página

Seguidores

Meu One Drive (antigo Sky Drive)