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


segunda-feira, 1 de junho de 2015

Oracle Data Pump Export: Ignorando múltiplas tabelas ao gerar o dump de exportação sem fazer uso da cláusula EXCLUDE

Por Eduardo Legatti

Olá,

Em alguns momentos, nós DBAs, somos solicitados a realizar um dump de exportação de um schema de banco de dados. Na maioria das vezes esse dump será importado para um outro ambiente, como por exemplo, no ambiente de DEV ou HOM. O que acontece às vezes é que somos solicitados a fazer o dump de forma que algumas tabelas não precisem estar no dump de exportação. Muitas vezes são tabelas grandes (de muitos gigabytes) que são usadas para armazenar logs, históricos, imagens através de colunas LOB. Enfim, dependendo da situação, são tabelas que não serão necessárias em um novo ambiente. No utilitário expdp (Datapump Export), 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, em alguns casos, seremos acionados a criar no novo ambiente as tabelas que não foram exportadas, inclusive as constraints Foreign Keys caso existam nas tabelas que foram ignoradas durante a exportação.

No mais, o objetivo desse artigo será demonstrar o uso da cláusula EXCLUDE para ignorar tabelas durante uma exportação através do Data Pump Export (expdp), bem como demonstrar uma outra forma, através da cláusula QUERY de ignorar tabelas durante uma exportação sem a necessidade de excluí-las do dump. Segue a demonstração abaixo.
 
$ sqlplus scott/tiger

SQL*Plus: Release 11.2.0.1.0 Production on Seg Jun 1 10:13:21 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> create table t1 (cod number constraint pk_t1 primary key);

Tabela criada.

SQL> create table t2 (cod number constraint fk_t2_t1 references t1);

Tabela criada.

SQL> create table t3 (cod number);

Tabela criada.

SQL> insert into t1 values (1);

1 linha criada.

SQL> insert into t2 values (1);

1 linha criada.

SQL> insert into t3 values (1);

1 linha criada.

SQL> commit;

Commit concluído.

 
Acima, eu criei 3 tabelas no schema SCOTT para poder realizar a demonstração. Poderia ter criado dezenas de tabelas, mas não há necessidade. Segue abaixo o exemplo de como poderíamos exportar todas aos objetos do schema SCOTT menos as tabelas T1 e T3 utilizando a cláusula EXCLUDE.
 
$ expdp system/manager schemas=SCOTT
  dumpfile=scott.dmp 
  EXCLUDE=TABLE:\"IN \(\'T1\',\'T3\'\)\"
  nologfile=y

Export: Release 11.2.0.3.0 - Production on Seg Jun 1 10:23:21 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/******** schemas=SCOTT
Estimativa em andamento com o metodo BLOCKS...
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE_DATA
Estimativa total usando o metodo de BLOCKS: 64 KB
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
Processando o tipo de objeto SCHEMA_EXPORT/VIEW/VIEW
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
. . exportou "SCOTT"."T2"                                    5 KB       1 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:23:26

Pronto. Podemos ver acima que apenas a tabela T2 foi exportada, ou seja, ao importar o dump gerado com o utilitário impdp (Datapump Import), apenas a tabela T2 será criada no destino. Como a tabela T2 tem uma foreign key para a tabela T1, a mesma será importada sem essa restrição de integridade já que ao final da importação o erro "ORA-00942: a tabela ou view não existe" será emitido pelo fato a tabela T1 não existir. Segue abaixo um outra forma de fazer a mesma coisa, só que com a vantagem de que apenas as linhas das tabelas ignoradas não serão exportadas, ou seja, a estrutura da tabela será exportada para o dump, mas as linhas da tabela não. Para isso, será usado a cláusula QUERY onde será passado para cada tabela um predicado que não retorne nenhuma linha, como por exemplo "WHERE rownum=0". Segue exemplo abaixo.
 
$ expdp system/manager schemas=SCOTT
  dumpfile=scott.dmp
  QUERY=SCOTT.T1:\"WHERE rownum=0\"
  QUERY=SCOTT.T3:\"WHERE rownum=0\"
  nologfile=y

Export: Release 11.2.0.3.0 - Production on Seg Jun 1 10:25:56 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/******** schemas=SCOTT
Estimativa em andamento com o metodo BLOCKS...
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE_DATA
Estimativa total usando o metodo de BLOCKS: 128 KB
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
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processando o tipo de objeto SCHEMA_EXPORT/VIEW/VIEW
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
. . exportou "SCOTT"."T1"                                    0 KB       0 linhas
. . exportou "SCOTT"."T2"                                    5 KB       1 linhas
. . exportou "SCOTT"."T3"                                    0 KB       0 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:05

Pronto. Podemos acima ver que todas as 3 tabelas foram exportadas. A diferença é que as tabelas T1 e T3 estão vazias, ou seja, nenhuma linha das tabelas T1 e T3 foram exportadas. Ao importar o dump gerado, todas as 3 tabelas serão importadas mas, da mesma forma que no primeiro exemplo, como a tabela T2 tem uma Foreign Key para a tabela T1, a mesma será importada sem essa restrição de integridade. Vale a pena salientar que durante a importação, não será mais emitido o erro "ORA-00942: a tabela ou view não existe", mas o erro "ORA-02298: não é possível validar (SCOTT.FK_T2_T1) - chaves mães não localizadas".



Nenhum comentário:

Postagens populares