Schema in neuen oder anderen Tablespace importieren

13

Gibt es eine bequeme Möglichkeit zum Importieren eines Schemas in Oracle 11gR2 mithilfe eines einzelnen neuen oder anderen Tabellenbereichs als dem, aus dem die Daten stammen?

Als Beispiel habe ich BLOG_DATA aus OLDDB exportiert, wo alle Benutzerdaten im USERS-Tabellenbereich gespeichert sind.

In NEWDB möchte ich das BLOG_DATA-Schema importieren, aber die Benutzerobjekte im BLOG_DATA-Tabellenbereich speichern, der speziell für diesen Benutzer erstellt wurde.

Ich habe den BLOG_DATA-Benutzer erstellt, den BLOG_DATA-Tabellenbereich erstellt und ihn als Standard-Tabellenbereich für diesen Benutzer festgelegt und ein entsprechendes unbegrenztes Kontingent hinzugefügt.

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

Das Schema wurde mit so etwas wie aus OLDDB exportiert

exp blog_data/secretpassword@OLDDB file=blog_data.dmp 

Nachdem ich Phils ausgezeichnete Antwort unten gelesen hatte, fragte ich mich :

Da die Daten keinen anderen Speicherort als den Standardtabellenbereich haben - den einzigen Tabellenbereich, für den der Benutzer ein Kontingent festgelegt hat - wird dadurch der IMP gezwungen, alle Benutzerobjekte in diesen Standardtabellenbereich zu verschieben?

imp blog_data/secretpassword@NEWDB file=blog_data.dmp

Würde dies dann das gesamte blog_data-Schema in den blog_data-Tabellenbereich von NEWDB stellen? Gibt es einen Grund, warum dies nicht funktioniert oder ich Probleme mit bestimmten Objekten usw. habe?

aktualisieren:

Ich habe einen kurzen Test gemacht und festgestellt, dass dies der Fall ist. ImpPlatziert Objekte im Standardtabellenbereich für diesen Benutzer, vorausgesetzt, er kann sie nicht im ursprünglichen Tabellenbereich platzieren (z. B. der Tabellenbereich ist nicht vorhanden). Vollständige Erklärung: http://www.dolicapax.org/?p=57

Dennoch denke ich, dass die Verwendung von Data Pump, wie Phil vorschlägt, die bevorzugte Option sein könnte.

Roy
quelle
Wurde es mit dem alten expDienstprogramm oder mit expdp(Datenpumpe) exportiert ?
Philᵀᴹ
Im Beispiel wurde es mit dem oben gezeigten herkömmlichen Dienstprogramm exp exportiert. Ich nehme an, man könnte expdp genauso einfach verwenden und die Datei vom alten Datenbankserver abrufen. Würde das den Übergang zu einem neuen Tablespace erleichtern?
Roy
Ich habe beide in meiner Antwort behandelt. Verwenden Sie Data Pump - es ist einfacher, diese Aufgabe
auszuführen

Antworten:

15

Es ist nicht möglich, einen anderen Tablespace beim Importieren mit dem Oracle- impDienstprogramm anzugeben . Um dieses Problem zu umgehen, können Sie die Tabellen vorab erstellen, indem Sie sie ROWS=Nin den USERSTabellenbereich importieren , dann alter table mytable move tablespace BLOG_DATA;für jede Tabelle in den neuen Tabellenbereich verschieben und den Import mit dem IGNORE=YParameter erneut ausführen, um die Fehler bei der Tabellenerstellung zu ignorieren und alle zu importieren der Daten.

Wenn die Daten mit Data Pump ( expdp) exportiert wurden (abgesehen davon sollte dies heutzutage jeder verwenden und nicht das alte Legacy exp/ impDienstprogramm), können Sie sie mit dem REMAP_TABLESPACEParameter problemlos in einen anderen Tablespace importieren .

z.B:

impdp scott/tiger@ZOMG file=blog_data.dmp directory=mydir remap_tablespace=USERS:BLOG_DATA
Philᵀᴹ
quelle
Vielen Dank, Phil. Ich habe mich gefragt: Wenn der Benutzer, in den ausschließlich importiert wird, ein Kontingent für den Standardtabellenbereich hat, zwingt das imp, alle importierten Objekte in diesem Standardtabellenbereich zu platzieren, unabhängig vom Layout in der Datenquelle?
Roy
Ich arbeite an etwas Ähnlichem, aber es ist eine vollständige DB-Migration mit expdp / impdp, weil ich möchte, dass unsere QA-Umgebung mit der Produktion übereinstimmt. Wenn ich remap_tablespace verwende, wird jedes Schema einem anderen einzelnen Tablespace zugeordnet. Ich denke jedoch, dass ich den Befehl impdp einmal pro Schema ausführen und remap_tablespace verwenden kann. Dies sollte den Job erreichen.
Nicolas de Fontenay
0

Sie sollten die folgenden Schritte ausführen: -

  • Exportieren Sie den Benutzer
  • Führen Sie den Import mit dem Befehl aus.
    imp system/manager file=export.dmp indexfile=newfile.sql
    Dadurch werden die Daten importiert und alle Definitionen in gespeichert newfile.sql.
  • Lass notwendige Gegenstände fallen.
  • Führen Sie das Skript aus, newfile.sqlnachdem Sie die Tablespaces geändert haben.
  • Import aus dem Backup für die benötigten Objekte.
Md Wasi
quelle