Migraciones que no romperán producción
Una migración funciona perfectamente en tu máquina. La despliegas un viernes a las 6 PM porque parece pequeña. Entonces el despliegue se congela. O peor, una tabla con 8 millones de filas se bloquea durante 40 segundos y tu sitio se cae.
Las migraciones se comportan de manera diferente en producción. Las bases de datos locales están vacías y son rápidas. Las bases de datos de producción tienen datos reales y usuarios activos.
Sigue estas reglas para evitar desastres en producción.
Escribe siempre un método
downque funcione Cada migración necesita una funciónupy unadown. La funcióndowndebe revertir exactamente la funciónup. Si no puedes escribir un rollback, tu migración es demasiado compleja. Pruébala en tu máquina conmigrateseguido demigrate:rollbackantes de subirla.Nunca edites migraciones antiguas Es posible que quieras corregir el tamaño de una columna en un archivo de migración antiguo. No lo hagas. Laravel no volverá a ejecutar ese archivo en el servidor. En su lugar, crea una nueva migración para cambiar la estructura. Una migración es un historial de cambios. Añades capítulos nuevos en lugar de reescribir los antiguos.
Usa valores
nullableo por defecto Añadir una columnaNOT NULLa una tabla con datos existentes causa errores. La base de datos no sabe qué poner en las filas antiguas.
Usa estos enfoques en su lugar:
• Haz que la nueva columna sea nullable.
• Establece un valor por defecto.
• Si la columna debe ser obligatoria, hazlo en tres pasos: créala como nullable, rellena los datos y luego cámbiala a NOT NULL.
La pérdida de datos es permanente El comando
dropColumnelimina los datos para siempre. Un rollback puede recrear una columna, pero los datos en su interior se han perdido. Antes de eliminar una columna, verifica tus copias de seguridad. Una forma más segura es dejar de usar la columna en tu código primero, esperar unas semanas y luego eliminarla de la base de datos.Separa los cambios de esquema de las actualizaciones de datos Ejecutar
User::all()dentro de una migración puede cargar millones de filas en la memoria y hacer que tu despliegue falle. Si debes actualizar datos durante una migración, usachunkByIdpara procesar los registros en pequeños lotes.Usa el flag
--forceen los pipelines Los pipelines de despliegue automatizados se quedarán colgados si Laravel pide confirmación. Usa este comando en tus scripts de despliegue:php artisan migrate --forceCuidado con los bloqueos de tablas Cambiar una columna o añadir un índice en una tabla masiva bloquea esa tabla. Esto provoca tiempo de inactividad. Para tablas muy grandes, busca herramientas de cambio de esquema en línea (online schema change) o realiza los cambios durante las horas de poco tráfico.
Lista de verificación antes de subir cambios:
• ¿Funciona el método down?
• ¿He probado el rollback localmente?
• ¿Estoy creando una nueva migración en lugar de editar una antigua?
• ¿Es la nueva columna nullable o tiene un valor por defecto?
• ¿Tengo una copia de seguridad antes de eliminar columnas?
Fuente: https://dev.to/denisgusto1/migrations-que-nao-quebram-em-producao-o-guia-que-ninguem-te-deu-363o
