Получение задачи dbdeploy Phing для автоматического отката при дельта-ошибке

StackOverflow https://stackoverflow.com/questions/2453887

Вопрос

Я использую Финг's задача развертывания dbdeploy Для управление моей схемой базы данных.Это работает нормально, пока в запросах моих дельта-файлов нет ошибок.

Однако, если произошла ошибка, dbdeploy просто запустит дельта-файлы вплоть до запроса с ошибкой, а затем прервет.Это вызывает у меня некоторое разочарование, потому что тогда мне приходится вручную откатывать запись в таблице журнала изменений.Если я этого не сделаю, dbdeploy будет считать, что миграция прошла успешно при последующей попытке, поэтому любые повторные попытки ничего не дадут.

Итак, вопрос в том,, есть ли какой-либо способ заставить dbdeploy использовать транзакции или вы можете предложить какой-либо другой способ автоматического отката phing при возникновении ошибки?

Примечание: Я не настолько хорошо разбираюсь в Phing, поэтому, если это связано с написанием пользовательской задачи, я высоко ценю любой пример кода или URL-адрес с дополнительной информацией.Спасибо

Это было полезно?

Решение

(если вы все еще где-то там ...) Что касается проверки подлинности задачи дампа базы данных, воспользуйтесь утилитой db's dump utility и создайте задачу проверки подлинности.В основном я использую 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 task, которая по умолчанию запускает sql-скрипт в транзакции.При возникновении ошибки компонент database engine автоматически откатит ваши изменения (даже те, что внесены в таблицу журнала изменений - база данных будет находиться в предыдущем состоянии).

Пример:

<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>

Почему бы не написать серию дельт отмены и не добавить задачу проверки, которая запускается при сбое другой задачи?

вам действительно стоит взглянуть на капистрано.ТомТом:вы здесь чего-то не понимаете:резервная копия перед изменением схемы, конечно, должна быть сделана - но что делать с НОВЫМИ данными, которые были вставлены, пока вы думали, что все в порядке?Я не говорю, что существует хороший инструмент для решения этой проблемы, но проблема существует в реальной жизни.

"Правильный" способ сделать это - создать резервную копию перед изменением схемы, а затем выполнить откат в случае ошибки.

Вы не говорите, какую базу данных вы используете, но мне было бы интересно, будут ли все изменения схемы поддерживаться в транзакциях.Mos-конечные базы данных SQL (oracle, db2, sql server) не делают этого во всех случаях по действительно веским причинам.Изменения транзакционной схемы ДЕЙСТВИТЕЛЬНО сложны и ТРЕБУЮТ БОЛЬШИХ ресурсов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top