Comment utiliser pgloader pour migrer ta base SQL Server vers PostgreSQL


Utiliser pgloader pour migrer ta base SQL Server vers PostgreSQL

Comment utiliser pgloader pour migrer ta base SQL Server vers PostgreSQL sans avoir à tout corriger à la main.


1️⃣ Installer pgloader

Selon ton système :

Sur Windows

pgloader n’a pas de package officiel Windows, mais tu peux :

  • Soit l’installer via Docker

  • Soit utiliser WSL (Windows Subsystem for Linux) et l’installer sous Ubuntu

Avec WSL (recommandé) :

  1. Activer WSL dans Windows (si pas déjà fait) 

  2. Pour installer WSL Ouvrez PowerShell en mode Administrateur en cliquant avec le bouton droit et en sélectionnant « Exécuter en tant qu’administrateur », entrez la commande wsl --install, puis redémarrez votre ordinateur. pour plus d'info cliquer sur ce lien windows/wsl/install

  3. Installer Ubuntu depuis le Microsoft Store

  4. Dans Ubuntu, se connecter (su - Utilisateur)puis tape :

A- D'abord mettre à jour les paquets :

bash
sudo apt update

B- Ensuite installer pgloader :

bash
sudo apt install pgloader


Sur Linux (Debian/Ubuntu)


sudo apt update sudo apt install pgloader

Sur macOS


brew install pgloader

2️⃣ Préparer la connexion

Tu dois avoir :

  • L’adresse de ton SQL Server (ex. 192.168.1.10 ou localhost)

  • Utilisateur & mot de passe SQL Server

  • Nom de la base source

  • Nom de la base PostgreSQL cible (elle doit déjà exister dans PostgreSQL, vide de préférence)


3️⃣ Exemple de commande pgloader

Voici une commande complète :


pgloader "mssql://USER:PASSWORD@IP_SQLSERVER/NOM_BDD" \ "postgresql://USER_PG:PASSWORD_PG@IP_POSTGRES/NOM_BDD"

Exemple concret :


pgloader "mssql://sa:MonMotDePasse@192.168.1.10/MaBaseSQL" \ "postgresql://postgres:MotDePassePG@localhost/MaBasePG"

Où et comment taper la commande ?

  1. Ouvrir le terminal Ubuntu (WSL)

    • Sous Windows, recherchez "Ubuntu" dans le menu Démarrer et ouvrez l’application.

    • Vous devriez voir un terminal avec un prompt comme :

      bash
      user@DESKTOP-XXXXXX:~$
  2. Coller/taper la commande pgloader
    Dans ce terminal, écrivez :

    bash
    pgloader \
      "mssql://user:password@host:port/dbname" \
      "postgresql://user:password@localhost/pg_dbname"

    (Remplacez userpasswordhost, etc. par vos identifiants réels.)

  3. Explications des éléments :

    • mssql://... : Chaîne de connexion à SQL Server (ex: mssql://sa:MyPassword@192.168.1.100:1433/MyDatabase).

    • postgresql://... : Chaîne de connexion à PostgreSQL (ex: postgresql://postgres:postgres@localhost:5432/mydb).

    • \ : Permet de splitter la commande sur plusieurs lignes (facultatif, vous pouvez tout écrire sur une seule ligne).


Cas pratique (exemple complet)

1. Connexion à SQL Server (source)

  • Hôte (host) : 192.168.1.100

  • Port : 1433 (par défaut pour SQL Server)

  • Utilisateur : sa

  • Mot de passe : MonMotDePasse

  • Base de données : AdventureWorks

2. Connexion à PostgreSQL (cible)

  • Hôte : localhost (si PostgreSQL est installé dans WSL)

  • Port : 5432 (port par défaut)

  • Utilisateur : postgres

  • Mot de passe : postgres

  • Base de données : adventureworks_pg

Si PostgreSQL est installé sous Windows 

Si PostgreSQL est installé sous Windows (et non dans WSL/Ubuntu), mais que vous essayez d'y accéder depuis WSL avec localhost, cela explique l'erreur ECONNREFUSED. Voici comment corriger cela :


Solution 1 : Accéder à PostgreSQL (Windows) depuis WSL

A- Récupérez l'IP de Windows depuis WSL :

bash
cat /etc/resolv.conf | grep nameserver | awk '{print $2}'

→ Cela donne l'IP de l'hôte Windows (ex: 172.25.112.1).

B- Utilisez cette IP dans la commande pgloader :

bash
pgloader \
  "mssql://user:password@sql-server-host/db_source" \
  "postgresql://postgres:password@172.25.112.1:5432/db_target"
  • Remplacez 172.25.112.1 par l'IP obtenue à l’étape 1.


Solution 2 : Configurer PostgreSQL (Windows) pour accepter les connexions distantes

A- Éditez pg_hba.conf (trouvé dans C:\Program Files\PostgreSQL\<version>\data) :

Ajoutez cette ligne :

ini
host    all             all             172.25.112.1/32           md5

(Remplacez 172.25.112.1 par l'IP de WSL si différente.)

Pour ajouter la ligne permettant à WSL de se connecter à PostgreSQL sous Windows, voici la procédure détaillée :

Où et comment modifier pg_hba.conf sous Windows ?

  1. Localisation du fichier :

    • Allez dans C:\Program Files\PostgreSQL\<version>\data\

    • Cherchez le fichier pg_hba.conf (pas pg_hba.conf.sample ni autres)

  2. Édition du fichier :

    • Ouvrez-le avec un éditeur de texte en tant qu'Administrateur (Notepad++, VS Code, ou Bloc-notes en mode admin)

    • Ajoutez la ligne à la fin de la section "IPv4 local connections" :

ini
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             172.25.112.1/32          md5  # <-- Ajoutez cette ligne
  1. Format important :

    • Utilisez des tabulations (pas des espaces) entre les colonnes

    • La ligne doit commencer par host (sans #)

    • 172.25.112.1 = IP de Windows vue depuis WSL (obtenue via cat /etc/resolv.conf dans WSL)

  2. Sauvegarde et redémarrage :

    • Sauvegardez le fichier

    • Redémarrez le service PostgreSQL via :

      powershell
      Restart-Service postgresql-<version> -Force

      ou via le Gestionnaire des Services Windows

B- Éditez postgresql.conf :

Décommentez/modifiez :

ini
listen_addresses = '*'
port = 5432
C- Redémarrez PostgreSQL via les Services Windows (ou pg_ctl restart).

Solution 3 : Installer PostgreSQL directement dans WSL (recommandé)

Si possible, installez PostgreSQL dans WSL pour éviter les problèmes réseau :

bash
sudo apt update && sudo apt install postgresql
sudo service postgresql start

Puis utilisez :

bash
pgloader \
  "mssql://user:password@sql-server-host/db_source" \
  "postgresql://postgres:password@localhost:5432/db_target"

 

3. Commande finale

bash
pgloader "mssql://sa:MonMotDePasse@192.168.1.100:1433/AdventureWorks" "postgresql://postgres:postgres@localhost:5432/adventureworks_pg"

Erreurs courantes et solutions

  1. Failed to connect to SQL Server

    • Vérifiez que :

      • SQL Server accepte les connexions distantes (via SQL Server Configuration Manager > TCP/IP activé).

      • Le firewall Windows autorise le port 1433.

      • Les identifiants sont corrects (testez avec sqlcmd ou Azure Data Studio).

  2. Password authentication failed for PostgreSQL

    • Modifiez /etc/postgresql/.../pg_hba.conf pour autoriser les connexions :

      text
      host    all             all             127.0.0.1/32            md5
    • Puis redémarrez PostgreSQL :

      bash
      sudo service postgresql restart
  3. Unknown type XYZ in SQL Server

    • Utilisez un fichier .load pour mapper les types :

      lisp
      LOAD DATABASE
        FROM mssql://user:password@host/db
        INTO postgresql://user:password@localhost/db
       WITH cast type datetime to timestamptz;

Alternative : Utiliser un fichier de configuration

  1. Créez un fichier migration.load :

    bash
    nano migration.load
  2. Ajoutez les règles de migration :

    lisp
    LOAD DATABASE
      FROM mssql://sa:MonMotDePasse@192.168.1.100/AdventureWorks
      INTO postgresql://postgres:postgres@localhost/adventureworks_pg
    WITH include drop, create tables, reset sequences;
  3. Exécutez-le :

    bash
    pgloader migration.load

Résumé

  • Où écrire la commande : Dans le terminal Ubuntu (WSL).

  • Format :

    bash
    pgloader "source_mssql" "target_postgresql"
  • Conseil : Testez d’abord avec --dry-run pour vérifier les erreurs.


4️⃣ Utilisation avec un fichier script .load

Si tu veux plus de contrôle, crée un fichier migration.load :


LOAD DATABASE FROM mssql://sa:MotDePasse@192.168.1.10/MaBaseSQL INTO postgresql://postgres:MotDePassePG@localhost/MaBasePG WITH include no drop, create tables, create indexes, reset sequences SET work_mem to '16MB', maintenance_work_mem to '512 MB' CAST type datetime2 to timestamp drop default drop not null

Et lance :


pgloader migration.load

5️⃣ Avantages de pgloader

  • Automatique : pas besoin de modifier le .sql à la main

  • Convertit automatiquement les types SQL Server → PostgreSQL

  • Rapide : même sur une grosse BDD

  • Gère les encodages et séquences

Commentaires

Posts les plus consultés de ce blog

🛠 Utilisation de CustomUIEditor pour Personnaliser le Ruban Excel

🗓️ Simulateur de Congés et Calendrier Collaboratif sous Google Sheets

Explication VBA : Facturation automatique Gestion client