Páginas

segunda-feira, 4 de novembro de 2013

[Oracle] - DATA PUMP com REMAP_SCHEMA e REMAP_TABLESPACE

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.

Fonte: http://oraclejunior.blogspot.com.br/2011/05/data-pump-com-remapschema-e.html

Nenhum comentário:

Postar um comentário