Existe uma maneira conveniente de importar um esquema para o Oracle 11gR2 usando um único tablespace novo ou diferente do local de origem dos dados?
Como exemplo, exportei BLOG_DATA do OLDDB, onde todos os dados do usuário são armazenados no tablespace USERS.
No NEWDB, gostaria de importar o esquema BLOG_DATA, mas armazenar os objetos de usuário no tablespace BLOG_DATA, criado especificamente para este usuário.
Criei o usuário BLOG_DATA, criei o tablespace BLOG_DATA e o defini como o tablespace padrão para esse usuário e adicionei uma cota ilimitada apropriada.
CREATE TABLESPACE blog_data DATAFILE SIZE 1G;
CREATE USER blog_data IDENTIFIED BY secretpassword DEFAULT TABLESPACE blog_data QUOTA UNLIMITED ON blog_data;
GRANT connect,resource TO blog_data
O esquema foi exportado do OLDDB com algo como
exp blog_data/secretpassword@OLDDB file=blog_data.dmp
Depois de ler a excelente resposta de Phil abaixo, me perguntei :
Como os dados não têm outro lugar para ir além do tablespace padrão - o único tablespace no qual o usuário tem uma cota - isso forçará efetivamente o imp a colocar todos os objetos de usuário nesse tablespace padrão?
imp blog_data/secretpassword@NEWDB file=blog_data.dmp
Isso colocaria todo o esquema blog_data no tablespace blog_data em NEWDB? Existe alguma razão pela qual isso não funcionaria ou que eu teria problemas com certos objetos, etc?
atualizar:
Fiz um teste rápido e descobri que sim. Imp
coloca objetos no tablespace padrão para aquele usuário, desde que não possa colocá-lo no tablespace original (por exemplo, o tablespace não existe). Explicação completa: http://www.dolicapax.org/?p=57
Ainda assim, suponho que usar o Data Pump como Phil sugere pode ser a opção preferida.
Na verdade, não é possível especificar um tablespace diferente ao importar usando o
imp
utilitário oracle. No entanto, como solução alternativa, você pode pré-criar as tabelas fazendo umaROWS=N
importação noUSERS
tablespace, depoisalter table mytable move tablespace BLOG_DATA;
para cada tabela movê-las para o novo tablespace, depois fazer a importação novamente com oIGNORE=Y
parâmetro para ignorar os erros de criação da tabela e importar todos dos dados.Se os dados foram exportados usando o Data Pump (
expdp
), (além disso, todos deveriam estar usando isso hoje em dia, ao invés do antigo legadoexp
/imp
utilitários) você pode importar facilmente para outro tablespace usando oREMAP_TABLESPACE
parâmetro.por exemplo:
Você deve seguir os passos abaixo mencionados: -
imp system/manager file=export.dmp indexfile=newfile.sql
Isso importará os dados e salvará todas as definições em
newfile.sql
.newfile.sql
após alterar os tablespaces.