¿Cómo versionas tu esquema de base de datos? [cerrado]

128

¿Cómo preparas tus deltas de SQL? ¿guarda manualmente cada SQL de cambio de esquema en una carpeta delta, o tiene algún tipo de proceso de diferenciación automatizado?

Estoy interesado en las convenciones para versionar el esquema de la base de datos junto con el código fuente. ¿Quizás un gancho previo a la confirmación que diferencie el esquema?

Además, qué opciones existen para diferenciar deltas aparte de DbDeploy ?

EDITAR: ver las respuestas, me gustaría aclarar que estoy familiarizado con el esquema estándar para ejecutar una migración de base de datos usando deltas. Mi pregunta es sobre la creación de los deltas, preferiblemente de forma automática.

Además, el control de versiones es para PHP y MySQL si hace la diferencia. (No hay soluciones de Ruby por favor).

Eran Galperin
fuente
Utilizo schemasync para generar un parche (y un script de reversión). Estos se agregan al repositorio SVN. No es perfecto pero funciona bien para mí. Además, implementar cambios de esquema es bastante fácil con schemasync
Jay Sidri el
Este enlace aparece vacío. ¿Sigue existiendo?
Jocull
Parece que se movió: github.com/mmatuson/SchemaSync
Jay Sidri

Respuestas:

61

Ver

¿Existe un sistema de control de versiones para los cambios en la estructura de la base de datos?

¿Cómo versiono mi base de datos MS SQL en SVN?

y el artículo de Jeff

Obtenga su base de datos bajo control de versiones

Siento tu dolor y desearía que hubiera una respuesta mejor. Esto podría estar más cerca de lo que estabas buscando.

Mecanismos para rastrear cambios en el esquema de la base de datos

En general, siento que no hay una solución adecuada y aceptada para esto, y me pongo en práctica en esta área.

harpo
fuente
Como se puede deducir de mi pregunta, soy consciente del concepto de deltas. Mi pregunta es sobre convenciones para crearlas, preferiblemente de forma automática.
Eran Galperin
Supongo que rodaré la mía entonces ...;)
Eran Galperin
¿Has probado DBDiff: github.com/DBDiff/DBDiff ? Es una buena opción para lo que está buscando @EranGalperin, ya que realiza migraciones automatizadas tanto para el esquema como para los datos en SQL. Divulgación Soy el desarrollador detrás de esto!
Jasdeep Khalsa
4

Si todavía está buscando opciones: eche un vistazo a neXtep designer. Es un entorno de desarrollo de base de datos GPL gratuito basado en los conceptos de control de versiones. En el entorno, siempre trabaja con entidades versionadas y puede centrarse en el desarrollo del modelo de datos. Una vez que se realiza una versión, el motor de generación de SQL conectado al sistema de control de versiones puede generar cualquier delta que necesite entre 2 versiones y le ofrecerá algún mecanismo de entrega si lo necesita.

Entre otras cosas, puede sincronizar y sincronizar inversamente su base de datos durante los desarrollos, crear diagramas de modelos de datos, consultar su base de datos utilizando clientes SQL integrados, etc.

Echa un vistazo a la wiki para más información: http://www.nextep-softwares.com/wiki

Actualmente es compatible con Oracle, MySql y PostgreSql y está en Java, por lo que el producto se ejecuta en Windows, Linux y Mac.

Christophe Fondacci
fuente
3

Me aseguro de que los cambios de esquema sean siempre aditivos. Por lo tanto, no elimino columnas y tablas, porque eso eliminaría los datos y no se puede revertir más tarde. De esta forma, el código que usa la base de datos puede revertirse sin perder datos o funcionalidad.

Tengo un script de migración que contiene declaraciones que crean tablas y columnas si aún no existen y las llena de datos.

El script de migración se ejecuta cada vez que se actualiza el código de producción y después de nuevas instalaciones.

Cuando me gustaría soltar algo, lo hago quitándolos del script de instalación de la base de datos y del script de migración para que estos elementos de esquema obsoletos se eliminen gradualmente en las nuevas instalaciones. Con la desventaja de que las nuevas instalaciones no pueden degradar a una versión anterior antes de la instalación.

Y, por supuesto, ejecuto DDL a través de estos scripts y nunca directamente en la base de datos para mantener las cosas sincronizadas.

Calmarius
fuente
2

No manejo deltas. Realizo cambios en una base de datos maestra y tengo una herramienta que crea un script de compilación basado en XML basado en la base de datos maestra.

Cuando llega el momento de actualizar una base de datos existente, tengo un programa que usa el script de compilación basado en XML para crear una nueva base de datos y las tablas desnudas. Luego copio los datos de la base de datos anterior usando INSERT INTO x SELECT FROM y luego aplico todos los índices, restricciones y disparadores.

Las tablas nuevas, las columnas nuevas, las columnas eliminadas se manejan automáticamente y con algunos pequeños trucos para ajustar la rutina de copia puedo manejar los cambios de nombre de columna, cambios de tipo de columna y otras refactorizaciones básicas.

No recomendaría esta solución en una base de datos con una gran cantidad de datos, pero actualizo regularmente una base de datos de más de 1 GB con 400 tablas.

Darrel Miller
fuente
Esto suena algo engorroso, especialmente cuando se trata de múltiples desarrolladores. Además, el proceso de construcción suena exigente, y me gustaría ser lo más simple posible.
Eran Galperin
Admito que me tomó un tiempo hacerlo bien, pero ahora no requiere casi ningún esfuerzo preparar una actualización y mucho menos realizarla. Además, una cosa que me gusta es que puedo hacer cambios de revisión provisionales y no tiene ningún impacto en el procedimiento de actualización. Cada actualización es un nuevo DB nuevo.
Darrel Miller
2

No mencionó qué RDBMS está utilizando, pero si se trata de MS SQL Server, SQL Compare de Red-Gate ha sido indispensable para nosotros al crear deltas entre scripts de creación de objetos.

jalbert
fuente
1
Es para Mysql, he actualizado mi pregunta
Eran Galperin
2

No soy de los que tocan mi propia bocina, pero he desarrollado una aplicación web interna para rastrear los cambios en los esquemas de la base de datos y crear scripts de actualización versionados.

Esta herramienta se llama Brasil y ahora es de código abierto bajo una licencia MIT. Brasil está basado en ruby ​​/ ruby ​​on rails y admite la implementación de cambios en cualquier base de datos que soporte Ruby DBI (MySQL, ODBC, Oracle, Postgres, SQLite).

Se planifica el soporte para poner los scripts de actualización en el control de versiones.

Joakim Bodin
fuente
Brasil se ve bastante bien, lástima que estoy usando principalmente PHP. ¿Alguna vez consideró portar el sistema?
Eran Galperin
1

Exportamos los datos a un formato portátil (usando nuestra cadena de herramientas) y luego los importamos a un nuevo esquema. no hay necesidad de delta SQL. Muy recomendable.

Shachar
fuente
3
¿Qué es este formato portátil? ¿Y cómo lo importa al nuevo esquema aplicando solo las diferencias de la versión anterior?
Eran Galperin
1

Uso la base de datos Firebird para la mayoría del desarrollo y uso FlameRobin herramienta de administración para ello. Tiene una buena opción para registrar todos los cambios. Puede registrar todo en un archivo grande o un archivo por cambio de base de datos. Utilizo esta segunda opción, y luego almaceno cada script en el software de control de versiones; antes usaba Subversion, ahora uso Git.

Supongo que puede encontrar alguna herramienta MySQL que tenga la misma función de registro que FlameRobin para Firebird.

En una de las tablas de la base de datos, almaceno el número de versión de de la estructura de la base de datos, para poder actualizar cualquier base de datos fácilmente. También escribí un script PHP simple que ejecuta esos scripts SQL uno por uno en cualquier base de datos de destino (la ruta de la base de datos y el nombre de usuario / contraseña se proporcionan en la línea de comandos).

También hay una opción para registrar todas las declaraciones DML (insertar, actualizar eliminar), y activo esto mientras modifico algunos datos 'predeterminados' que contiene cada base de datos.

Escribí un buen libro blanco sobre cómo hago todo esto en detalle. Puede descargar el documento en formato .pdf junto con scripts PHP de demostración desde aquí .

Milan Babuškov
fuente
1

También desarrollé un conjunto de scripts PHP donde los desarrolladores pueden enviar sus scripts deltasql a un repositorio central.

En una de las tablas de la base de datos (llamada TBSYNCHRONIZE), almaceno el número de versión del último script ejecutado, para poder actualizar cualquier base de datos fácilmente utilizando la interfaz web o un cliente desarrollado a propósito para Eclipse.

La interfaz web permite gestionar varios proyectos. Es compatible también con la base de datos "sucursales".

Puede probar la aplicación en http://www.gpu-grid.net/deltasql (si inicia sesión como administrador con la contraseña testdbsync). La aplicación es de código abierto y se puede descargar aquí: http://sourceforge.net/projects/deltasql

deltasql se usa productivamente en Suiza e India, y es popular en Japón.

Tiziano Mengotti
fuente
1

Hace unos meses busqué en la herramienta para versionar el esquema MySQL. Encontré muchas herramientas útiles, como la migración de Doctrine, la migración de RoR, algunas herramientas escritas en Java y Python.

Pero ninguno de ellos cumplió mis requisitos.

Mis requisitos:

  1. Sin requisitos, excluye PHP y MySQL
  2. No hay archivos de configuración de esquema, como schema.yml en Doctrine
  3. Capaz de leer el esquema actual desde la conexión y crear un nuevo script de migración, que representa un esquema idéntico en otras instalaciones de la aplicación.

Empecé a escribir mi herramienta de migración, y hoy tengo la versión beta.

Por favor, pruébalo si te interesa este tema. Por favor envíeme futuras solicitudes y reportes de errores.

Código fuente: bitbucket.org/idler/mmp/src Descripción general en inglés: bitbucket.org/idler/mmp/wiki/Home Descripción general en ruso: antonoff.info/development/mysql-migration-with-php-project

Maxim Antonov
fuente
También tiene una nueva herramienta: DBV: stackoverflow.com/a/13837473/6309
VonC
1

Para MySQL

Cuando aterrizo en un nuevo DB:

En primer lugar, verifico la estructura:

mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql
diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt
cat DIFF_FILENAME.txt | less

Gracias a los usuarios de stackoverflow, pude escribir este script rápido para encontrar diferencias de estructura.

src: https://stackoverflow.com/a/8718572/4457531 y https://stackoverflow.com/a/26328331/4457531

En un segundo paso, verifico los datos, tabla por tabla con mysqldiff. Es un poco arcaico, pero un bucle php basado en information_schemadatos hace que el trabajo sea seguro

Para el control de versiones, lo uso de la misma manera, pero formateo un script de actualización de SQL (para actualizar o revertir) con resultados de diferencias y uso la convención de número de versión (con varias modificaciones, el número de versión parece una dirección IP) .

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------
Nolwennig
fuente
0

Estoy usando versiones estrictas del esquema de la base de datos (seguido en una tabla separada). Las secuencias de comandos se almacenan en el control de versiones, pero todas verifican la versión actual del esquema antes de realizar cualquier cambio.

Aquí está la implementación completa para SQL Server (la misma solución podría desarrollarse para MySQL si es necesario): Cómo mantener la versión del esquema de base de datos de SQL Server

Zoran Horvat
fuente
Acabo de leer tu artículo. ¿Todavía usa esto o ha adoptado desde entonces una solución estándar como DBUp o ReadyRoll?
David Atkinson
Actualmente, todos mis proyectos se basan en Entity Framework Code-First y uso sus migraciones para versionar la base de datos. Tengo la solución del artículo en un par de proyectos heredados y nunca la reemplacé. En otros proyectos utilicé las herramientas de Redgate para administrar esquemas y migraciones.
Zoran Horvat
¡Genial que seas un usuario de Redgate! Si desea utilizar las herramientas de Redgate junto con EF, es posible: red-gate.com/blog/database-lifecycle-management/…
David Atkinson
Me aseguraré de probarlo en la próxima oportunidad. Nos sirvió bien, pero mientras tanto he cambiado el equipo y ahora estoy experimentando con el soporte nativo de EF antes de impulsarlo.
Zoran Horvat
0

Después de una larga investigación, descubrí que hay algunas herramientas de terceros o tipos de proyectos de Visual Studio que no me satisfacen, o simplemente bloguea sobre la teoría pero no implementa. Así que implementé un sistema de trabajo, que se usa casi un año, y lo expliqué aquí:

http://nalgorithm.com/2015/11/09/database-versioning-part-1/

dependiendo del interés, seguiremos escribiendo más.

Yuksel Daskin
fuente
2
Hola, bienvenido a SO. Esta respuesta no es realmente completa, básicamente solo proporciona un enlace. Las respuestas de solo enlace no son las mejores: si el enlace alguna vez se invalida, su respuesta sería inútil. Así que edítelo y agregue al menos un resumen de lo que se puede encontrar allí, para que su respuesta tenga un valor independiente del enlace. ¡Gracias!
Fabio dice reinstalar a Mónica el