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


quarta-feira, 5 de agosto de 2015

Oracle Data Pump Export: Ignorando o conteúdo de colunas BLOB ao gerar o dump de exportação com a cláusula REMAP_DATA

Por Eduardo Legatti

Olá,

No artigo de Junho/2015 eu abordei uma técnica de como realizar um dump de exportação pelo Datapump Export (expdp) ignorando linhas de uma tabela através da cláusula QUERY sem a necessidade de ignorar a tabela através da cláusula EXCLUDE. Recapitulando, no utilitário expdp, podemos utilizar a cláusula EXCLUDE para ignorar alguns objetos que não queremos que sejam exportados. A desvantagem em utilizar a opção EXCLUDE para ignorar tabelas durante a exportação é que, ao importar novamente o dump, as tabelas que foram excluídas poderão fazer falta no novo ambiente. Agora imagine uma tabela que possui uma coluna do tipo BLOB que contém poucos registros, mas pelo fato de armazenar documentos grandes na coluna BLOB, acaba por ter um tamanho de 100 GB. A questão agora é: como fazer para exportar os registros desta tabela ignorando o conteúdo da coluna BLOB? Se o conteúdo do LOB não for necessário no dump de exportação, maximizaremos o tempo da exportação, além de ter um dump muito menor. Utilizando a técnica da cláusula QUERY poderemos exportar a tabela sem nenhum registro, mas não é isso que queremos.

No mais, neste artigo irei abordar como ignorar o conteúdo de uma coluna BLOB durante uma exportação através do utilitário expdp, fazendo uso da cláusula REMAP_DATA que tem como objetivo a especificação de uma função de conversão de dados através de uma package de banco de dados. Segue a demonstração abaixo.
 
[oracle ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Qua Ago 5 10:13:43 2015

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> desc SCOTT.T1
 Nome                Nulo?    Tipo
 ------------------- -------- ------------------
 COD                          NUMBER
 IMAGEM                       BLOB

SQL> select owner,segment_name,segment_type,bytes/1024/1024 size_mb
  2    from dba_segments
  3   where owner='SCOTT';

OWNER            SEGMENT_NAME                 SEGMENT_TYPE        SIZE_MB
---------------- ---------------------------- ---------------- ----------
SCOTT            T1                           TABLE                 ,0625
SCOTT            SYS_IL0000182291C00002$$     LOBINDEX                  3
SCOTT            SYS_LOB0000182291C00002$$    LOBSEGMENT             1669

3 linhas selecionadas.   

No exemplo acima, temos a tabela T1 de propriedade do usuário SCOTT que possui 1669 MB em segmentos de LOB referente à coluna IMAGEM. A tabela possui apenas 256 linhas na qual queremos exportar. No comando abaixo irei exportar o schema SCOTT de forma usual.
 
[oracle ~]$ expdp system/#5ydl3db# dumpfile=SCOTT.dmp schemas=SCOTT

Export: Release 11.2.0.3.0 - Production on Wed Aug 5 10:19:31 2015

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

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Iniciando "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/******** dumpfile=SCOTT.dmp
Estimativa em andamento com o metodo BLOCKS...
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE_DATA
Estimativa total usando o metodo de BLOCKS: 1.629 GB
Processando o tipo de objeto SCHEMA_EXPORT/USER
Processando o tipo de objeto SCHEMA_EXPORT/SYSTEM_GRANT
Processando o tipo de objeto SCHEMA_EXPORT/ROLE_GRANT
Processando o tipo de objeto SCHEMA_EXPORT/DEFAULT_ROLE
Processando o tipo de objeto SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE
. . exportou "SCOTT"."T1"                                1.590 GB     256 linhas
Tabela-mestre "SYSTEM"."SYS_EXPORT_SCHEMA_01" carregada/descarregada com sucesso
******************************************************************************
Conjunto de arquivos de dump para SYSTEM.SYS_EXPORT_SCHEMA_01 e:
  /tmp/SCOTT.dmp
O job "SYSTEM"."SYS_EXPORT_SCHEMA_01" foi concluido com sucesso em 10:20:31
 
Na saída acima, podemos verificar que 1.590 GB referente à tabela T1 foram exportados. Agora irei fazer a mesma exportação só que agora fazendo uso da cláusula REMAP_DATA. Para fazer uso da mesma, o pré-requisito é que uma função incorporada dentro de uma package seja utilizada. Segue abaixo package que irei criar que terá como objetivo retornar um valor empty_blob(), ou seja, um tipo de valor NULL para coluna do tipo BLOB.

SQL> create or replace package pkg_null_blob
  2  as
  3     function sf_null_blob (col_blob in blob)
  4        return blob;
  5  end;
  6  /

Pacote criado.

SQL> create or replace package body pkg_null_blob
  2  as
  3     function sf_null_blob (col_blob in blob)
  4        return blob
  5     is
  6        blob_null   blob := empty_blob();
  7     begin
  8        return blob_null;
  9     end;
 10  end;
 11  /

Corpo de Pacote criado.

SQL> grant execute on pkg_null_blob to public;

Concessão bem-sucedida.

Após a criação da package e concedidas as permissões necessárias, irei realizar novamente a exportação, só que agora fazendo uso da cláusula REMAP_DATA conforme demonstração abaixo.
 
[oracle ~]$ expdp system/#5ydl3db# 
            dumpfile=SCOTT.dmp 
            schemas=SCOTT 
            remap_data=SCOTT.T1.IMAGEM:sys.pkg_null_blob.sf_null_blob

Export: Release 11.2.0.3.0 - Production on Wed Aug 5 10:25:55 2015

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

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Iniciando "SYSTEM"."SYS_EXPORT_SCHEMA_01":  system/******** dumpfile=SCOTT.dmp
Estimativa em andamento com o metodo BLOCKS...
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE_DATA
Estimativa total usando o metodo de BLOCKS: 1.629 GB
Processando o tipo de objeto SCHEMA_EXPORT/USER
Processando o tipo de objeto SCHEMA_EXPORT/SYSTEM_GRANT
Processando o tipo de objeto SCHEMA_EXPORT/ROLE_GRANT
Processando o tipo de objeto SCHEMA_EXPORT/DEFAULT_ROLE
Processando o tipo de objeto SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE
. . exportou "SCOTT"."T1"                                6.906 KB     256 linhas
Tabela-mestre "SYSTEM"."SYS_EXPORT_SCHEMA_01" carregada/descarregada com sucesso
******************************************************************************
Conjunto de arquivos de dump para SYSTEM.SYS_EXPORT_SCHEMA_01 e:
  /tmp/SCOTT.dmp
O job "SYSTEM"."SYS_EXPORT_SCHEMA_01" foi concluido com sucesso em 10:26:34

Pronto. Podemos perceber pela saída acima que somente 6.906 KB referente à tabela T1 foram exportados, ou seja, o conteúdo da coluna IMAGEM do tipo de dado BLOB, foi mapeado para NULL para cada linha exportada da tabela T1.



Nenhum comentário:

Postagens populares