DBAtlas · Atlas d'exploitation des bases de données

Copier des données entre tables / environnements

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;

Dans la même base, utilisez INSERT ... SELECT ou CREATE TABLE AS SELECT (CTAS). Pour les copies entre environnements, un database link (@remote_db) ou Data Pump est préférable. Le hint APPEND accélère avec le 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

Dans la même DB, utilisez INSERT ... SELECT / CTAS. Entre serveurs, utilisez un pipeline pg_dump | psql ou copiez via une table étrangère avec postgres_fdw.

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

Dans la même DB, INSERT ... SELECT ou CREATE TABLE ... AS SELECT. Entre serveurs différents, rediriger la sortie de mysqldump vers le client mysql est courant. CTAS ne copie ni les index ni les contraintes.

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;

Dans SQL Server, la copie vers une nouvelle table se fait avec SELECT ... INTO (l'équivalent de CTAS). Entre serveurs, utilisez un linked server (nom en quatre parties), bcp out/in ou SSIS.

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 remplace entièrement la collection cible ; $merge fusionne avec les documents existants ou les insère (même DB ou autre). Pour les transferts entre serveurs, utilisez mongodump | mongorestore ou mongoexport/mongoimport.

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 déplace atomiquement la clé vers l'instance cible et la supprime de la source (avec l'option COPY, elle n'est pas supprimée). Pour copier dans la même instance, utilisez la commande COPY (6.0+) ou DUMP+RESTORE.

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 copie entre index ; il peut être filtré par une requête et transformé par un script. Entre clusters, utilisez le remote reindex (reindex.remote.whitelist doit être défini sur la cible). Les gros traitements sont parallélisés avec slices.

Ouvrir dans DBAtlas →