Qué son los archivos MDF y LDF en Microsoft SQL Server

SQL Server almacena cada base de datos en dos archivos físicos principales:

  • .MDF (Primary Data File): contiene los datos reales: tablas, índices, vistas, procedimientos almacenados, funciones, triggers, restricciones, metadatos del catálogo. Una BD tiene un solo .mdf.
  • .LDF (Log File): registro de transacciones (WAL - Write Ahead Logging). Guarda cada operación (INSERT/UPDATE/DELETE/BULK/DDL) para garantizar ACID (atomicidad, consistencia, aislamiento, durabilidad), permitir rollback, recovery, replicación, CDC, log shipping, Always On.

Archivos secundarios

  • .NDF (Secondary Data Files): opcionales, para distribuir datos en varios discos/volúmenes (filegroups). Una BD puede tener 0..N .ndf.

Ubicación por defecto

C:\Program Files\Microsoft SQL Server\MSSQLxx.INSTANCE\MSSQL\DATA\ (cambia en instalación o con ALTER DATABASE MODIFY FILE).

Modelos de recuperación y .LDF

ModeloComportamiento LDFUso típico
SimpleTrunca log en checkpoint (checkpoint = escritura páginas sucias a disco). No permite restore point-in-time.Dev, test, data warehouse recargable.
FullRegistra todo; requiere BACKUP LOG periódico para truncar. Permite restore a cualquier momento.Producción OLTP crítica.
Bulk-LoggedOperaciones masivas mínimamente logadas. Restore point-in-time con restricciones.Cargas masivas nocturnas.

Gestión práctica

  • Mover .mdf/.ldf: ALTER DATABASE ... MODIFY FILE (nueva ruta) → offline → mueve archivos → online. O Detach → mueve → Attach.
  • Reducir (Shrink) LDF hinchado: BACKUP LOG → DBCC SHRINKFILE (NOMBRE_LOG, tamaño_objetivo_MB). No shrinks rutinarios; fragmenta.
  • Autogrowth: configura crecimiento fijo (ej. 256/512 MB) no %, y MAXSIZE para no llenar disco.
  • Instant File Initialization (IFI): concede «Realizar tareas de mantenimiento de volumen» a la cuenta de servicio SQL → acelera crecimiento .mdf/.ndf (no .ldf).

Resumen

.MDF = datos. .LDF = bitácora transaccional (garantía ACID). Ambos son críticos; ponlos en discos rápidos (NVMe) y separados si posible. Monitoriza espacio libre y log_reuse_wait_desc.