Introdução
O objetivo desse post é apresentar as opções de import e export em um banco de dados Oracle.
A Oracle disponibiliza algumas opções para download da ferramenta Oracle Client que além do SqlPlus (cliente oficial para acessar o banco), traz as ferramentasde backup.
Esses links ajudam a instalar o Oracle client no Windows (no ambiente do trabalhok foi o SO, que precisei usar, mas deve ter equivalência para outros sistemas suportados pelo banco).
- Link 1
- Link 2
- Link para download Oracle 11.2
- Link para download Oracle 12C
- Link para download Oracle 18c
- Link para download Oracle client com orientações
Opções de backup imp/exp x impdb/expdp
Uma vez que o client esteja instalado e configurado corretamente, existem dois caminhos para fazer import/export de dados no Oracle. As ferramentas imp/exp e impdp e expdp. As segundas, são mais recentes e só constam desde a versão 10G. Dados exportados/importados com imp/exp não funcionam com impdp e expdp.
Para usar o banco Oracle via terminal, é necessário na instalação do client definir um arquivo de configuração chamado TNSNAMEs. Através dele, que o banco conhecerá os dados de conexão.
Exemplo:
DATABASE_1 =
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.0.1)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = SERVICE_NAME_DB_1)))
DATABASE_2 =
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.0.2)(PORT = 1521))
(CONNECT_DATA = (SERVICE_NAME = SERVICE_NAME_DB_2)))
Os comandos impdp/expdp são mais avançados e tem recursos interessantes, como por exemplo, buscar exportar os dados para uma tabela e importar para uma tabela com nome diferente. No imp/exp isso não acontece e é necessário renomear tabela para “driblar esse recurso”.
Nesse processo de descoberta, achei esse post que explicava muito bem sobre expdp e impdp.
Como não tive a oportunidade de testar impdb/expdb por limitação de acesso no banco que estava trabalhando, tive que resolver usando imp/exp.
No meu contexto, não podia sobrescrever os dados importados, eu precisava manter os dados do banco de origem em uma estrutura separada dos dados do banco destino. Com a opção impdb e expdb, existem o recurso de mapping, porém na opção imp/exp não encontrei mecanismo similar.
Rotina usando imp/exp
O processo de export de dados se mostrou um tanto lento, mas no meu caso acessava o ambiente via VPN, via internet, o que influenciou bastante na performance. Abaixo, explico o comando de export.
1) Exportação do dado do banco de origem
exp NOME_BANCO_ORIGEM/SENHA_BANCO_ORIGEM@ENTRADA_TNSNAME_BANCO_ORIGEM TABLES=(MUNICIPIO,USUARIO) GRANTS=N ROWS=Y file=nome_arquivo_gerado.dmp log=nome_arquivo_log.log
Essa rotina gerará o arquivo nome_arquivo_gerado.dmp com log nome_arquivo_log.log na pasta onde o client está instalado.
2) Uma vez que o arquivo de dump está disponível, conecto no banco destino e renomeio as tabelas para preservar os dados.
ALTER TABLE NOME_BANCO_DESTINO.MUNICIPIO RENAME TO NOME_BANCO_DESTINO.TMP_MUNICIPIO;
ALTER TABLE NOME_BANCO_DESTINO.USUARIO RENAME TO NOME_BANCO_DESTINO.TMP_USUARIO;
3) No banco destino executo o comando de import.
imp NOME_BANCO_DESTINO/SENHA_BANCO_DESTINO@ENTRADA_TNSNAME_BANCO_DESTINO TABLES=(MUNICIPIO,USUARIO) file=nome_arquivo_gerado.dmp log=nome_arquivo_log_input_dados.log
4) Com o processo anterior, os dados foram importados. Entretanto, eu preciso ainda acessar as informações originais e manter os dados convivendo.
ALTER TABLE NOME_BANCO_DESTINO.MUNICIPIO RENAME TO NOME_BANCO_DESTINO.T2_MUNICIPIO;
ALTER TABLE NOME_BANCO_DESTINO.USUARIO RENAME TO NOME_BANCO_DESTINO.T2_USUARIO;
ALTER TABLE NOME_BANCO_DESTINO.TMP_MUNICIPIO RENAME TO NOME_BANCO_DESTINO.MUNICIPIO;
ALTER TABLE NOME_BANCO_DESTINO.TMP_USUARIO RENAME TO NOME_BANCO_DESTINO.USUARIO;
Conclusão
Interessante a forma como cada banco trabalha com mecanismo de importação de dados. Essa opção se mostrou muito mais rápida do que exportar os dados da tabela em inserts e realizar outros inserts, por se tratar da criação de um arquivo binário.
No meu caso isso foi aplicado a um contexto de migração, com algumas transformações de dados.
Vocês já tiveram experiência similares com banco de dados? Compartilhe um pouco como foi nos comentários e vamos tentar compartilhar formas melhor de trabalho.
Para quem não tem banco Oracle configurado, existe esse artigo de como instalar um banco Oracle 12C no docker.