Migration entre SGBD
Guide pour migrer les données breakout entre PostgreSQL, MySQL et SQL Server.
Stratégies de Migration
Option 1 : Re-Breakout (Recommandé)
Avantage : Simple, pas de conversion SQL.
# 1. Changer SGBD dans .env
BREAKOUT_DB_TYPE=postgresql # ou mysql, sqlserver
# 2. Supprimer anciennes tables (optionnel)
# Dans l'ancienne DB
# 3. Re-lancer breakout
php bin/console csweb:process-cases-by-dict EVAL_DICTDurée : Dépend du volume (ex: 100k cases = ~15 min).
Option 2 : Export/Import SQL
Avantage : Conservation données exactes.
Étapes :
- Export depuis source
- Conversion syntaxe SQL
- Import vers destination
MySQL → PostgreSQL
1. Export MySQL
docker compose exec mysql-breakout mysqldump \
-u breakout_user -p \
--no-create-info \
--complete-insert \
csweb_breakout > mysql_data.sql2. Conversion Syntaxe
# Remplacer backticks par guillemets
sed -i 's/`/"/g' mysql_data.sql
# Remplacer AUTO_INCREMENT
sed -i 's/AUTO_INCREMENT/SERIAL/g' mysql_data.sql
# Booléens
sed -i 's/ 1/ true/g' mysql_data.sql
sed -i 's/ 0/ false/g' mysql_data.sql3. Import PostgreSQL
cat mysql_data.sql | docker compose exec -T postgres \
psql -U csweb_analytics -d csweb_analyticsPostgreSQL → MySQL
1. Export PostgreSQL
docker compose exec postgres pg_dump \
-U csweb_analytics \
--data-only \
--inserts \
csweb_analytics > pg_data.sql2. Conversion Syntaxe
# Remplacer séquences
sed -i 's/SERIAL/INT AUTO_INCREMENT/g' pg_data.sql
# Booléens
sed -i 's/true/1/g' pg_data.sql
sed -i 's/false/0/g' pg_data.sql
# Guillemets
sed -i 's/"/`/g' pg_data.sql3. Import MySQL
cat pg_data.sql | docker compose exec -T mysql-breakout \
mysql -u breakout_user -p csweb_breakoutPostgreSQL → SQL Server
1. Export PostgreSQL
docker compose exec postgres pg_dump \
-U csweb_analytics \
--data-only \
--inserts \
csweb_analytics > pg_data.sql2. Conversion Syntaxe
# Booléens
sed -i 's/true/1/g' pg_data.sql
sed -i 's/false/0/g' pg_data.sql
# Guillemets simples pour valeurs
sed -i "s/\"/'/g" pg_data.sql3. Import SQL Server
cat pg_data.sql | docker compose exec -T sqlserver \
/opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P 'YourStrong!Passw0rd'Outils Tiers
pgLoader (PostgreSQL → Autre)
# Installation
apt-get install pgloader
# Migration MySQL → PostgreSQL
pgloader mysql://user:pass@localhost/csweb_breakout \
postgresql://user:pass@localhost/csweb_analyticsDBeaver (Interface Graphique)
- Installer DBeaver : https://dbeaver.io/ (opens in a new tab)
- Connecter les 2 bases
- Sélectionner tables source
- Export → SQL INSERT
- Import dans destination
Migration avec Downtime
Planification
Étape 1 : Maintenance Mode
# Désactiver CSWeb
docker compose stop cswebÉtape 2 : Backup Source
# Backup complet
pg_dump/mysqldump/sqlcmd backupÉtape 3 : Migration
# Re-breakout ou import SQL
php bin/console csweb:process-cases-by-dict ALL_DICTSÉtape 4 : Vérification
-- Compter rows
SELECT COUNT(*) FROM eval_cases;
-- Comparer avec sourceÉtape 5 : Redémarrage
docker compose --profile local-postgres up -dMigration Sans Downtime
Approche : Blue-Green Deployment
- Préparer nouvelle DB (PostgreSQL) en parallèle
- Breakout vers nouvelle DB
- Tester nouvelle DB
- Basculer
BREAKOUT_DB_TYPE - Surveiller
Vérification Post-Migration
Compter Rows
-- Source
SELECT 'eval_cases' AS table_name, COUNT(*) AS row_count FROM eval_cases
UNION ALL
SELECT 'eval_producteurs', COUNT(*) FROM eval_producteurs;
-- Destination (même query)
-- Comparer résultatsVérifier Types Données
-- PostgreSQL
\d+ eval_cases
-- MySQL
DESCRIBE eval_cases;
-- SQL Server
EXEC sp_columns eval_cases;Test Query
-- Query fonctionnelle
SELECT verified, COUNT(*)
FROM eval_cases
GROUP BY verified;Rollback
Si migration échoue :
# 1. Restaurer backup source
cat backup.sql | psql/mysql/sqlcmd
# 2. Revenir ancien SGBD dans .env
BREAKOUT_DB_TYPE=mysql # (ancien)
# 3. Redémarrer
docker compose restart csweb