2009-06-17 5 views
1

Ich muss Daten von einer Informix-Datenbank in eine andere kopieren. Ich möchte LOAD dafür nicht verwenden. Gibt es irgendein Skript, das mir dabei helfen kann? Gibt es einen anderen Weg, dies zu tun?Skript zum Kopieren von Daten von einer Informix-Datenbank in eine andere

+1

Da LOAD (und UNLOAD) die offensichtliche Antwort sind, aber Sie es ablehnen, sollten Sie erklären, warum LOAD nicht für Sie geeignet ist. –

Antwort

2

Ohne ein bisschen mehr Informationen über die Arten von Informix-Datenbanken, die Sie haben, ist es schwer zu sagen, was die beste Option für Sie ist.

Wenn es sich um eine kleine Anzahl von Tabellen und große Datenmengen handelt, schauen Sie sich onunload, onload und/oder den High Performance Loader an. (Ich nehme an, wir sprechen hier nicht über Standard Engine.)

Wenn Sie auf der anderen Seite viele Tabellen haben und HPL zu fummelig ist, schauen Sie sich myexport/myimport (verfügbar auf der iiug. Organisationsstelle). Dies sind nicht sperrende Entsprechungen der standardmäßigen dbexport/dbimport-Dienstprogramme.

2

Die einfachste Lösung besteht darin, die Datenbankinstanz zu sichern und sie in einer separaten Instanz wiederherzustellen. Wenn dies für Sie nicht möglich ist, gibt es andere Möglichkeiten.

  • dbexport/dbimport
  • unload/load
  • handgefertigte SQL fügt

Wenn die Datenbankstruktur identisch ist, dann können Sie verwenden dbexport/dbimport, aber das wird die Daten entladen zu flache Dateien, entweder im Dateisystem oder auf Band und dann aus den flachen Dateien importieren.

Ich finde im Allgemeinen, dass, wenn die DB-Struktur die gleiche ist, Laden/Entladen die einfachste Lösung ist.

Wenn Sie nicht wollen, laden verwenden/Entladen dbimport/dbexport dann können Sie direkte SQL-EINSÄTZE verwenden, wie (Ungeprüfte müssen Sie die Syntax überprüfen) folgt

INSERT INTO [email protected]_server2:table 
SELECT * FROM [email protected]_server1:table_name 

Dies würde natürlich bedeuten, konsistente Tabelle Struktur, könnten Sie eine Spaltenliste verwenden, wenn die Struktur anders ist.

Ein Bereich, der Ihnen Probleme verursacht, ist die referenzielle Integrität. Wenn Sie Fremdschlüssel haben, führt dies zu einem Problem, da Sie sicherstellen müssen, dass die Einsätze in der richtigen Reihenfolge ausgeführt werden. Möglicherweise haben Sie auch Probleme mit SERIAL-Spalten und INSERTS. Load leidet nicht an diesem Problem, da Sie in eine Tabelle mit einem seriellen Wert laden und die ursprünglichen Werte beibehalten können.

Ich habe oft festgestellt, dass die beste Lösung

  • Nehmen Sie ein Schema aus database1 wie folgt ist.
  • spaltete es in 2 Teile der anfängliche Segment alle Tabellenerstellung Aussagen ist der zweite Teil alle des Index CREATE, referentielle Integrität etc Anweisungen.
  • Erstellen Sie Datenbank2 aus dem ersten Teil von das Schema. Verwenden Sie UNLOAD/LOAD, um die Daten in database2 zu laden.
  • Wenden Sie den zweiten Teil des Schemas, zu database2

den Prozess Dies ist sehr ähnlich, den dbimport durchläuft, aber historisch habe ich nicht in der Lage gewesen, meine Datenbank zu verwenden dbimport als Synonyme in einer anderen Datenbank und dbimport enthält taten/funktioniert nicht mit diesen.

+0

Die andere große Einschränkung mit dbexport/dbimport ist, dass Sie _have_ tun, die gesamte Datenbank auf einmal zu tun. In der ursprünglichen Frage wurde nicht erwähnt, dass die gesamte Datenbank kopiert werden muss, nur _some_data_. – RET

1

UNLOAD und LOAD sind die einfachste Art, dies zu tun. Sie schließen damit die Verwendung von DB-Load und DB-Access sowie DB-Export und DB-Import aus. Dies sind die einfachsten Möglichkeiten, dies zu tun.

Wie bereits erwähnt, könnten Sie HPL verwenden.

Sie könnten auch ein ER-System einrichten - es ist schwerer als UNLOAD, gefolgt von LOAD, aber verwendet nicht die Verboten-Operationen.

Wenn die beiden Maschinen im Wesentlichen identisch sind, könnten Sie OnOnload und Onload in Betracht ziehen; Ich würde es nicht empfehlen.