¿Está bien actualizar una base de datos de producción con migraciones EF?


De acuerdo con esta entrada de blog la mayoría de las empresas que utilizan migraciones EF supuestamente no están actualizando el esquema de bases de datos de bases de datos de producción con migraciones EF. En su lugar, el autor de la publicación del blog recomienda usar scripts de actualización de esquema como parte del proceso de implementación.

He usado scripts de actualización de esquema durante unos años y mientras funcionan, estaba planeando usar migraciones EF en el futuro por las siguientes razones:

  • Despliegue más rápido, menos tiempo de inactividad
  • Un procedimiento de despliegue más sencillo
  • Migración mucho más fácil de los datos existentes de lo que sería posible con T-SQL
  • Una sintaxis más comprensible de los cambios que esperan ser aplicados (clase DbMigration con sintaxis C# limpia vs.torpe script de migración T-SQL en un entorno tradicional).
  • Hay una ruta de degradación fácil y rápida al esquema de base de datos antiguo si la implementación de la nueva versión del software falla

Una razón por la que puedo pensar en eso prohibiría el uso de EF para migrar una base de datos de producción sería si el esquema de la base de datos solo fue alterado por los DBA en lugar de los Desarrolladores. Sin embargo, soy tanto DBA como Desarrollador, por lo que esto no importa en mi caso.

Entonces, ¿cuáles son los riesgos de actualizar una base de datos de producción utilizando EF?

Editar: Me gustaría añadir que, como solomon8718 ya sugirió, siempre estoy tirando una copia nueva de la base de datos de producción a mi servidor de ensayo y probar las migraciones EF que se aplicarán en el servidor provisional antes de aplicarlos a un servidor de producción. IMO esto es esencial para cualquier actualización de esquema de un sistema de producción, ya sea que esté usando migraciones EF o no.

Author: George Stocker, 2015-04-20

4 answers

Bueno, voy a tratar de responder de todos modos. Yo diría que no, no hay razón para no usar Migraciones de Código Primero en producción. Después de todo, ¿cuál es el punto de este sistema fácil de usar si no puedes llevarlo hasta el final?

Los mayores problemas que veo con él son todos los problemas que puedes tener con cualquier sistema, que ya has notado. Siempre y cuando todo el equipo (DBA incluido si corresponde) esté a bordo con él, creo que permitir que EF administre el esquema a través de migraciones es menos complejo, y por lo tanto, es menos propenso a errores que la administración tradicional basada en scripts. Todavía tomaría una copia de seguridad antes de realizar una migración en un sistema de producción, pero luego lo haría de todos modos.

Tampoco hay nada que diga que un DBA no pueda realizar una migración desde Visual Studio. El acceso todavía podría estar bloqueado con privilegios a nivel de base de datos, y él/ella podría revisar la migración (en un útil formato de exportación SQL usando -Script, si lo desea) antes de realizar la operación real. Entonces todavía tienen el control, pero puedes usar migraciones de código primero. ¡Demonios, incluso podrían terminar gustándoles!

Actualización: desde que se trajeron SPROCs y TVFs, también los manejamos en las migraciones, aunque en realidad se hacen con sentencias SQL directas usando una llamada DbMigration.Sql() en el Up(), y el reverso de ellos en el Down() (También puede usar CreateStoredProcedure y DropStoredProcedure para SPROCs simples, pero creo que todavía tiene que definir el cuerpo en sí en SQL). Supongo que se podría decir que es una advertencia; hay todavía no es una forma para que una base de datos completa y completa se escriba puramente en C#. Sin embargo, puede usar migraciones que incluyan scripts SQL para administrar todo el esquema. Un beneficio que hemos encontrado de este proceso es que puede usar el archivo de configuración de C# para los nombres de objetos de esquema (diferentes nombres de servidor para producción vs dev, por ejemplo) con un simple String.Format, combinado con la transformación XML para los propios archivos de configuración.

 28
Author: DrewJordan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-21 13:23:07

Sí hay buenas razones no para usar un sistema automatizado como Migraciones de Código Primero para hacer cambios en la base de datos producción. Pero como siempre hay excepciones a las reglas.

  1. Una de las razones que se ha mencionado serían los permisos de acceso, que estarían directamente relacionados con las reglas de gestión de cambios y las políticas de seguridad de su organización.

  2. Otra razón sería su nivel de confianza en la herramienta de migraciones en sí. ¿Estamos seguros ¿la herramienta no tiene un error? ¿Qué sucede si la herramienta falla a mitad de camino? ¿Está seguro de que tiene copias de seguridad actualizadas y un proceso para revertir si es necesario?

  3. Los scripts de cambio pueden ejecutar scripts inesperados o ineficientes. He experimentado casos en los que el sql generado copió los datos en una tabla temporal, soltó la tabla original y luego recreó la tabla original para cosas como agregar una nueva columna si accidentalmente (o a propósito) cambia el orden en el que aparece la columna o cuando cambia el nombre de la tabla. Si millones de registros están involucrados, esto podría causar graves problemas de rendimiento.

Mi recomendación:

Suponiendo que tiene una base de datos provisional que refleja su esquema de producción, utilice la herramienta Migraciones para generar sus scripts de cambio en ese sistema. Por lo general, restauramos nuestra base de datos stage a partir de una copia de producción nueva antes de ejecutarla. A continuación, examinamos los scripts de cambio manualmente para comprobar si hay problemas. Después de eso ejecute los scripts en nuestra base de datos stage para asegurarse de que se ejecuta correctamente y que todos los cambios esperados tuvieron lugar. Ahora estamos seguros de que los scripts son seguros para ejecutarse en producción y realizar los cambios esperados. This process would address all three issues I listed above.

 28
Author: MplsAmigo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-20 19:21:05

Otra advertencia que encontré: Si tiene varios sitios web que usan el mismo contexto de datos, debe asegurarse de que todos ellos se actualicen al mismo tiempo. De lo contrario, podría haber una constante actualización de la base de datos / lucha de degradación entre los sitios web. Aparte de eso, funcionó bien para mí.

EDITAR: Mi propia perspectiva un año después de comenzar a usar Migraciones EF en producción:

EF Migrations es en realidad bastante genial, incluso para uso de producción, siempre que

  1. Pruebe las migraciones en un sistema de estadificación. Pruebo todas las migraciones migrando hacia abajo y hacia arriba de nuevo en mi servidor CI antes de ejecutar las pruebas de integración.
  2. No desencadene migraciones automáticamente, sino con un archivo por lotes que es lanzado por un administrador. Esto es esencialmente lo mismo que ejecutar el sql para una migración manual en SSMS.
 6
Author: Adrian Grigore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-03 10:11:46

Lo uso en producción para un par de proyectos. Una vez que te acostumbras, creo que está bien.

Durante el desarrollo, puede mantener activadas las migraciones automáticas, pero al final puede conectarse a la base de datos en vivo directamente desde la consola del administrador de paquetes y generar una migración. Le dará una migración para todos los cambios.

Pero siempre siempre use la opción -script con update-database y ejecute el SQL usted mismo.

También aconsejaría no usar la opción actualizar base de datos de web deploy. De esa manera no hay manera de saber cuánto de la migración ya se ha disparado por error. Me he metido en problemas con eso un par de veces. Así que lo mejor es obtener el SQL y dispararlo manualmente.

 1
Author: Yashvit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-11 11:36:26