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.
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 ...
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
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'
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
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.
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
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.
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
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
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:
Prima crea una directory per il dump temporaneo:
CREATE OR REPLACE DIRECTORY tempdump AS '/ temp/tempdump /';
GRANT READ, WRITE ON DIRECTORY tempdump TO a;
Esportare:
expdp a/* schemi = una directory = tempdump dumpfile = adump.dmp logfile = adump.log
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)
La risposta è difficile, ma fattibile:
La situazione è: utenteAe tablespaceX
rinomina tablespace
alter tablespaceXrinomina inY
creare una directory per il comando expdp e concedere i diritti
importa il dump con impdp
directory impdp B/B = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA =A:B
e questo è tutto ...
Perché volevo imp
ort (a Oracle 12.1 | 2) un dump che era exp
orted 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.