database - segundo - Lista de verificación para actualizaciones de esquema de base de datos
optimizar consultas lentas mysql (5)
Tener que actualizar un esquema de base de datos hace que la instalación de un nuevo lanzamiento de software sea mucho más complicada. ¿Cuáles son las mejores prácticas para hacer esto?
Estoy buscando una lista de verificación o una línea de tiempo de elementos de acción, como
- 8:30 cerrar aplicaciones
- 8:45 modificar el esquema
- 9:15 instale nuevas aplicaciones
- 9:30 reiniciar db
etc., que muestra cómo minimizar el riesgo y el tiempo de inactividad. Problemas tales como
- retrocediendo de la actualización si las cosas van mal
- minimizar el impacto en las aplicaciones existentes
- actualizaciones "calientes" mientras se ejecuta la base de datos
- promoviendo desde dev a prueba a servidores de producción
son especialmente de interés.
Dos notas rápidas:
No hace falta decir ... Así que lo diré dos veces.
Verifique que tiene una copia de seguridad válida.
Verifique que tiene una copia de seguridad válida.@mk. Echa un vistazo a la publicación de blog de Jeff sobre el control de la versión de la base de datos (si aún no lo has hecho)
Este es un tema del que estaba hablando en el trabajo. Principalmente, el problema es que, a menos que tu marco de trabajo maneje las migraciones de la base de datos, por ejemplo, los rieles y sus scripts de migración, entonces depende de ti.
La forma actual en que lo hacemos tiene defectos aparentes, y estoy abierto a otras sugerencias.
- Disponer de un volcado de esquema con datos estáticos que es necesario mantener actualizado y en el control de la versión.
- Cada vez que realiza una acción de cambio de esquema, ALTER, CREATE, etc. lo vuelven a un archivo y lo lanzan en control de versión.
- Asegúrese de actualizar el volcado sql db original.
- Al hacer push for live, asegúrese de que usted o su secuencia de comandos aplique los archivos sql a la base de datos.
- Limpie los viejos archivos sql que están en control de versiones a medida que envejecen.
Esto de ninguna manera es óptimo y en realidad no pretende ser una copia de seguridad de "db". Es simplemente hacer esfuerzos para vivir con facilidad y mantener a los desarrolladores en la misma página. Probablemente haya algo genial que podría configurar con capistrano en cuanto a la automatización de la aplicación de los archivos sql a la base de datos.
El control de la versión específica de Db sería increíble. Probablemente haya algo que haga eso y, si no existe, probablemente debería haberlo.
Supongo que ha considerado las lecturas de Scott Ambler. http://www.agiledata.org/essays/databaseRefactoring.html
Tengo mucha experiencia con esto. Mi aplicación es altamente iterativa y los cambios de esquema ocurren con frecuencia. Hago un lanzamiento de producción aproximadamente cada 2 a 3 semanas, con 50-100 elementos borrados de mi lista de FogBugz para cada uno. Cada lanzamiento que hemos realizado en los últimos años ha requerido cambios de esquema para admitir nuevas características.
La clave para esto es practicar los cambios varias veces en un entorno de prueba antes de hacerlos realmente en los servidores en vivo.
Guardo un archivo de lista de comprobación de implementación que se copia de una plantilla y luego se edita en gran medida para cada versión con cualquier cosa que sea fuera de lo común.
Tengo dos scripts que ejecuto en la base de datos, uno para los cambios de esquema, uno para la programabilidad (procedimientos, vistas, etc.). El script de cambios está codificado a mano, y el que tiene los procesos está escrito a través de Powershell. El script de cambio se ejecuta cuando todo está desactivado (hay que elegir un momento que molesta a la menor cantidad de usuarios para esto), y se ejecuta comando por comando, manualmente, por si acaso algo sale raro. El problema más común con el que me he encontrado es agregar una restricción única que falla debido a las filas duplicadas.
Cuando me preparo para un ciclo de prueba de integración, reviso mi lista de comprobación en un servidor de prueba, como si ese servidor estuviera en producción. Luego, además de eso, obtengo una copia real de la base de datos de producción (este es un buen momento para intercambiar las copias de seguridad externas) y ejecuto las secuencias de comandos en una versión local restaurada (lo cual también es bueno porque demuestra mi la última copia de seguridad es sólida). Estoy matando muchos pájaros de un tiro aquí.
Así que eso es 4 bases de datos en total:
- Dev: todos los cambios deben hacerse en el script de cambio, nunca con el estudio.
- Prueba: las pruebas de integración ocurren aquí
- Copia de producción: práctica de implementación de último minuto
- Producción
Realmente, realmente necesitas hacerlo bien cuando lo haces en producción. La anulación de cambios de esquema es difícil.
En cuanto a las revisiones, solo voy a realizar una revisión de los procedimientos, nunca del esquema, a menos que sea un cambio muy aislado y crucial para el negocio.
Y si el artículo de Scott Ambler te abre el apetito, puedo recomendar su libro con Pramod J Sadolage llamado ''Refactoring Databases'' - http://www.ambysoft.com/books/refactoringDatabases.html
También hay muchos consejos e información útil en el grupo Agile Database en Yahoo - http://tech.groups.yahoo.com/group/agileDatabases/