Revisado por Marcelo Pivovar - Solution Architect
Nesse artigo, iremos tratar uma situação muito comum em que o DBA recebe a tarefa de efetuar uma clonagem de um usuário no próprio Banco de Dados, mas com um username diferente.
Abaixo vou explicar como efetuar esta cópia sem a necessidade de maiores complexidades ou de gerar arquivos de DUMPS intermediários, utilizando o import datapump com um dblink de loopback no servidor.
Essa tarefa pode ser feita em 3 etapas rápidas:
Vamos então começar:
Neste exemplo, iremos clonar todo o usuário SCOTT com seus objetos e dados para um novo, SCOTT_BKP. Faremos esta tarefa com o usuário "DBADMIN", que é um DBA desta base.
O primeiro passo será criar o dblink de loopback temporário. Supondo que o SERVICE_NAME do BD seja "ORCL" e ele esteja executando na porta "1521":
create database link TMP_DBLINK connect to DBADMIN identified by "PASSWORD" using
'(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL= TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=ORCL)))';
Você também pode usar apenas o nome da entrada de TNS, caso exista uma que já aponte localmente para o próprio BD. Supondo, por exemplo, que há um TNS Names com nome "ORCL":
create database link TMP_DBLINK connect to DBADMIN identified by "PASSWORD" using 'ORCL';
O próximo passo será efetuar diretamente o clone do usuário. Execute o bloco PL/SQL:
DECLARE
H1 NUMBER;
HSTATUS VARCHAR2(200);
BEGIN
H1 := DBMS_DATAPUMP.OPEN(OPERATION => 'IMPORT', JOB_MODE => 'SCHEMA', REMOTE_LINK => 'TMP_DBLINK');
DBMS_DATAPUMP.METADATA_FILTER(HANDLE => H1, NAME => 'SCHEMA_LIST', VALUE => '''SCOTT''');
DBMS_DATAPUMP.METADATA_REMAP(HANDLE => H1, NAME => 'REMAP_SCHEMA', OLD_VALUE => 'SCOTT', VALUE => 'SCOTT_BKP');
DBMS_DATAPUMP.START_JOB(HANDLE => H1);
DBMS_DATAPUMP.WAIT_FOR_JOB(HANDLE => H1, JOB_STATE => HSTATUS);
DBMS_OUTPUT.PUT_LINE('STATUS = ' || HSTATUS);
END;
/
O tempo de execução do script varia de acordo com a quantidade de objetos e dados do usuário.
Por fim, confira se todos os objetos foram duplicados com o SQL abaixo:
select owner,object_type,status,count(*)
from dba_objects
where owner in ('SCOTT','SCOTT_BKP')
group by owner,object_type,status
order by 2,1,3;
Agora remova o diretório temporário criado:
drop database link TMP_DBLINK;
Pronto, agora você tem uma cópia idêntica do seu schema no seu BD!
Se tiver problemas durante a checagem de objetos, é possível ativar o log do import datapump para identificar a causa da falha. Para tanto, será necessário criar um diretório temporário para o log:
create directory TMP_DIR as '/tmp';
Em seguida, adicione a instrução abaixo após a linha do PL/SQL com o comando DBMS_DATAPUMP.OPEN:
DBMS_DATAPUMP.ADD_FILE(HANDLE => H1, FILENAME => 'imp.log', DIRECTORY => 'TMP_DIR', FILETYPE =>
DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE);
Por fim, após corrigir o erro e executar o comando corretamente, não esqueça de remover o diretório temporário:
drop directory TMP_DIR;
Rodrigo de Araujo Jorge is a Senior Oracle Professional (8i, 9i, 10g, 11g, 10gR2 RAC, 11gR2 RAC, 12c) with more than 8 years of industrial experience in Oracle high end technologies, starting with Oracle RDBMS version 8i up to 11g. He has been involved with multi platform High Availability Solutions as well as complex multiple node RAC 10g and 11g implementations on AIX, Linux, Solaris and HPUX. He has experience in deploying disaster recovery solutions compliant to Oracle MAA, by building RAC and Standby applications linked. As a former employee of IBM and Capgemini, providing services to Bradesco bank group and TIM companies, acted in several projects for enabling high availability RAC systems to support ERP, CRM, HRMS e MRP, end to end performance tuning, architectured backup and disaster recovery solutions to name a few. Presently he is working as a Senior Oracle Consultant in Amdocs.
Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.