
Migración entre Diferentes RDBMS
Aprende a migrar datos entre MySQL, PostgreSQL, SQL Server y Oracle de manera efectiva.
¡Domina la migración entre diferentes sistemas de gestión de bases de datos relacionales! En este tutorial completo te guiaré paso a paso para que aprendas a migrar datos, esquemas y configuraciones entre MySQL, PostgreSQL, SQL Server y Oracle de manera efectiva y segura.
Objetivo: Aprender técnicas completas de migración entre RDBMS incluyendo planificación, conversión de esquemas, migración de datos, validación y troubleshooting para transiciones exitosas entre sistemas de bases de datos.
Paso 1: ¿Por qué migrar entre RDBMS?
La migración entre RDBMS implica mover:
- 📊 Esquemas de base de datos completos
- 📝 Grandes volúmenes de datos
- 🔄 Funciones y procedimientos almacenados
- ⚙️ Configuraciones y permisos de usuarios
- 🔍 Consultas y aplicaciones conectadas
Paso 2: Planificación de la migración
Evaluación previa del sistema actual
-- Inventario de objetos de base de datos
-- MySQL
SELECT TABLE_NAME, TABLE_ROWS, DATA_LENGTH
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'tu_base_datos';
-- PostgreSQL
SELECT schemaname, relname, n_live_tup
FROM pg_stat_user_tables;
Herramientas de evaluación y planificación
- AWS Database Migration Service: Para migraciones a la nube
- Oracle SQL Developer: Para migraciones desde/hacia Oracle
- pgLoader: Específico para migraciones a PostgreSQL
- MySQL Workbench Migration Wizard: Para migraciones a MySQL
Paso 3: Migración de MySQL a PostgreSQL
Preparación del esquema MySQL
-- Generar script de esquema
mysqldump --no-data -u usuario -p tu_base_datos > esquema_mysql.sql
-- Exportar datos
mysqldump --no-create-info --skip-triggers --compact -u usuario -p tu_base_datos > datos_mysql.sql
Conversión automática con pgLoader
# Instalar pgloader
sudo apt-get install pgloader
# Crear archivo de configuración de migración
cat > migracion.load <<EOF
LOAD DATABASE
FROM mysql://usuario:contraseña@localhost/tu_base_datos
INTO postgresql://usuario:contraseña@localhost/tu_base_datos
WITH include drop, create tables, create indexes, reset sequences
SET work_mem to '32MB', maintenance_work_mem to '64MB'
EOF
# Ejecutar migración
pgloader migracion.load
Ajustes manuales comunes
-- Conversión de tipos de datos
-- MySQL INT AUTO_INCREMENT → PostgreSQL SERIAL
-- MySQL DATETIME → PostgreSQL TIMESTAMP
-- MySQL ENUM → PostgreSQL CREATE TYPE + CHECK constraint
-- Conversión de funciones
-- MySQL DATE_FORMAT() → PostgreSQL TO_CHAR()
-- MySQL IFNULL() → PostgreSQL COALESCE()
Paso 4: Migración de PostgreSQL a MySQL
Preparación del esquema PostgreSQL
-- Exportar esquema
pg_dump -s -O -x -n public -f esquema_postgres.sql tu_base_datos
-- Exportar datos
pg_dump -a -O -x -n public -f datos_postgres.sql tu_base_datos
Conversión de esquema
# Usar mysql-workbench para la migración
# O realizar conversión manual
# Patrones comunes de conversión:
-- PostgreSQL SERIAL → MySQL INT AUTO_INCREMENT
-- PostgreSQL VARCHAR(n) → MySQL VARCHAR(n)
-- PostgreSQL TEXT → MySQL LONGTEXT
-- PostgreSQL NUMERIC → MySQL DECIMAL
Migración de datos
# Usar pg2mysql para conversión de dump
# https://github.com/phpPgAdmin/phppgadmin/tree/master/classes/database/pg2mysql
python pg2mysql.py -f esquema_postgres.sql -o esquema_mysql.sql
# Importar a MySQL
mysql -u usuario -p tu_base_datos < esquema_mysql.sql
mysql -u usuario -p tu_base_datos < datos_postgres_convertido.sql
Paso 5: Migración desde/hacia SQL Server
Desde SQL Server a PostgreSQL
# Usar sqlserver2pgsql
# https://github.com/dalibo/sqlserver2pgsql
# Generar script de conversión
python sqlserver2pgsql.py -f esquema_sqlserver.sql -o esquema_postgres.sql
# Migrar datos con bcp (SQL Server) y psql (PostgreSQL)
bcp "SELECT * FROM tabla" queryout datos.dat -n -S servidor -U usuario -P contraseña
Desde SQL Server a MySQL
# Usar MySQL Workbench Migration Wizard
# O usar bcp para exportar e importar con LOAD DATA
# Exportar desde SQL Server
bcp "SELECT * FROM tabla" queryout datos.csv -c -t, -S servidor -U usuario -P contraseña
# Importar a MySQL
mysql -e "LOAD DATA INFILE 'datos.csv' INTO TABLE tabla FIELDS TERMINATED BY ','"
Paso 6: Migración desde Oracle
Desde Oracle a PostgreSQL
# Usar ora2pg
# https://github.com/darold/ora2pg
# Configurar conexión Oracle
echo "ORACLE_DSN dbi:Oracle:host=oracle_host;sid=DB_SID" > /etc/ora2pg.conf
echo "ORACLE_USER usuario" >> /etc/ora2pg.conf
echo "ORACLE_PWD contraseña" >> /etc/ora2pg.conf
# Generar script de migración
ora2pg -o esquema_postgres.sql -c /etc/ora2pg.conf
Desde Oracle a MySQL
# Usar MySQL Workbench Migration Wizard
# O usar SQL Developer para exportar
# Exportar datos como CSV desde Oracle
sqlplus usuario/contraseña @export_csv.sql
# Importar a MySQL
mysql -e "LOAD DATA INFILE 'datos.csv' INTO TABLE tabla"
Paso 7: Migración con herramientas ETL
Usando Pentaho Data Integration
# Crear transformación con:
# - Input step para la base origen
# - Transform steps para conversión de datos
# - Output step para la base destino
# Ejecutar desde línea de comandos
pan.sh -file=migracion.ktr
Usando Talend Open Studio
# Diseñar job de migración con componentes:
# - tDBInput para conexión origen
# - tMap para transformaciones
# - tDBOutput para conexión destino
# Ejecutar migración
./TalendJob/migracion.sh
Paso 8: Migración de funciones y procedimientos
Conversión de funciones
-- Ejemplo: Función de MySQL a PostgreSQL
-- MySQL
CREATE FUNCTION calcular_impuesto(monto DECIMAL) RETURNS DECIMAL
BEGIN
RETURN monto * 0.16;
END
-- PostgreSQL
CREATE OR REPLACE FUNCTION calcular_impuesto(monto DECIMAL)
RETURNS DECIMAL AS $$
BEGIN
RETURN monto * 0.16;
END;
$$ LANGUAGE plpgsql;
Conversión de triggers
-- MySQL a PostgreSQL
-- MySQL
CREATE TRIGGER actualizar_auditoria
BEFORE UPDATE ON tabla
FOR EACH ROW
BEGIN
INSERT INTO auditoria VALUES (OLD.id, NOW());
END
-- PostgreSQL
CREATE OR REPLACE FUNCTION actualizar_auditoria()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO auditoria VALUES (OLD.id, NOW());
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER actualizar_auditoria
BEFORE UPDATE ON tabla
FOR EACH ROW EXECUTE FUNCTION actualizar_auditoria();
Paso 9: Migración de permisos y roles
Extracción de permisos
-- MySQL
SELECT CONCAT('GRANT ', privilege_type, ' ON ', table_schema,
'.', table_name, ' TO ''', grantee, ''';')
FROM information_schema.user_privileges;
-- PostgreSQL
SELECT grantee, privilege_type, table_name
FROM information_schema.role_table_grants;
Conversión de roles
# Script para convertir usuarios MySQL a PostgreSQL
mysql -u usuario -p -e "SELECT CONCAT('CREATE ROLE ', User, ' WITH LOGIN;') FROM mysql.user" > roles_postgres.sql
Paso 10: Validación y pruebas post-migración
Validación de datos
-- Comparar conteos
-- Sistema origen
SELECT COUNT(*) FROM tabla;
-- Sistema destino
SELECT COUNT(*) FROM tabla;
-- Comparar checksums
-- MySQL
SELECT COUNT(*), MD5(GROUP_CONCAT(*)) FROM tabla;
-- PostgreSQL
SELECT COUNT(*), MD5(STRING_AGG(*::text, '')) FROM tabla;
Pruebas de rendimiento
# Ejecutar pruebas comparativas
# Sistema origen
time mysql -e "SELECT * FROM tabla WHERE condicion"
# Sistema destino
time psql -c "SELECT * FROM tabla WHERE condicion"
Paso 11: Estrategias para grandes volúmenes
Migración en fases
# Migrar tablas por lotes
#!/bin/bash
TABLAS=("tabla1" "tabla2" "tabla3")
for tabla in "${TABLAS[@]}"; do
echo "Migrando $tabla..."
# Comandos de migración para cada tabla
done
Migración con replicación
-- Configurar replicación bidireccional temporal
-- Durante la migración para minimizar downtime
-- MySQL a PostgreSQL usando pg_chameleon
# https://github.com/the4thdoctor/pg_chameleon
pg_chameleon set_configuration --config default --source mysql --target pgsql
pg_chameleon start_replication --config default
Paso 12: Automatización de la migración
Script de migración automatizado
#!/bin/bash
# migracion_automatizada.sh
# Variables de configuración
DB_ORIGEN="mysql://usuario:contraseña@localhost/origen"
DB_DESTINO="postgresql://usuario:contraseña@localhost/destino"
LOG_FILE="migracion.log"
# Función de logging
log() {
echo "$(date): $1" | tee -a $LOG_FILE
}
# Paso 1: Exportar esquema
log "Exportando esquema..."
mysqldump --no-data -u usuario -p contraseña origen > esquema.sql
# Paso 2: Convertir esquema
log "Convertiendo esquema..."
python convert_esquema.py esquema.sql esquema_convertido.sql
# Paso 3: Crear esquema en destino
log "Creando esquema en destino..."
psql -d destino -f esquema_convertido.sql
# Paso 4: Migrar datos
log "Migrando datos..."
pgloader $DB_ORIGEN $DB_DESTINO
# Paso 5: Validar migración
log "Validando migración..."
python validar_migracion.py
log "Migración completada!"
Pipeline CI/CD para migración
# .gitlab-ci.yml o Jenkinsfile
stages:
- test
- migrate
- validate
migrate_db:
stage: migrate
script:
- apt-get install -y pgloader
- pgloader $MYSQL_DSN $POSTGRES_DSN
only:
- main
validate_migration:
stage: validate
script:
- python validate_migration.py
Paso 13: Troubleshooting común
Problemas de codificación
# Verificar codificación de datos
# MySQL
SHOW VARIABLES LIKE 'character_set%';
# PostgreSQL
SHOW SERVER_ENCODING;
# Solución: especificar codificación durante exportación
mysqldump --default-character-set=utf8 -u usuario -p base_datos
Problemas con tipos de datos
-- Solucionar diferencias en tipos de datos
-- Ejemplo: MySQL TIMESTAMP vs PostgreSQL TIMESTAMPTZ
-- Durante migración, convertir explícitamente
SELECT
CONVERT_TZ(timestamp_field, @@session.time_zone, '+00:00')
AS timestamp_utc
FROM tabla;
Paso 14: Post-migración
Optimización del nuevo sistema
-- PostgreSQL después de migración desde MySQL
VACUUM ANALYZE; -- Actualizar estadísticas
REINDEX DATABASE base_datos; -- Reconstruir índices
-- MySQL después de migración
ANALYZE TABLE tabla; -- Actualizar estadísticas
OPTIMIZE TABLE tabla; -- Optimizar almacenamiento
Monitoreo post-migración
# Monitorear rendimiento después de migración
# PostgreSQL
pg_stat_statements -- Consultas frecuentes
pg_stat_activity -- Actividad actual
# MySQL
SHOW PROCESSLIST; -- Procesos activos
SHOW STATUS; -- Estadísticas globales
Paso 15: Herramientas recomendadas
Herramientas open source
- pgloader: Migración a PostgreSQL
- mysql2pgsql: MySQL a PostgreSQL
- ora2pg: Oracle a PostgreSQL
- SQL Server Migration Assistant: Para migraciones desde SQL Server
Herramientas comerciales
- AWS Database Migration Service: Migración a la nube
- Azure Database Migration Service: Migración a Azure
- Ispirer MnMTK: Herramienta completa de migración
Paso 16: Mejores prácticas
- Planificar exhaustivamente: Documentar todo el proceso
- Realizar migración de prueba: En entorno staging primero
- Backup completo: Antes de comenzar la migración
- Comunicar downtime: Coordinar con usuarios afectados
- Validar exhaustivamente: Comprobar integridad de datos
- Monitorear post-migración: Detectar problemas temprano
Paso 17: Recursos y herramientas
Recursos para aprender más:
- Documentación oficial: Guías de migración de cada RDBMS
- Foros de comunidades: Stack Overflow, Reddit communities
- Caso de estudio: Experiencias de migración de otras empresas
- Herramientas de evaluación: Para calcular esfuerzo de migración
Conclusión
¡Felicidades! Ahora tienes el conocimiento necesario para planificar y ejecutar migraciones entre diferentes RDBMS. Practica estos conceptos en entornos de desarrollo antes de aplicarlos en producción.
Para más tutoriales sobre bases de datos y migraciones, visita nuestra sección de tutoriales.
¡Con estos conocimientos ya puedes migrar entre sistemas de bases de datos de manera efectiva!
💡 Tip Importante
📝 Mejores Prácticas para Migración de Bases de Datos
Para migrar efectivamente entre RDBMS, considera estos consejos esenciales:
Planifica detalladamente: Crea un plan de migración completo con timeline y riesgos identificados.
Prueba en entorno staging: Nunca migres directamente a producción sin probar primero.
Haz backups completos: Asegúrate de tener backups verificables antes de comenzar.
Valida los datos: Implementa validaciones automáticas para asegurar integridad de datos.
Considera el downtime: Planifica ventanas de mantenimiento apropiadas para tu negocio.
Documenta todo: Mantén registro detallado de cada paso y decisión tomada.
Ten un plan de rollback: Prepara estrategias para revertir la migración si algo sale mal.
Entrena al equipo: Asegúrate de que todos entiendan el proceso y sus responsabilidades.
📚 Documentación: Revisa las guías oficiales de migración de cada RDBMS y herramientas como AWS DMS para migraciones en la nube
¡Estos consejos te ayudarán a ejecutar migraciones exitosas y minimizar riesgos!
No hay comentarios aún
Sé el primero en comentar este tutorial.