it-swarm-pt.tech

Como importar um despejo do Oracle em um espaço de tabela diferente

Eu quero importar um despejo do Oracle em um espaço de tabela diferente.

Eu tenho um tablespace A usado pelo usuário A. Revoguei o DBA nesse usuário e dei a ele as concessões connect e resource. Então eu despejei tudo com o comando

exp a/*** owner = um arquivo = oracledump.dmp log = log.log compress = y

Agora eu quero importar o dump para o espaço de tabela B usado pelo usuário B. Então eu dei a ele as concessões de conexão e recurso (sem DBA). Então eu executei a seguinte importação:

imp b/*** arquivo = oracledump.dmp log = import.log fromuser = a touser = b 

O resultado é um log com muitos erros:

IMP-00017: a seguinte instrução falhou com o erro da Oracle 20001: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: Erro da Oracle 20001 encontrado ORA-20001: Valores de entrada inválidos ou inconsistentes

Depois disso, tentei o mesmo comando import, mas com a opção statistics = none. Isso resultou nos seguintes erros:

ORA-00959: o espaço de tabelas 'A_TBLSPACE' não existe

Como isso deve ser feito?

Nota: muitas colunas são do tipo CLOB. Parece que os problemas têm algo a ver com isso.

Nota 2: As versões do Oracle são uma mistura de 9.2, 10.1 e 10.1 XE. Mas não acho que isso tenha a ver com versões.

33
Michiel Overeem

Você tem alguns problemas aqui.

Em primeiro lugar , as diferentes versões do Oracle que você está usando é o motivo do erro de estatísticas da tabela - tive o mesmo problema quando alguns dos bancos de dados Oracle 10g foram atualizados para o Release 2 e alguns ainda estavam no Release 1 e Eu estava trocando arquivos .DMP entre eles.

A solução que funcionou para mim foi usar a mesma versão das ferramentas exp e imp para fazer a exportação e a importação nas diferentes instâncias do banco de dados. Isso foi mais fácil de fazer usando o mesmo PC (ou Oracle Server) para emitir todos os comandos de exportação e importação.

Em segundo lugar , suspeito que você esteja obtendo o ORA-00959: tablespace 'A_TBLSPACE' does not exist porque está tentando importar um arquivo .DMP de um banco de dados Oracle completo para o banco de dados 10g Express Edition (XE), que, por padrão, cria um único , tablespace predefinido chamado USERS para você.

Se for esse o caso, então você precisa fazer o seguinte ..

  1. Com o seu arquivo .DMP, crie um arquivo SQL contendo a estrutura (Tabelas):

    imp <xe_username>/<password>@XE file=<filename.dmp> indexfile=index.sql full=y

  2. Abra o arquivo de índice (index.sql) em um editor de texto que possa localizar e substituir por um arquivo inteiro e emita as seguintes instruções de localização e substituição EM ORDEM (ignore as aspas simples .. '):

    Find: 'REM<space>' Replace: <nothing>

    Find: '"<source_tablespace>"' Replace: '"USERS"'

    Find: '...' Replace: 'REM ...'

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. Salve o arquivo de indexação e, em seguida, execute-o em sua conta do Oracle Express Edition (acho melhor criar uma nova conta de usuário do XE em branco - ou descartar e recriar, se eu estiver atualizando):

    sqlplus <xe_username>/<password>@XE @index.sql

  4. Finalmente, execute o mesmo arquivo .DMP em que você criou o arquivo de indexação com a mesma conta para importar os dados, procedimentos armazenados, visualizações, etc.

    imp <xe_username>/<password>@XE file=<filename.dmp> fromuser=<original_username> touser=<xe_username> ignore=y

Você pode obter páginas de erros do Oracle ao tentar criar determinados objetos como Trabalhos de Banco de Dados, pois o Oracle tentará usar o mesmo Identificador de Banco de Dados, que provavelmente falhará quando você estiver em um Banco de Dados diferente.

31
Andrew

Se você estiver usando o Oracle 10g e o datapump, poderá usar a cláusula REMAP_TABLESPACE. exemplo:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
16
Neil Kodner

Para mim este trabalho está ok (Oracle Database 10g Express Edition Release 10.2.0.1.0):

impdp B/B full=Y dumpfile=DUMP.dmp REMAP_TABLESPACE=OLD_TABLESPACE:USERS

Mas para a nova restauração você precisa de um novo tablespace

P.S. Talvez seja útil http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6
Grebets Kostyantyn

Qual versão do Oracle você está usando? Se for 10g ou superior, você deve usar o Data Pump em vez de importar/exportar de qualquer maneira. Eu não tenho 100% de certeza se ele pode lidar com esse cenário, mas eu esperaria que pudesse.

Data Pump é a substituição para exp/imp para 10g e acima. Ele funciona muito parecido com exp/imp, exceto que (supostamente, eu não uso desde que eu estou preso em 9i terra) melhor.

Aqui está a documentação do Data Pump

3
Matthew Watson

Eu quero melhorar para dois usuários em diferentes tablespaces em diferentes servidores (bancos de dados)

1. Primeiro crie um diretório para o dump temporário para ambos os servidores (bancos de dados):

servidor1:

CREATE OR REPLACE DIRECTORY tempdump AS '/temp/old_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO old_user;

server # 2:

CREATE OR REPLACE DIRECTORY tempdump AS '/temp/new_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO new_user;

2. Exportar (servidor # 1):

expdp tables=old_user.table directory=tempdump dumpfile=adump.dmp logfile=adump.log

3. Importar (servidor # 2):

impdp directory=tempdump dumpfile=adump_table.dmp logfile=bdump_table.log
REMAP_TABLESPACE=old_tablespace:new_tablespace REMAP_SCHEMA=old_user:new_user
1
peter

minha solução é usar o utilitário GSAR para substituir o nome do espaço de tabela no arquivo DUMP. Quando você fizer a replicação, certifique-se de que o tamanho do arquivo de despejo seja inalterado, adicionando espaços. Por exemplo:.

gsar -f -s"TSDAT_OV101" -r"USERS      " rm_schema.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ ENABLE STORAGE IN ROW CHUNK 8192 RETENTION" -r"                                                                   " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ LOGGING" -r"                                  " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS      """ " -r"                             " rm_schema.n.dump rm_schema.n1.dump
1
Dmitry

O problema tem a ver com as colunas CLOB. Parece que a ferramenta imp não pode reescrever a instrução create para usar outro espaço de tabelas.

Fonte: http://asktom.Oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:66890284723848

A solução é: Crie o esquema manualmente no espaço de tabela correto. Se você não tiver um script para criar o esquema, poderá criá-lo usando o arquivo de indexação = da ferramenta imp.

Você precisa desabilitar todas as restrições, a ferramenta de proteção do Oracle não as desabilitará. 

Depois disso, você pode importar os dados com o seguinte comando:

imp b/*** arquivo = oracledump.dmp log = import.log fromuser = um touser = b estatísticas = none ignore = y

Nota: Eu ainda precisava das estatísticas = none devido a outros erros.

informação extra sobre a bomba de dados

No Oracle 10, a importação/exportação foi aprimorada: a ferramenta de bomba de dados ([ http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php][1] )

Usando isso para reimportar os dados em um novo tablespace:

  1. Primeiro crie um diretório para o dump temporário:

    CREATE OR REPLACE DIRETÓRIO tempdump AS '/ temp/tempdump /';
    GRANT READ, ESCREVA NO DIRETÓRIO tempdump TO a;

  2. Exportar:

    expdp a/* schemas = um diretório = tempdump dumpfile = adump.dmp logfile = adump.log

  3. Importar:

    impdp b/* diretório = tempdump dumpfile = adump.dmp logfile = bdump.log REMAP_SCHEMA = a: b

Nota: os arquivos de despejo são armazenados e lidos a partir do disco do servidor, não do disco local (cliente)

1
Michiel Overeem

A resposta é difícil, mas factível:

A situação é: userAe tablespaceX

  1. importe seu arquivo de despejo para um banco de dados diferente (isso é necessário apenas se você precisar manter uma cópia do original)
  2. renomear tablespace

    alter tablespaceXrenomear paraY

  3. criar um diretório para o comando expdp em direitos de concessão

  4. criar um despejo com expdp
  5. remova o usuário antigo e o tablespace antigo (Y)
  6. crie o novo tablespace (Y)
  7. crie o novo usuário (com um novo nome) - neste casoB- e conceda direitos (também ao diretório criado no passo 3)
  8. importe o despejo com impdp

    impdp Diretório B/B = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA =A:B

e é isso...

1
Michiel Overeem

Porque eu queria import (para o Oracle 12.1 | 2) um dump que era exported de um banco de dados de desenvolvimento local (18c xe) e sabia que todos os meus bancos de dados de destino teriam um espaço de tabela acessível chamado DATABASE_TABLESPACE, acabei de criar meu esquema/usuário para usar um novo espaço de tabela com esse nome em vez do padrão USERS (para o qual não tenho acesso nos bancos de dados de destino):

-- don't care about the details
CREATE TABLESPACE DATABASE_TABLESPACE
  DATAFILE 'DATABASE_TABLESPACE.dat' 
    SIZE 10M
    REUSE
    AUTOEXTEND ON NEXT 10M MAXSIZE 200M;

ALTER DATABASE DEFAULT TABLESPACE DATABASE_TABLESPACE;

CREATE USER username
  IDENTIFIED BY userpassword
  CONTAINER=all;

GRANT create session TO username;
GRANT create table TO username;
GRANT create view TO username;
GRANT create any trigger TO username;
GRANT create any procedure TO username;
GRANT create sequence TO username;
GRANT create synonym TO username;
GRANT create synonym TO username;
GRANT UNLIMITED TABLESPACE TO username;

Um exp criado a partir disso faz imp feliz no meu alvo.

0
masterxilo