
Database Strategy
Database Strategy: blog técnico sobre Oracle, PostgreSQL, MySQL, data warehouse y project management. Artículos prácticos de 30 años de consultoría IT.
La diferencia entre un sistema que funciona
y uno que realmente impulsa el negocio no es suerte.
Es comprensión profunda de los planes de ejecución.
Es control de privilegios y seguridad de los datos.
Es modelado de datos alineado con los objetivos empresariales.
Es rendimiento que se mantiene cuando la carga aumenta.
Las bases de datos son el núcleo operativo del ecosistema digital de cualquier empresa.
Sostienen procesos críticos, habilitan decisiones basadas en datos y determinan la velocidad y eficiencia operativa.
Dentro del Motor es el espacio donde analizo lo que ocurre bajo el capó de PostgreSQL, Oracle y MySQL: performance tuning, seguridad, arquitectura y decisiones técnicas aplicables en entornos reales.
Porque en el mundo data-driven actual, las bases de datos no son simples componentes de software.
Son activos estratégicos que influyen en la competitividad, la fiabilidad y el crecimiento sostenible.
Últimos artículos


El informe del lunes por la mañana: lag de réplica MySQL y por qué Seconds_Behind_Master miente
Cuatro horas de lag en un sistema logístico: cómo diagnosticamos el problema, por qué Seconds_Behind_Master engaña y qué cambios lo resolvieron.

El ticket decía 'actualiza MySQL y apaga el servicio'
Workflow real de patching MySQL 8.0.34→8.0.45 en RHEL 8: vistas inválidas, GTID, verificación de réplica y upgrade RPM. Lo que el ticket de cuatro líneas no contaba.

La frustración de Alberto: Oracle Text y la búsqueda full-text en un archivo legal de treinta años
Cómo tres tipos de índice Oracle Text transformaron búsquedas de 90 segundos en menos de 700 ms en un archivo legal con décadas de documentos.

Tres triggers, un job nocturno y 1.247 pólizas huérfanas: ASSERTION en Oracle 26ai
Oracle 26ai implementa CREATE ASSERTION, la restricción cross-tabla que SQL-92 prometía desde hace décadas. Sintaxis, comparación con triggers y casos reales en seguros.

La llamada del martes por la mañana: swap al 100% en InnoDB Cluster y cómo join_buffer_size multiplica el problema
Diagnóstico en producción de un cluster MySQL InnoDB con swap saturado: cómo join_buffer_size a 2 GB por thread colapsa un nodo con 157 GB de RAM.

La pausa del almuerzo que retrasó el go-live: Data Governance en el DWH
Qué falta cuando un DWH está 'técnicamente listo': data ownership, calidad continua, TDE en Oracle 19c y Data Catalog. Caso real en sector asegurador.

ORA-00205 a las tres de la madrugada: entender los archivos críticos de Oracle antes de necesitarlos
Diagnóstico guiado de ORA-00205 en plena emergencia nocturna: fase MOUNT, control file, SPFILE, redo log. Método práctico para DBA Oracle de guardia.

Replicación lógica en PostgreSQL: las preguntas de un colega que aclaran el tema
Replicación lógica PostgreSQL explicada con las preguntas de un colega: migración cross-version, CDC hacia data warehouse, configuración paso a paso.

De rivales a co-autores: cómo Booch, Rumbaugh y Jacobson inventaron UML (y lo que queda hoy)
La historia de los Three Amigos de UML y RUP: cómo Booch, Rumbaugh y Jacobson, de rivales, unificaron el object-oriented modeling. Y lo que queda hoy.

Oracle 19c, 21c, 23ai, 26ai: la reescritura silenciosa de los dominios de valores
Siete años de Oracle a través de las enumeraciones: del CHECK del 19c a los SQL Domains del 23ai, hasta las Assertions del 26ai. Migración aseguradora.

Enumeraciones en Oracle: veinte años de workaround, y el camino que se abrió con la 23ai
Oracle nunca tuvo ENUM nativo. CHECK constraints, lookup tables y SQL Domains 23ai: tres caminos, un caso real banking, y qué llegará con la 26ai.

ENUM en PostgreSQL: cuando la elección compensa, y cuando se vuelve en tu contra
PostgreSQL ENUM vs CHECK vs tabla lookup: ALTER TYPE ADD VALUE no cuesta nada, eliminar un valor cuesta una migración. Tres caminos, un caso telco real.

ENUM en MySQL: cuando te simplifica la vida y cuando te complica los días
MySQL ENUM vs CHECK constraint vs tabla de lookup: tres vías para modelar una enumeración. Ventajas, límites y caso real de seguimiento de envíos.

Cuando un índice hace más mal que bien: limpiar PostgreSQL del despilfarro
PostgreSQL: encontrar y eliminar índices no usados con pg_stat_user_indexes. Caso real: una tabla con 15 índices, 8 nunca usados.

5 reglas que he visto funcionar en los equipos de proyecto que aguantan
Gestión de proyectos: 5 reglas observadas en equipos que aguantan bajo presión. Psychological safety, bus factor, outcome vs output, knowledge transfer.

Tres data marts, tres verdades sobre las ventas: el bus matrix como terreno común
Bus matrix de Kimball para alinear data marts aislados: conformed dimensions, procesos de negocio y ventas comparables. Caso real grupo asegurador.

Antes de actualizar MySQL: las cifras que el cliente te pide y cómo encontrarlas de verdad
MySQL 8.0 pre-upgrade assessment: medir tamaños, crecimiento, tiempos de backup y restore con information_schema. Cifras reales para planificar.

Oracle de on-premises a cloud: estrategia, planificación y cutover
Migración Oracle 19c on-premises a OCI: 2 TB con RAC y Data Guard. Licensing BYOL, Data Pump, cutover nocturno — crónica real.

pg_stat_statements: lo primero que instalar en cualquier PostgreSQL
PostgreSQL pg_stat_statements: la extensión de diagnóstico de queries a instalar primero. Encontrar las tres queries que consumen el 80%.

mysqldump vs mysqlpump vs mydumper: el backup que no te deja dormir
Backup MySQL: mysqldump vs mydumper vs mysqlpump en base de datos de 60 GB. Tiempos reales de dump y restore, paralelismo y decisión arquitectónica.

Partitioning en el DWH: cuando 3 años de datos pesan demasiado
Range partitioning en fact table de 800M filas: de queries trimestrales de 12 minutos a 40 segundos. Implementación mensual, exchange e índices locales.

Binary log en MySQL: qué son, cómo gestionarlos y cuándo puedes borrarlos
MySQL binary log: gestión, retención y point-in-time recovery. Caso real de servidor con disco al 95% y 180 GB de binlog en seis meses.

VACUUM y autovacuum: por qué PostgreSQL necesita que alguien limpie
PostgreSQL VACUUM y autovacuum: diagnóstico de bloat en base de datos de 200 GB, lectura de pg_stat_user_tables y tuning sin desactivar nada.

AI Manager y Project Management: cuando la inteligencia artificial entra en los proyectos
AI Manager: el rol que gobierna el impacto de la inteligencia artificial sobre arquitecturas, procesos y personas. Reflexiones desde 30 años en IT.

Pagos a 60-90-120 días: la normalidad italiana que no existe en Europa
Pagos a 60-90-120 días en consultoría IT italiana: comparación con las reglas europeas. DSO, directiva 2011/7/UE y estrategias para freelancers IT.

Bici vs Coche en Roma: la mañana que me abrió los ojos
Pendolarismo en Roma: Brompton eléctrica vs coche. 18 minutos vs 50, 35€ de aparcamiento ahorrados. La elección de movilidad sostenible, datos reales.

Smart working en consultoría IT: los números que nadie quiere mirar
Smart working en consultoría IT: análisis económico y estratégico del trabajo remoto. Números reales, KPIs, presenteísmo y productividad vs oficina.

Oracle en Linux: los parámetros del kernel que nadie configura
Oracle 19c en Linux: tuning del kernel para rendimiento real. Huge Pages, THP, swappiness, I/O scheduler, ulimit — números antes/después.

Galera Cluster con 3 nodos: cómo resolví un incidente de disponibilidad en MySQL
MySQL Galera Cluster de 3 nodos para alta disponibilidad: replicación síncrona, quórum, SST/IST. Configuración contra el single point of failure.

Roles y usuarios en PostgreSQL: por qué todo es (solo) un ROLE
PostgreSQL ROLE: usuarios y roles son el mismo objeto. Modelo mental, GRANT, NOINHERIT y construir un usuario read-only realmente mantenible.

AWR, ASH y los 10 minutos que salvaron un go-live
Tuning Oracle 19c con AWR y ASH: encontrar un full table scan oculto en un procedimiento almacenado en 10 minutos, antes de un go-live.

Cuando el caos se convierte en método: AI y GitHub para gestionar un proyecto que nadie quería tocar
Gestión de proyectos con AI y GitHub: transformar un proyecto caótico en workflow medible con issue tracking, code review e inteligencia artificial.

Usuarios, roles y privilegios en Oracle: por qué GRANT ALL nunca es la respuesta
Seguridad Oracle: rediseño del modelo GRANT con roles personalizados y Unified Audit, aplicando el mínimo privilegio. Caso real con SQL listo.
Standup meeting: por qué solo funcionan si duran 15 minutos
Standup meeting Scrum: por qué solo los 15 minutos los hacen funcionar. Timeboxing, parking lot y reglas prácticas del daily meeting que aguantan.

Jerarquías desbalanceadas: cuando el cliente no tiene padre y el grupo no tiene abuelo
Ragged hierarchy en data warehouse: balanceo de jerarquías desbalanceadas con la técnica de self-parenting. Drill-down correcto en clientes y grupos.

Usuarios MySQL: por qué 'mario' y 'mario'@'localhost' no son la misma persona
MySQL usuarios y hosts: 'mario' y 'mario'@'localhost' son entidades distintas. Modelo de autenticación MySQL/MariaDB, errores comunes y GRANTs.

La técnica del Sí-Y: cómo evité una discusión que estaba a punto de estallar
La técnica Yes-And del teatro de improvisación aplicada a la gestión de conflictos en equipos IT. Caso real de una reunión que iba a estallar.

Cuando un LIKE '%valor%' ralentiza todo: un caso real de optimización PostgreSQL
Optimización PostgreSQL: LIKE '%valor%' genera full scan. Uso de pg_trgm e índice GIN para convertir una búsqueda wildcard en lookup rápido.

4 millones de euros, dos multinacionales, cero software: historia real de un fracaso anunciado
Caso real de gestión de proyectos: cliente asegurador gasta 4 millones en consultoría IT y obtiene cero software funcionando. Lecciones vendor lock-in.

Oracle Partitioning: cuando 2 mil millones de filas ya no caben en una query
Oracle Partitioning en tabla de 2 mil millones de filas: range, interval, partition pruning, índices locales. De horas a segundos.

De single instance a Data Guard: el día en que el CEO entendió el DR
Oracle Data Guard 19c: migración desde single instance tras una caída de 6 horas. Arquitectura DR, primary/standby, switchover automático.

SCD Tipo 2: la historia que el negocio no sabía que necesitaba
SCD Tipo 2 en data warehouse: historizar dimensiones con claves subrogadas y fechas de validez. Caso real: dimensión clientes que evoluciona en el tiempo.

MySQL multi-instancia: un ticket, un CSV y el muro de secure-file-priv
MySQL multi-instancia en Linux: exportar un CSV con INTO OUTFILE bloqueado por secure-file-priv. Conexión por socket Unix y workaround desde shell.

EXPLAIN ANALYZE no basta: como leer realmente un plan de ejecucion PostgreSQL
PostgreSQL EXPLAIN ANALYZE: leer un plan de ejecución, detectar nested loop costosos y ANALYZE sobre estadísticas viejas. Caso real con 2M filas.

Granularidad equivocada: cuando la fact table no responde las preguntas correctas
Data warehouse: la granularidad de la fact table determina qué preguntas puedes responder. Errores frecuentes y su impacto en el modelo dimensional.

Disco lleno en un cluster MySQL: binary logs, Group Replication y una migración que no admite errores
MySQL Group Replication de 3 nodos: migración de binary logs a un volumen dedicado sin perder el quórum. Caso real con filesystem al 92%.