Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获得Phing';DBS部署任务在增量错误时自动回滚_Php_Mysql_Migration_Phing_Dbdeploy - Fatal编程技术网

Php 获得Phing';DBS部署任务在增量错误时自动回滚

Php 获得Phing';DBS部署任务在增量错误时自动回滚,php,mysql,migration,phing,dbdeploy,Php,Mysql,Migration,Phing,Dbdeploy,我用的是。只要在查询我的增量文件时没有错误,这就可以正常工作 但是,如果出现错误,dbdeploy将只运行增量文件,直到查询出现错误,然后中止。这让我有些沮丧,因为我必须手动回滚changelog表中的条目。如果不这样做,dbdeploy将假定迁移在后续的尝试中成功,因此任何重试都不会起任何作用 所以问题是,是否有任何方法可以获取dbdeploy-use事务,或者您是否可以建议任何其他方法在发生错误时让phing自动回滚 注意:我对Phing不是很精通,所以如果这涉及到编写自定义任务,任何示例代

我用的是。只要在查询我的增量文件时没有错误,这就可以正常工作

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

所以问题是,是否有任何方法可以获取dbdeploy-use事务,或者您是否可以建议任何其他方法在发生错误时让phing自动回滚

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

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


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

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

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

(如果您仍然在那里…)关于数据库转储任务的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} &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>

已成功升级Live数据库
升级数据库时出错

谢谢。使用MySQL,但我也在考虑使用它来管理Oracle 10g中的一些视图。你知道怎么和Phing一起做备份吗?不知道。不应该在那里做。管理员的工作是在配置/软件更改之前进行备份。嗯,这有点违背了像phing这样的自动部署工具的目的,不是吗?谢谢。我有撤销三角洲。但是我怎么能自动运行它们呢?另一个phing任务如何知道返回多远?就知道返回多远而言,您可以为起点设置属性。至于自动运行,我不确定您是否可以自动运行,但是设置一个任务来检查db版本控制表,并根据该任务运行撤销操作怎么样。您可能想看看xinc,它有成功和失败通知程序,能够根据成功或失败运行一些代码逻辑。谢谢您的建议。如果可能的话,我想留在PHP生态系统中。我认为phings dbdeploy目前的状态不如只关注db版本控制的项目。例如,请参见DDL更改语句是否适用?至少在MySql中,这些是无法回滚的。