Получение задачи dbdeploy Phing для автоматического отката при дельта-ошибке
Вопрос
Я использую Финг'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} < ${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>
Почему бы не написать серию дельт отмены и не добавить задачу проверки, которая запускается при сбое другой задачи?
вам действительно стоит взглянуть на капистрано.ТомТом:вы здесь чего-то не понимаете:резервная копия перед изменением схемы, конечно, должна быть сделана - но что делать с НОВЫМИ данными, которые были вставлены, пока вы думали, что все в порядке?Я не говорю, что существует хороший инструмент для решения этой проблемы, но проблема существует в реальной жизни.
"Правильный" способ сделать это - создать резервную копию перед изменением схемы, а затем выполнить откат в случае ошибки.
Вы не говорите, какую базу данных вы используете, но мне было бы интересно, будут ли все изменения схемы поддерживаться в транзакциях.Mos-конечные базы данных SQL (oracle, db2, sql server) не делают этого во всех случаях по действительно веским причинам.Изменения транзакционной схемы ДЕЙСТВИТЕЛЬНО сложны и ТРЕБУЮТ БОЛЬШИХ ресурсов.