Importando esquema para um espaço de tabela novo ou diferente

13

Existe uma maneira conveniente de importar um esquema para o Oracle 11gR2 usando um único espaço de tabela novo ou diferente do local de origem dos dados?

Como exemplo, eu exportei BLOG_DATA do OLDDB, onde todos os dados do usuário são armazenados no espaço de tabela USERS.

No NEWDB, gostaria de importar o esquema BLOG_DATA, mas armazene os objetos de usuário no espaço de tabela BLOG_DATA, criado especificamente para esse usuário.

Criei o usuário BLOG_DATA, criei o espaço de tabela BLOG_DATA e o configurei como o espaço de tabela 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 espaço de tabela padrão - o único espaço de tabela no qual o usuário possui uma cota - isso efetivamente força o imp a colocar todos os objetos de usuário nesse espaço de tabela padrão?

imp blog_data/secretpassword@NEWDB file=blog_data.dmp

Isso colocaria todo o esquema blog_data no espaço de tabela blog_data no NEWDB? Existe alguma razão para que isso não funcione ou que eu tenha problemas com certos objetos, etc.?

atualizar:

Fiz um teste rápido e achei que era esse o caso. Impcoloca objetos no espaço de tabela padrão para esse usuário, desde que não possa colocá-lo no espaço de tabela original (por exemplo, o espaço de tabela não existe). Explicação completa: http://www.dolicapax.org/?p=57

Ainda assim, suponho que o uso do Data Pump como Phil sugere possa ser a opção preferida.

Roy
fonte
Foi exportado usando o exputilitário herdado ou com expdp(bomba de dados)?
Philᵀᴹ
No exemplo, foi exportado com o utilitário exp convencional, como mostrado acima. Suponho que alguém poderia facilmente usar expdp e pegar o arquivo do servidor db antigo, isso facilitaria a transição para um novo espaço de tabela?
Roy
Eu cobri os dois na minha resposta. Usar dados da bomba - é mais fácil para executar esta tarefa
Philᵀᴹ

Respostas:

15

Na verdade, não é possível especificar um espaço de tabela diferente ao importar usando o imputilitário oracle . No entanto, como solução alternativa, você pode pré-criar as tabelas fazendo uma ROWS=Nimportação no USERSespaço de tabela e, em seguida, alter table mytable move tablespace BLOG_DATA;para cada tabela movê-las para o novo espaço de tabela, faça a importação novamente com o IGNORE=Yparâmetro para ignorar os erros de criação de tabela e importar todos dos dados.

Se os dados foram exportados usando o Data Pump ( expdp), (como um todo, todo mundo deveria usá-lo hoje em dia, em vez do antigo legado exp/ imputilitários), você pode importar facilmente para outro espaço de tabela usando o REMAP_TABLESPACEparâmetro

por exemplo:

impdp scott/tiger@ZOMG file=blog_data.dmp directory=mydir remap_tablespace=USERS:BLOG_DATA
Philᵀᴹ
fonte
Muito obrigado, Phil. Eu estava pensando: se o usuário sendo importado para ter exclusivamente uma cota no espaço de tabela padrão, isso força o imp a colocar todos os objetos importados nesse espaço de tabela padrão, independentemente do layout na origem dos dados?
Roy
Estou trabalhando em algo semelhante, mas é uma migração de banco de dados inteira usando expdp / impdp, porque quero que nosso env de controle de qualidade corresponda à produção. Se eu usar remap_tablespace, ele remapeará todos os esquemas em outro espaço de tabela único, no entanto, acho que posso executar o comando impdp uma vez por esquema e usando remap_tablespace. Isso deve alcançar o trabalho.
Nicolas de Fontenay
0

Você deve seguir as etapas abaixo mencionadas: -

  • Exportar o usuário
  • Executar importação usando o comando
    imp system/manager file=export.dmp indexfile=newfile.sql
    Isso importará os dados e salvará todas as definições em newfile.sql.
  • Solte os objetos necessários.
  • Execute o script newfile.sqldepois de alterar os espaços de tabela.
  • Importe do backup os objetos necessários.
Md Wasi
fonte