Conseguir tarea dbdeploy de Phing de revertir de forma automática en caso de error delta
Pregunta
Estoy utilizando Phing 's dbdeploy tarea a gestión de esquema de base de . Este es el trabajar muy bien, siempre y cuando no hay errores en las consultas de mis archivos delta.
Sin embargo, si hay un error, dbdeploy sólo ejecutará los archivos delta hasta la consulta con el error y luego abortar. Esto me provoca cierta frustración, porque tengo que deshacer manualmente la entrada en la tabla de cambios a continuación. Si no lo hago, dbdeploy asumirá la migración se ha realizado correctamente en un intento posterior, por lo que cualquier reintentos no hará nada.
Así que la pregunta es, ¿Hay alguna manera de obtener las transacciones de uso dbdeploy o se puede sugerir cualquier otra manera de tener rollback Phing automáticamente cuando se produce un error
Nota: no soy tan hábil con Phing, así que si esto consiste en escribir una tarea personalizada, cualquier código de ejemplo o una URL con más información es muy apreciada. Gracias
Solución
(si todavía estás ahí fuera ...) En cuanto a Phing para una tarea volcado db, utilizar la utilidad de volcado de la base de datos y crear una tarea phing. Puedo utilizar postgres y sobre todo tener esto en mi build.xml phing:
<target name="db-dump" depends="">
<php expression="date('Ymd-Hi')" returnProperty="phing.dump.ts"/>
<exec command="pg_dump -h ${db.host} -U ${db.user} -O ${db.name} | gzip > ${db.dumppath}/${db.name}-${phing.dump.ts}.gz" />
</target>
Otros consejos
La forma más sencilla de resolver su problema es utilizar la tarea pdoexec que por defecto se ejecuta secuencia de comandos SQL en una transacción realizada. Cuando se produce un error del motor de base de datos será deshacer automáticamente los cambios (incluso aquellos en la mesa de registro de cambios - la base de datos estará en el estado anterior)
Ejemplo:
<pdosqlexec
url="pgsql:host=${db.host}
dbname=${db.name}"
userid="${db.user}"
password="${db.pass}"
src="${build.dbdeploy.deployfile}"
/>
Lo sé, esto es hilo muy antiguo, pero tal vez será un uso completo para otra persona. Puede utilizar prueba-> declaraciones de capturas para implementar una solución para eso. Mi ejemplo:
<trycatch>
<try>
<exec
command="${progs.mysql} -h${db.live.host} -u${db.live.user} -p${db.live.password} ${db.live.name} < ${db.live.output}/${build.dbdeploy.deployfile}"
dir="${project.basedir}"
checkreturn="true" />
<echo>Live database was upgraded successfully</echo>
</try>
<catch>
<echo>Errors in upgrading database</echo>
<exec
command="${progs.mysql} -h${db.live.host} -u${db.live.user} -p${db.live.password} ${db.live.name} < ${db.live.output}/${build.dbdeploy.undofile}"
dir="${project.basedir}"
checkreturn="true" />
</catch>
</trycatch>
¿Por qué no escribir una serie de deltas de deshacer y añadir una tarea que se ejecuta en phing fracaso de la otra tarea?
que realmente debería echar un vistazo a Capistrano. TomTom: se echa en falta algo aquí: la copia de seguridad antes de cambio de esquema, por supuesto, tiene que ser hecho - pero ¿qué hacer con los nuevos datos que se insertan en tanto que pensaban que todo está bien? No digo, tthat hay una buena herramienta para este problema, pero el problema existe en la vida real.
La forma "correcta" de hacer esto es una copia de seguridad antes de cambio de esquema, a continuación, rollback en caso de error.
Lo que te dice lo db utiliza - pero sería me pregunto si todos los cambios de esquema se apoyarían en las transacciones. Mos bases de datos finales del muslo SQL (Oracle, DB2, SQL Server) no hagas que en todos los casos por muy buenas razones. cambios en el esquema Transacitonal son realmente difícil y realmente resouce intensiva.