6

我正在使用Phingdbdeploy 任务管理我的数据库架构。只要我的增量文件的查询没有错误,这工作正常。

但是,如果出现错误,dbdeploy 将只运行增量文件直到出现错误的查询,然后中止。这让我有些沮丧,因为我必须手动回滚更改日志表中的条目。如果我不这样做,dbdeploy 将在后续尝试中假定迁移成功,因此任何重试都不会执行任何操作。

所以问题是,有没有办法让 dbdeploy 使用事务,或者你能建议任何其他方式在发生错误时自动回滚 phing吗?

注意:我对 Phing 不是很精通,所以如果这涉及编写自定义任务,任何示例代码或包含更多信息的 url 都将受到高度赞赏。谢谢

4

6 回答 6

3

解决问题的最简单方法是使用 pdoexec 任务,它默认在事务中运行 sql 脚本。发生错误时,数据库引擎将自动回滚您的更改(即使是更改日志表上的更改 - 数据库将处于先前状态)

例子:

<pdosqlexec 
    url="pgsql:host=${db.host}
    dbname=${db.name}"
    userid="${db.user}"
    password="${db.pass}"
    src="${build.dbdeploy.deployfile}"
/>
于 2011-12-30T22:35:32.903 回答
3

(如果你还在外面……)关于 db 转储任务的 phing,请使用 db 的转储实用程序并创建一个 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>
于 2011-04-07T20:02:44.127 回答
3

我知道,这是一个非常古老的线程,但也许它会被其他人完全使用。您可以使用 try->catch 语句来实现解决方案。我的例子:

<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>
于 2012-05-18T14:50:06.497 回答
1

你真的应该看看capistrano。TomTom:您在这里遗漏了一些东西:当然必须在架构更改之前进行备份 - 但是如何处理在您认为一切正常的同时插入的新数据?我不是说,有一个很好的工具来解决这个问题,但这个问题存在于现实生活中。

于 2010-06-28T22:03:08.160 回答
1

为什么不编写一系列撤消增量并添加一个在其他任务失败时运行的 phing 任务?

于 2010-03-16T16:51:13.430 回答
-1

执行此操作的“正确”方法是在架构更改之前进行备份,然后在出现错误时回滚。

你没有说你使用什么数据库——但我想知道事务中是否支持所有模式更改。出于非常好的理由,大多数高端 SQL 数据库(oracle、db2、sql server)在所有情况下都不会这样做。Transacitonal 模式更改非常困难,而且资源非常密集。

于 2010-03-16T11:33:15.647 回答