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

Por Fabio Prado Oracle ACE
Publicado em Julho 2018

Revisado por Mario Andrés Escobar



Neste post iremos 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 (COMPRESSION=DATA_ONLY ou COMPRESSION=BOTH), e no 12C essa opção foi estendida para permitir 4 opções de compressão, são elas:

- 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, 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



Inicialmente achei 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. 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 o que foi criado depois já está sendo cobrado, como neste caso, a compressão BASIC no Data Pump!   

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 tinham 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 muitas vezes vale 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 3X maior, ou seja, piorou quase 3X.



Fabio Prado atua na área de tecnologia desde o ano de 2000, possui experiência e profundos conhecimentos em Análise de Sistemas, programação (Dot Net) e Administração de Bancos de Dados Oracle. É DBA em uma empresa do governo, instrutor na empresa de treinamentos FABIOPRADO.NET, Oracle ACE Member, Organizador do DBA BRASIL e autor do blog fabioprado.net.

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.