DBAtlas · Atlas für Datenbankbetrieb

Daten zwischen Tabellen / Umgebungen kopieren

Oracle

-- Into an existing table
INSERT INTO target_tbl (id, name) SELECT id, name FROM source_tbl WHERE status = 'ACTIVE';

-- By creating a new table (CTAS)
CREATE TABLE target_tbl AS SELECT * FROM source_tbl;

-- From a remote database via a database link
INSERT INTO target_tbl SELECT * FROM source_tbl@remote_db;

Innerhalb derselben Datenbank INSERT ... SELECT oder CREATE TABLE AS SELECT (CTAS) verwenden. Für Kopien zwischen Umgebungen sind ein Database Link (@remote_db) oder Data Pump vorzuziehen. Der Hint APPEND beschleunigt per Direct Path.

PostgreSQL

-- Same database
INSERT INTO target_tbl (id, name) SELECT id, name FROM source_tbl;
CREATE TABLE target_tbl AS SELECT * FROM source_tbl;

-- Between environments (psql pipe)
-- pg_dump -t source_tbl sourcedb | psql targetdb
-- or read the remote table with postgres_fdw and INSERT

Innerhalb derselben DB INSERT ... SELECT / CTAS verwenden. Zwischen Servern eine Pipeline pg_dump | psql verwenden oder über eine Foreign Table mit postgres_fdw kopieren.

MySQL

-- Same database
INSERT INTO target_tbl (id, name) SELECT id, name FROM source_tbl;
CREATE TABLE target_tbl AS SELECT * FROM source_tbl;

-- Between servers (mysqldump pipe)
-- mysqldump sourcedb source_tbl | mysql -h targethost targetdb

Innerhalb derselben DB INSERT ... SELECT oder CREATE TABLE ... AS SELECT. Zwischen verschiedenen Servern ist es üblich, die Ausgabe von mysqldump in den mysql-Client zu pipen. CTAS kopiert keine Indizes und Constraints.

SQL Server

-- Into an existing table
INSERT INTO target_tbl (id, name) SELECT id, name FROM source_tbl;

-- By creating a new table
SELECT * INTO target_tbl FROM source_tbl;

-- Between servers: linked server
INSERT INTO target_tbl SELECT * FROM [REMOTE_SRV].shop.dbo.source_tbl;

In SQL Server erfolgt das Kopieren in eine neue Tabelle mit SELECT ... INTO (das CTAS-Äquivalent). Zwischen Servern einen Linked Server (vierteiliger Name), bcp out/in oder SSIS verwenden.

MongoDB

// Write an aggregation result to another collection
db.source_tbl.aggregate([
  { $match: { status: "ACTIVE" } },
  { $out: "target_tbl" }
]);

// Merge into an existing collection (upsert)
db.source_tbl.aggregate([ { $merge: { into: "target_tbl", whenMatched: "merge", whenNotMatched: "insert" } } ]);

$out ersetzt die Ziel-Collection vollständig; $merge führt mit vorhandenen Dokumenten zusammen bzw. fügt ein (gleiche oder andere DB). Für Verschiebungen zwischen Servern mongodump | mongorestore oder mongoexport/mongoimport verwenden.

Redis

# Move a single key to another server (deleted from the source)
MIGRATE target_host 6379 customer:1 0 5000

# To copy (without deleting): DUMP + RESTORE
DUMP customer:1          # returns the serialized value
RESTORE customer:1new 0 "<dump-data>"

MIGRATE verschiebt den Key atomar in die Zielinstanz und löscht ihn in der Quelle (mit der Option COPY wird nicht gelöscht). Zum Kopieren innerhalb derselben Instanz den Befehl COPY (6.0+) oder DUMP+RESTORE verwenden.

Elasticsearch

# Within the same cluster
POST _reindex
{ "source": { "index": "source_tbl" }, "dest": { "index": "target_tbl" } }

# From a remote cluster (remote reindex; requires the whitelist setting)
POST _reindex
{ "source": { "remote": { "host": "http://remote:9200" }, "index": "source_tbl" },
  "dest": { "index": "target_tbl" } }

_reindex kopiert zwischen Indizes; mit einer Query lässt sich filtern und mit einem Script transformieren. Zwischen Clustern Remote Reindex verwenden (reindex.remote.whitelist muss auf dem Ziel definiert sein). Große Jobs werden mit slices parallelisiert.

In DBAtlas öffnen →