it-swarm.it

Come importare un dump Oracle in un tablespace diverso

Voglio importare un dump Oracle in un tablespace diverso.

Ho un tablespace A usato dall'utente A. Ho revocato DBA su questo utente e gli ho dato le autorizzazioni connect e risorse. Quindi ho scaricato tutto con il comando

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

Ora voglio importare il dump nel tablespace B usato dall'Utente B. Così gli ho dato le sovvenzioni su connect e resource (senza DBA). Quindi ho eseguito la seguente importazione:

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

Il risultato è un log con molti errori:

IMP-00017: dichiarazione successiva non riuscita con errore 20001 di Oracle: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: errore Oracle 20001 rilevato ORA-20001: valori di input non validi o incoerenti

Successivamente ho provato lo stesso comando di importazione ma con l'opzione statistics = nessuna. Ciò ha provocato i seguenti errori:

ORA-00959: spazio tabelle 'A_TBLSPACE' non esiste

Come dovrebbe essere fatto?

Nota: molte colonne sono di tipo CLOB. Sembra che i problemi abbiano qualcosa a che fare con quello.

Nota 2: le versioni Oracle sono una combinazione di 9.2, 10.1 e 10.1 XE. Ma non penso che abbia a che fare con le versioni.

33
Michiel Overeem

Hai un paio di problemi qui.

In primo luogo , le diverse versioni di Oracle che stai usando è il motivo dell'errore di statistiche della tabella - Ho avuto lo stesso problema quando alcuni dei nostri database Oracle 10g sono stati aggiornati alla Release 2 e alcuni erano ancora nella versione 1 e Stavo scambiando file .DMP tra di loro.

La soluzione che ha funzionato per me è stata quella di utilizzare la stessa versione degli strumenti exp e imp per eseguire l'esportazione e l'importazione nelle diverse istanze del database. Questo era più facile da fare usando lo stesso PC (o Oracle Server) per emettere tutti i comandi di esportazione e importazione.

In secondo luogo , ho il sospetto che stai ricevendo il ORA-00959: tablespace 'A_TBLSPACE' does not exist perché stai cercando di importare un file .DMP da un database Oracle completo nel database 10g Express Edition (XE), che, per impostazione predefinita, crea un singolo , tablespace predefinito chiamato USERS per te.

Se è così, allora dovrai fare quanto segue ...

  1. Con il tuo file .DMP, crea un file SQL contenente la struttura (tabelle):

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

  2. Aprire il file di indice (index.sql) in un editor di testo che può trovare e sostituire su un intero file e rilasciare le seguenti istruzioni di ricerca e sostituzione IN ORDINE (ignorare le virgolette singole .. '):

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

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

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

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. Salvare il file di indice, quindi eseguirlo contro il tuo account Oracle Express Edition (trovo che sia meglio creare un nuovo account utente XE vuoto - o rilasciare e ricreare se sto aggiornando):

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

  4. Finalmente esegui lo stesso file .DMP che hai creato il file di indice con lo stesso account per importare i dati, le stored procedure, le viste ecc:

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

È possibile che si verifichino pagine di errori Oracle durante il tentativo di creare determinati oggetti, ad esempio i lavori di database, poiché Oracle proverà a utilizzare lo stesso identificatore di database, che molto probabilmente non funzionerà come se si fosse su un altro database.

31
Andrew

Per me questo lavoro va bene (Oracle Database 10g Express Edition versione 10.2.0.1.0):

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

Ma per il nuovo ripristino è necessario un nuovo tablespace

Post scriptum Forse utile http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6

Quale versione di Oracle stai usando? Se è pari o superiore a 10 g, è consigliabile utilizzare Data Pump invece di import/export. Non sono sicuro al 100% se è in grado di gestire questo scenario, ma mi aspetto che potrebbe.

Data Pump è la sostituzione per exp/imp per 10g e oltre. Funziona in modo molto simile a exp/imp, eccetto il suo (presumibilmente, non lo uso poiché sono bloccato in 9i land) meglio.

Ecco i documenti del Data Pump

3
Matthew Watson

Voglio migliorare per due utenti sia in diversi tablespace su server diversi (database)

1 . Per prima cosa crea una directory per il dump temporaneo per entrambi i server (database):

server # 1:

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 . Export (server # 1):

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

3 . Import (server # 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

la mia soluzione è usare l'utility GSAR per sostituire il nome tablespace nel file DUMP. Quando si sostituisce, assicurarsi che la dimensione del file di dump invariato aggiungendo spazi . E.g.

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

Il problema ha a che fare con le colonne CLOB. Sembra che lo strumento imp non possa riscrivere l'istruzione create per utilizzare un altro tablespace.

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

La soluzione è: Creare lo schema manualmente nello spazio tabella corretto. Se non si dispone di uno script per creare lo schema, è possibile crearlo utilizzando indexfile = dello strumento imp.

Devi disabilitare tutti i tuoi vincoli, lo strumento di imp di Oracle non li disabiliterà. 

Successivamente è possibile importare i dati con il seguente comando:

imp b/*** file = oracledump.dmp log = import.log fromuser = a touser = b statistiche = nessuno ignore = y

Nota: avevo ancora bisogno delle statistiche = nessuna a causa di altri errori.

ulteriori informazioni sulla pompa dati

A partire da Oracle 10 l'importazione/esportazione è migliorata: lo strumento pompa dati ([ http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php][1] )

Usando questo per reimportare i dati in un nuovo tablespace:

  1. Prima crea una directory per il dump temporaneo:

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

  2. Esportare:

    expdp a/* schemi = una directory = tempdump dumpfile = adump.dmp logfile = adump.log

  3. Importare:

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

Nota: i file di dump sono memorizzati e letti dal disco del server, non dal disco locale (client)

1
Michiel Overeem

La risposta è difficile, ma fattibile:

La situazione è: utenteAe tablespaceX

  1. importa il tuo file dump in un altro database (questo è necessario solo se hai bisogno di conservare una copia di quello originale)
  2. rinomina tablespace

    alter tablespaceXrinomina inY

  3. creare una directory per il comando expdp e concedere i diritti

  4. crea un dump con expdp
  5. rimuovi il vecchio utente e il vecchio spazio tabella (Y)
  6. crea il nuovo tablespace (Y)
  7. creare il nuovo utente (con un nuovo nome) - in questo casoB- e concedere i diritti (anche alla directory creata con il passaggio 3)
  8. importa il dump con impdp

    directory impdp B/B = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA =A:B

e questo è tutto ...

1
Michiel Overeem

Perché volevo import (a Oracle 12.1 | 2) un dump che era exported da un database di sviluppo locale (18c xe) e sapevo che tutti i miei database di destinazione avrebbero un tablespace accessibile chiamato DATABASE_TABLESPACE, ho appena creato il mio schema/utente utilizzare un nuovo tablespace con quel nome anziché il USERS predefinito (al quale non ho accesso sui database di destinazione):

-- 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;

Un exp creato da questo rende imp felice sulla mia destinazione.

0
masterxilo