让 Phing 的 dbdeploy 任务在发生增量错误时自动回滚
解决方案
(如果您仍然在那里...)关于数据库转储任务的 phing,请使用数据库的转储实用程序并创建一个 phing 任务。我主要使用 postgres 并在我的 phing build.xml 中包含以下内容:
<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>
其他提示
解决问题的最简单方法是使用 pdoexec 任务,它默认在事务中运行 sql 脚本。当错误发生时,数据库引擎将自动回滚您的更改(即使是更改日志表上的更改 - 数据库将处于以前的状态)
例子:
<pdosqlexec
url="pgsql:host=${db.host}
dbname=${db.name}"
userid="${db.user}"
password="${db.pass}"
src="${build.dbdeploy.deployfile}"
/>
我知道,这是非常古老的线程,但也许它会被其他人充分利用。您可以使用 try->catch 语句来实现该问题的解决方案。我的例子:
<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>
为什么不编写一系列撤消增量并添加一个在其他任务失败时运行的 phing 任务?
你真的应该看看 capistrano 。汤姆汤姆:你在这里遗漏了一些东西:当然,必须在模式更改之前进行备份 - 但是如何处理在您认为一切正常的同时插入的新数据呢?我并不是说有一个很好的工具可以解决这个问题,但这个问题在现实生活中确实存在。
执行此操作的“正确”方法是在架构更改之前进行备份,然后在出现错误时回滚。
您没有说您使用什么数据库 - 但我会想知道事务中是否支持所有架构更改。大多数大腿末端 SQL 数据库(oracle、db2、sql server)在所有情况下都不会这样做,这是有充分理由的。跨行为模式更改确实非常困难并且非常耗费资源。
不隶属于 StackOverflow