O DataPump é uma ferramenta bastante popular no mundo Oracle Database, a qual permite exportar ou importar dados e metadadados, além de permitir uma série de filtros sobre quais objetos devem ser exportados/importados. Pode ser utilizada com intuito de backup lógico ou apenas para transporte de objetos/dados entre diferentes bancos de dados.
A maneira mais simples de trabalhar com o DataPump é exportar os dados para um arquivo físico, conhecido como dumpfile e armazenar ou transportar estes dumpfiles para qualquer lugar e posteriormente importar em outro banco de dados (ou no mesmo banco de dados).
Neste post demonstrarei como utilizar o DataPump para importar um schema direto de um banco de dados de origem para um banco de dados de destino pela rede. Dessa maneira, não é necessário gerar um arquivo físico (dumpfile), transportar pela rede e depois importar no banco de dados de destino. Ou seja, em uma única linha de comandos já faremos isso tudo de uma vez.
Para isso, o único requisito que precisamos atender é a criação de um Database Link no banco de dados de destino apontando para o banco de dados de origem para que o DataPump faça uma ponte entre os dois bancos sobre o Oracle Net.
Adicionar uma entrada no tnsnames.ora
No servidor de destino, vamos adicionar uma entrada com apelido RMT no arquivo tnsnames.ora. Essa entrada será utilizada na criação do Database Link.
RMT =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.21)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = novo)
)
)
Criar o Database Link
No servidor de destino, vou logar no banco de dados e criar um db link chamado “prod_rmt” usando a entrada RMT do tnsnames criado anteriormente.
[oracle@dg01 oracle]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.1.0 Production on Sat Aug 31 22:05:18 2019
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> create public database link prod_rmt connect to system identified by mcsi using 'RMT';
Database link created.
SQL> select count(*) from dba_objects@prod_rmt;
COUNT(*)
----------
90732
SQL>
Note que após o link ter sido criado, já aproveito para realizar um teste executando um SELECT em uma VIEW do banco de dados remoto.
Usando o DB LINK no DataPump
No banco de dados de origem, vou criar duas tabelas no schema chamado “MAICON” apenas para testar que a importação foi realizada com sucesso no banco de dados de destino.
[oracle@stdb oracle]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.1.0 Production on Sat Aug 31 19:07:22 2019
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> create table maicon.tabelas as select * from dba_tables;
Table created.
SQL> create table maicon.objetos as select * from dba_objects;
Table created.
SQL>
Agora de volta ao servidor de destino, vou emitir o comando impdp e como um dos parâmetros, vou informar o “network_link”. O valor informado aqui deve ser o nome do Database Link criado anteriormente.
[oracle@dg01 oracle]$ impdp system/mcsi schemas=maicon network_link=prod_rmt
Import: Release 12.1.0.1.0 - Production on Sat Aug 31 22:15:32 2019
Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
Iniciando "SYSTEM"."SYS_IMPORT_SCHEMA_01": system/******** schemas=maicon network_link=prod_rmt
Estimativa em andamento com o metodo BLOCKS...
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE_DATA
Estimativa total usando o metodo de BLOCKS: 13.75 MB
Processando o tipo de objeto SCHEMA_EXPORT/USER
Processando o tipo de objeto SCHEMA_EXPORT/DEFAULT_ROLE
Processando o tipo de objeto SCHEMA_EXPORT/TABLESPACE_QUOTA
Processando o tipo de objeto SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE
. . importou "MAICON"."OBJETOS" 90732 linhas
. . importou "MAICON"."TABELAS" 2320 linhas
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processando o tipo de objeto SCHEMA_EXPORT/STATISTICS/MARKER
O job "SYSTEM"."SYS_IMPORT_SCHEMA_01" foi concluido com sucesso em Sab Ago 31 22:15:53 2019 elapsed 0 00:00:19
[oracle@dg01 oracle]$
Importação realizada com sucesso. Abaixo testo que as tabelas agora existem no banco de dados de destino.

E se tentarmos exportar ao invés de importar?
Se tentarmos usar o Database Link em um processo de Export, o DataPump não retornará nenhum erro, porém, a opção do network_link é implicitamente ignorada. Ao invés de gravar os dados diretamente no banco de dados de destino, ele gera um dumpfile no próprio servidor de origem no diretório padrão do DataPump (<ORACLE_BASE>/admin/<SID>/dpdump).
Vamos verificar este cenário na prática.
Primeiramente eu verifico que existe um tabela no banco de dados de origem, no schema DIBIEI:
SQL> select count(*) from dba_tables where owner='DIBIEI';
COUNT(*)
----------
1
Em seguida saio do SQL*PLUS e executo o comando de Export informando o parâmetro network_link da mesma forma que utilizei no Import.
[oracle@dg01 ~]$ expdp system/mcsi schemas=dibiei network_link=prod_rmt
Export: Release 12.1.0.1.0 - Production on Sat Aug 31 22:44:56 2019
Copyright (c) 1982, 2013, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
Iniciando "SYSTEM"."SYS_EXPORT_SCHEMA_01": system/******** schemas=dibiei network_link=prod_rmt
Estimativa em andamento com o metodo BLOCKS...
Estimativa total usando o metodo de BLOCKS: 0 KB
Processando o tipo de objeto SCHEMA_EXPORT/USER
Processando o tipo de objeto SCHEMA_EXPORT/DEFAULT_ROLE
Processando o tipo de objeto SCHEMA_EXPORT/TABLESPACE_QUOTA
Processando o tipo de objeto SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processando o tipo de objeto SCHEMA_EXPORT/STATISTICS/MARKER
Tabela-mestre "SYSTEM"."SYS_EXPORT_SCHEMA_01" carregada/descarregada com sucesso
******************************************************************************
Conjunto de arquivos de dump para SYSTEM.SYS_EXPORT_SCHEMA_01 e:
/u01/app/oracle/admin/novo/dpdump/expdat.dmp
O job "SYSTEM"."SYS_EXPORT_SCHEMA_01" foi concluido com sucesso em Sab Ago 31 22:45:04 2019 elapsed 0 00:00:07
Observe que nenhum import no banco de dados remoto é informado. Ao invés disso, a saída do comando informa que foi gerado um conjunto de arquivos em “/u01/app/oracle/admin/novo/dpdump/expdat.dmp” que é o diretório padrão do DataPump neste servidor.
Como eu só acredito vendo, naveguei até o diretório e listei os arquivos, constatando que realmente foram gerados dois arquivos, um dumpfile e um logfile.
[oracle@dg01 ~]$ cd $ORACLE_BASE/admin/$ORACLE_SID/dpdump
[oracle@dg01 dpdump]$ ls -l
total 172
-rw-r----- 1 oracle oinstall 172032 Aug 31 22:45 expdat.dmp
-rw-r--r-- 1 oracle oinstall 1204 Aug 31 22:45 export.log
Só pra constatar que realmente nada foi executado no banco de dados de destino, verifico quantas tabelas existem no schema DIBIEI no banco de dados remoto:
[oracle@dg01 dpdump]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.1.0 Production on Sat Aug 31 22:46:25 2019
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> select count(*) from dba_tables@prod_rmt where owner='DIBIEI';
COUNT(*)
----------
0
Compatibilidade entre Origem e Destino
Neste artigo foram utilizados dois bancos de dados rodando na mesma versão 12.1.0.1. Porém, os dois bancos de dados não precisam ser exatamente da mesma versão, desde que a diferença não seja maior que duas versões. Por exemplo, Se o banco de destino for 12c, a origem deve estar no mínimo na versão 10g e vice versa.
Para mais informações sobre restrições do parâmetro network_link, consultar a documentação oficial da Oracle disponível aqui.