sábado, 7 de maio de 2011

DATA PUMP com REMAP_SCHEMA e REMAP_TABLESPACE

Ok. Faz quase um ano que não posto nada aqui, isso após somente 2 posts. Tudo bem. Se você está lendo isso agora e está entrando nesta via de DBA, se prepare: você não terá tempo para BLOGS! rs. É temos muito serviço, há muita demanda no mercado para profissionais ORACLE DBA porém a exigência é grande.

Bom, hoje irei abordar um processo simples usando EXPDP/IMPDP (Data Pump). O objetivo do BLOG é ajudar em processos simples do dia-a-dia de um DBA Jr. e não ir profundamente em nenhum assunto. Por isso não irei abordar aqui o conceito do EXPDP nem todas as possibilidade que temos com ele.

O REMAP_SCHEMA e o REMAP_TABLESPACE se tornaram parte da minha rotina devido a clientes que insistem em colocar ambiente de teste, homologação, produção, desenvolvimento, etc, na mesma instância do banco de dados, fazendo esta separação através de usuários do banco (schema) e tablespace distintas para cada aplicação. Esta prática é altamente irrecomendável (rs), porém é muito comum e temos que nos adaptar a ela.

Bom, por exemplo: Solicitam a atualização de um SCHEMA APP_TESTE (ambiente de teste), com base no SCHEMA APP_PROD (ambiente de produção), sendo que os 2 estão no mesmo banco de dados. Ai é que entra o nosso amigo (e acreditem, ainda pouco explorado) EXPDP:

1) Realizar o EXPORT do SCHEMA de produção usando EXPDP:
$ expdp system/senha schemas=APP_PROD directort=BACKUP dumpfile=APP_PROD.dmp logfile=APP_PROD.log

Obs: o diretório BACKUP deve já existir ou ser criado antes do início do processo:
SQL> create or replace directory BACKUP as '/tmp'; -- exemplo

2) Dropar objetos no SCHEMA APP_TESTE (ambiente de testes):
Antes da importação temos que nos certificar que o schema onde serão impostados os dados do APP_TESTE (exportados no item 1) está vazio. Para isso, uso os 3 SELECTS abaixo, que geram os scripts para dropar todos os objetos de um SCHEMA:

spool drop_fk.sql
select 'alter table '||owner||'."'||table_name||'" drop constraint "'||constraint_name||'"' cmd
from dba_constraints
where owner = 'APP_TESTE'
and constraint_type='R';
spool off

spool drop_tables.sql
select 'drop table '||owner||'."'||table_name||'"' cmd
bulk collect into v_tabs
from dba_tables
where owner = 'APP_TESTE';
spool off

spool drop_objects.sql
select 'drop '||object_type||' '||owner||'."'||object_name||'"' cmd
bulk collect into v_objs
from dba_objects
where owner = 'APP_TESTE'
and object_type not in ('LOB')
order by object_type;
spool off

-- Executa scripts gerados
@drop_fk.sql
@drop_tables.sql
@drop_objects.sql

3) Realizar a importação dos dados do SCHEMA APP_PROD para o APP_TESTE, supondo:
- Tablespaces usadas por APP_PROD: APP_PROD_DT e APP_PROD_IX
- Tablespaces usadas por APP_TESTE: APP_TESTE_DT e APP_TESTE_IX

# impdp system/senha DIRECTORY=BACKUP dumpfile=APP_PROD.dmp logfile=impdpAPP_TESTE.log remap_schema=APP_PROD:APP_TESTE remap_tablespace=APP_PROD_DT:APP_TESTE_DT,APP_PROD_IX:APP_TESTE_IX

No IMPDP acima estamos utilizando o DUMP (APP_PROD.dmp) gerado pelo EXPDP e 'informando' que os dados do schema APP_PROD devem ser importados no schema APP_TESTE. Destes dados, os que estiverem armazenados nas tablespaces APP_PROD_DT e APP_PROD_IX devem ser agora importados nas tablespaces APP_TESTE_DT e APP_TESTE_IX.

Obs: Antes de realizar a importação você deve saber em que tablespaces estão as tabelas/índices do schema APP_PROD, que você pode obter consultando as views DBA_TABLES e DBA_INDEXES.

Vale também ressaltar que para realizar o EXPDP e IMPDP, o usuário que realizará o processo (system nos exemplos acima) devem ter grant de DBA ou grant de CONNECT, RESOURCE, EXP_FULL_DATABASE e FLASHBACK ANY TABLE.

Tenho certeza que mais dia, menos dia o REMAP_SCHEMA e o REMAP_TABLESPACE será muito útil para você!

Até a próxima!

8 comentários:

  1. Muito bom o post, objetivo e claro. Me ajudou muito

    ResponderExcluir
  2. Eu poderia excluir direto o schema APP_TESTE através do "drop user APP_TESTE cascade" ou necessariamente preciso dropar as fks, tabelas e objetos conforme vc vez?
    Obrigado!

    ResponderExcluir
  3. Tenho um backup antigo que preciso restaurar e nao sei mais sob qual schema ele foi criado.
    Como faco para saber o schema de origem quando tenho so o DMP??

    ResponderExcluir
  4. Concordo completamente com o Sr. Jean Vieira.
    Me salvou! Obrigado.

    ResponderExcluir
  5. cara preciso também verificar o tamanho das tablespaces antes de iniciar ?

    ResponderExcluir