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

¿Fue útil?

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} &lt; ${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} &lt; ${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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top