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

Migrer vers une autre base de données (hétérogène)

Oracle

# Oracle -> PostgreSQL: Ora2Pg (schema + data + PL/SQL conversion)
ora2pg -c ora2pg.conf -t TABLE   -o schema.sql
ora2pg -c ora2pg.conf -t COPY    -o data.sql   # data in COPY format
ora2pg -t SHOW_REPORT --estimate_cost           # migration cost estimate

# Oracle -> (multiple targets) managed/online: AWS DMS or Oracle GoldenGate

Pour une migration hétérogène depuis Oracle (notamment vers PostgreSQL), l'outil open source le plus courant est Ora2Pg : il convertit tables, contraintes, PL/SQL et données dans le dialecte cible ; --estimate_cost estime l'effort de migration. Pour une migration en ligne/à faible interruption, on utilise AWS DMS ou Oracle GoldenGate (avec CDC).

PostgreSQL

# MySQL -> PostgreSQL: pgloader (schema+data+type conversion in one command)
pgloader mysql://app_user:password@source/shop \
         postgresql://app_user:password@target/shop

# Also from SQLite/MSSQL sources: with a pgloader ./migration.load script
# For a managed/online PostgreSQL target: AWS DMS

pgloader est l'outil standard pour migrer vers PostgreSQL depuis d'autres moteurs (MySQL, SQLite, MS SQL) : à partir de chaînes de connexion, il crée le schéma en une commande, mappe les types et copie les données rapidement ; les transformations/mappages de types personnalisés se définissent dans un script .load. Si la source est Oracle, Ora2Pg est préférable ; pour une migration en ligne, AWS DMS.

MySQL

# PostgreSQL/Oracle/MSSQL -> MySQL: AWS DMS (managed) is the most common path
# or adapt the source-specific export for MySQL:
#   pg_dump --inserts ... | (type/syntax fixes) | mysql shop

# MySQL <-> MariaDB (compatible): mysqldump output loads directly
mysqldump --single-transaction shop | mysql -h target_mariadb shop

Il n'existe pas d'outil ouvert unique et dominant pour migrer vers MySQL depuis d'autres moteurs ; la solution la plus courante est AWS DMS (géré, compatible CDC) ou l'adaptation du dump source (syntaxe/types) puis son chargement avec le client mysql. MySQL et MariaDB sont largement compatibles ; la sortie de mysqldump migre généralement telle quelle.

SQL Server

# SQL Server -> PostgreSQL: with pgloader
pgloader mssql://app_user:password@source/shop \
         postgresql://app_user:password@target/shop

# SQL Server -> PostgreSQL compatibility layer: Babelfish for Aurora PostgreSQL
# (runs T-SQL and the TDS protocol on top of PostgreSQL)
# To other targets: SSMA (SQL Server Migration Assistant) or AWS DMS

pgloader (source mssql://) sert à migrer de SQL Server vers PostgreSQL ; si vous voulez conserver le T-SQL sans modifier l'application, Babelfish for Aurora PostgreSQL offre une couche de compatibilité. L'outil SSMA de Microsoft automatise la migration d'autres moteurs (Oracle, MySQL, DB2) vers SQL Server. Pour une migration en ligne, AWS DMS.

MongoDB

# Relational <-> MongoDB conversion requires schema mapping (ETL):
#   - Relational Migrator (official MongoDB tool): maps tables to the document model
#   - or generate JSON from the source -> load with mongoimport
mongoexport --db=shop --collection=customer --type=csv --fields=id,name > c.csv
# (To an SQL target: mongoexport CSV -> relational COPY/LOAD DATA)

La migration entre MongoDB et les moteurs SQL nécessite une transformation de modèle ligne<->document (ETL) ; il n'y a pas de commande unique automatique. De SQL vers MongoDB, MongoDB Relational Migrator mappe les tables vers un schéma de documents ; dans les cas simples, générez du CSV/JSON depuis la source et chargez-le avec mongoimport. Dans le sens inverse, la sortie de mongoexport se charge dans la table relationnelle cible avec COPY/LOAD DATA.

Redis

# With RIOT (Redis Input/Output Tools), to/from Redis from other sources:
#   Relational -> Redis:
riot db-import --jdbc-url "jdbc:postgresql://host/shop" \
  --sql "SELECT * FROM customer" hset --keyspace customer --keys id
#   Redis -> another Redis / file:  riot replicate / riot file-export

Dans une migration hétérogène, Redis est généralement la couche de cache, en cible ou en source ; pour charger dans Redis des données issues de sources relationnelles ou de fichiers, on utilise l'outil officiel RIOT de Redis (db-import mappe un résultat SQL vers des structures HSET/SET). Pour Redis vers Redis ou vers un fichier, il existe les commandes riot replicate / file-export.

Elasticsearch

# Relational/other source -> Elasticsearch: Logstash (JDBC input)
# logstash.conf: input { jdbc { statement => "SELECT * FROM customer" } }
#                output { elasticsearch { index => "customer" } }

# ES -> ES (version/cluster upgrade): reindex from a remote source
POST _reindex
{ "source": { "remote": { "host": "http://old:9200" }, "index": "customer" },
  "dest": { "index": "customer" } }

L'outil le plus courant pour migrer d'autres bases vers Elasticsearch est Logstash (entrée JDBC/fichier -> sortie elasticsearch) ; les connecteurs/Beats d'Elastic sont aussi utilisés. Pour passer d'un ancien cluster Elasticsearch à un nouveau, le remote reindex (_reindex avec une source 'remote') est courant ; reindex.remote.whitelist doit être défini sur la cible.

Ouvrir dans DBAtlas →