it-swarm-eu.dev

So importieren Sie einen Oracle-Dump in einem anderen Tabellenbereich

Ich möchte einen Oracle-Dump in einen anderen Tabellenbereich importieren.

Ich habe einen Tabellenbereich A, der von Benutzer A verwendet wird. Ich habe DBA für diesen Benutzer widerrufen und ihm die Berechtigungen und die Ressource zugewiesen. Dann habe ich alles mit dem Befehl abgeladen

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

Nun möchte ich den Dump in den von Benutzer B verwendeten Tablespace B importieren. Ich habe ihm also die Berechtigungen für connect und resource (keine DBA) gegeben. Dann habe ich folgenden Import ausgeführt:

imp b/*** file = oracledump.dmp log = import.log von user = a bis user = b 

Das Ergebnis ist ein Protokoll mit vielen Fehlern:

IMP-00017: Die folgende Anweisung ist mit dem Oracle-Fehler 20001 fehlgeschlagen: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: Oracle-Fehler 20001 festgestellt ORA-20001: Ungültige oder inkonsistente Eingabewerte

Danach habe ich den gleichen Importbefehl ausprobiert, jedoch mit der Option statistics = none. Dies führte zu folgenden Fehlern:

ORA-00959: Der Tabellenbereich 'A_TBLSPACE' ist nicht vorhanden

Wie soll das gemacht werden?

Hinweis: Viele Spalten haben den Typ CLOB. Es sieht so aus, als hätten die Probleme damit zu tun.

Hinweis 2: Die Oracle-Versionen sind eine Mischung aus 9.2, 10.1 und 10.1 XE. Aber ich glaube nicht, dass es mit Versionen zu tun hat.

33
Michiel Overeem

Sie haben hier ein paar Probleme.

Erstens , die verschiedenen Versionen von Oracle, die Sie verwenden, sind der Grund für den Fehler der Tabellenstatistik. Ich hatte das gleiche Problem, als einige unserer Oracle 10g-Datenbanken auf Release 2 aktualisiert wurden und einige noch in Release 1 und Ich habe .DMP-Dateien zwischen ihnen ausgetauscht.

Die Lösung, die für mich funktionierte, bestand darin, dieselbe Version der Tools exp und imp zu verwenden, um das Exportieren und Importieren der verschiedenen Datenbankinstanzen durchzuführen. Dies war am einfachsten, wenn Sie alle Befehle zum Exportieren und Importieren auf demselben PC (oder Oracle-Server) ausgeben.

Zweitens , ich vermute, Sie erhalten den ORA-00959: tablespace 'A_TBLSPACE' does not exist, weil Sie versuchen, eine .DMP-Datei aus einer ausgewachsenen Oracle-Datenbank in die 10g Express Edition (XE) -Datenbank zu importieren, die standardmäßig eine einzige erstellt , vordefinierter Tabellenbereich namens USERS für Sie.

In diesem Fall müssen Sie Folgendes tun.

  1. Erstellen Sie mit Ihrer .DMP-Datei eine SQL-Datei mit der Struktur (Tabellen):

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

  2. Öffnen Sie die Indexdatei (index.sql) in einem Texteditor, der eine ganze Datei suchen und ersetzen kann, und geben Sie die folgenden Anweisungen zum Suchen und Ersetzen IN ORDER aus (ignorieren Sie die Anführungszeichen.)

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

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

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

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. Speichern Sie die Indexdatei und führen Sie sie dann für Ihr Oracle Express Edition-Konto aus (ich finde es am besten, ein neues, leeres XE-Benutzerkonto zu erstellen - oder löschen und neu erstellen, wenn ich aktualisiere):

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

  4. Führen Sie schließlich die gleiche .DMP-Datei aus, mit der Sie die Indexdatei für dasselbe Konto erstellt haben, um die Daten, gespeicherten Prozeduren, Ansichten usw. zu importieren:

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

Beim Versuch, bestimmte Objekte wie Datenbankjobs zu erstellen, werden möglicherweise Seiten mit Oracle-Fehlern angezeigt, da Oracle versucht, dieselbe Datenbankkennung zu verwenden, was höchstwahrscheinlich fehlschlägt, da Sie sich in einer anderen Datenbank befinden.

31
Andrew

Wenn Sie Oracle 10g und Datapump verwenden, können Sie die REMAP_TABLESPACE-Klausel verwenden. Beispiel:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
16
Neil Kodner

Für mich ist diese Arbeit in Ordnung (Oracle Database 10g Express Edition Version 10.2.0.1.0):

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

Für die Wiederherstellung benötigen Sie jedoch einen neuen Tablespace

P.S. Vielleicht nützlich http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6

Welche Oracle-Version verwenden Sie? Wenn es 10 g oder mehr ist, sollten Sie Data Pump anstelle von Import/Export verwenden. Ich bin nicht hundertprozentig sicher, ob es mit diesem Szenario umgehen kann, aber ich würde es erwarten.

Data Pump ist der Ersatz für exp/imp für 10 g und darüber. Es funktioniert sehr ähnlich wie exp/imp, abgesehen von dessen (angeblich benutze ich es nicht, da ich in 9i lande) besser.

Hier sind die Data Pump-Dokumente

3
Matthew Watson

Ich möchte zwei Benutzer in unterschiedlichen Tablespaces auf verschiedenen Servern (Datenbanken) verbessern.

1 . Erstellen Sie zunächst ein Verzeichnis für den temporären Speicherauszug für beide Server (Datenbanken):

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 . Exportieren (Server 1):

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

3 . Importieren (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

meine Lösung besteht darin, das GSAR-Dienstprogramm zu verwenden, um den Namen des Tabellenbereichs in der DUMP-Datei zu ersetzen. Stellen Sie beim Replizieren sicher, dass die Größe der Speicherabbilddatei unverändert ist, indem Sie Leerzeichen .

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

Das Problem hat mit den CLOB-Spalten zu tun. Es scheint, dass das imp-Tool die create-Anweisung nicht umschreiben kann, um einen anderen Tablespace zu verwenden.

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

Die Lösung lautet: Erstellen Sie das Schema manuell im korrekten Tabellenbereich. Wenn Sie nicht über ein Skript zum Erstellen des Schemas verfügen, können Sie es mithilfe der Indexdatei = des Imp-Tools erstellen.

Sie müssen alle Einschränkungen selbst deaktivieren, das Oracle Imp-Tool deaktiviert sie jedoch nicht. 

Danach können Sie die Daten mit folgendem Befehl importieren:

imp b/*** file = oracledump.dmp log = import.log von user = a an user = b statistics = keine ignorieren = y

Hinweis: Ich habe immer noch die Statistik benötigt = keine wegen anderer Fehler.

zusätzliche Informationen zur Datenpumpe

Ab Oracle 10 wurde der Import/Export verbessert: das Data Pump Tool ([ http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php ][1] )

Verwenden Sie dies, um die Daten erneut in einen neuen Tabellenbereich zu importieren:

  1. Erstellen Sie zuerst ein Verzeichnis für den temporären Speicherauszug:

    CREATE OR REPLACE DIRECTORY Tempdump AS '/ temp/tempdump /';
    GRANT READ, SCHREIBEN AUF VERZEICHNIS tempdump AUF a;

  2. Export:

    expdp a/* schemas = ein Verzeichnis = Tempdump dumpfile = adump.dmp logfile = adump.log

  3. Einführen:

    impdp b/* verzeichnis = tempdump dumpfile = adump.dmp logdatei = bdump.log REMAP_SCHEMA = a: b

Hinweis: Die Dump-Dateien werden von der Serverfestplatte gespeichert und gelesen, nicht von der lokalen (Client-) Festplatte

1
Michiel Overeem

Die Antwort ist schwierig, aber machbar:

Situation ist: BenutzerEINund TabellenbereichX

  1. importieren Sie Ihre Dump-Datei in eine andere Datenbank (dies ist nur erforderlich, wenn Sie eine Kopie der Originaldatei aufbewahren müssen).
  2. tabellenbereich umbenennen

    tabellenbereich ändernXumbenennen inY

  3. erstellen Sie ein Verzeichnis für den Befehl expdp und erteilen Sie die Rechte

  4. erstellen Sie einen Speicherauszug mit expdp
  5. den alten Benutzer und den alten Tablespace entfernen (Y)
  6. erstellen Sie den neuen Tabellenbereich (Y)
  7. erstellen Sie den neuen Benutzer (mit einem neuen Namen) - in diesem FallB- und erteilen Sie die Rechte (auch für das mit Schritt 3 erstellte Verzeichnis).
  8. importieren Sie den Dump mit impdp

    impdp B/B-Verzeichnis = DIR dumpfile = DUMPFILE.dmp Logdatei = LOGFILE.log REMAP_SCHEMA =A:B

und das ist es...

1
Michiel Overeem

Da ich import (zu Oracle 12.1 | 2) einen Dump, der exportiert war, aus einer lokalen Entwicklungsdatenbank (18c xe) wollte und wusste, dass alle meine Zieldatenbanken über einen zugänglichen Tabellenbereich namens DATABASE_TABLESPACE verfügen, habe ich gerade mein Schema/Benutzer erstellt So verwenden Sie einen neuen Tabellenbereich dieses Namens anstelle der Standardvariable USERS (auf die ich keinen Zugriff auf die Zieldatenbanken habe):

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

Eine daraus erstellte exp macht imp glücklich auf meinem Ziel.

0
masterxilo