Phing: backup и сохранение в Subversion базы данных

Владимир | | MySQL, Phing, Subversion.

В этой заметке я хочу показать несложный пример использования Phing для создания резервных копий базы данных (MySQL) и их отправки в репозиторий Subversion.

Ни для одной из этих операций готовых задач для Phing я не нашел. Но, если подумать, они и не очень нужны. Ведь с помощью Phing можно выполнить любую команду. Т.е. если вы знаете как решить задачу с помощью консоли, значит вы можете автоматизировать решение с помощью Phing.

Примечание. Если вы слышите слово Phing впервые, то, думаю, вам будет интересно почитать статью Программирование на PHP. Избавляемся от рутинных операций с помощью Phing, а может быть и весь раздел Phing этого блога 😉

Возвращаемся к нашей задаче.

Для создания резервной копии базы можно использовать утилиту mysqldump. В её параметрах нужно указать имя пользователя базы, его пароль и название базы. Дополнительно нужно задать имя файла в который мы сохраняем дамп.

Например, так

mysqldump -uпользователь -pпароль название_базы > dump.sql

Для сохранения файла в Subversion используется команда commit.

svn.exe commit -m “db_backup” --username имя --password пароль имя_файла

Здесь мы указываем текст сообщения (после параметра -m), имя пользователя Subversion, его пароль и имя файла, который нужно сохранить.

Примечание. Подробнее об этой системе контроля версий можно почитать в разделе Subversion.

Теперь рассмотрим build-файл.

<?xml version="1.0" encoding="UTF-8"?>
<project name="DbBackup" default="commit" basedir=".">

	<property name="DUMP_FILE" value="dump.sql" />
	<property name="MYSQL_PATH" value="путь_к_mysql" />
	<property name="DB_NAME" value="имя_базы_данных" />
	<property name="DB_HOST" value="localhost" />
	<property name="DB_USER" value="имя_пользователя_mysql" />
	<property name="DB_PASS" value="пароль_mysql" />
	
	<property name="SVN_USER" value="имя_пользователя_subversion" />
	<property name="SVN_PASS" value="пароль_subversion" />
	
	<target name="backup">
		<exec command="${MYSQL_PATH}mysqldump -u${DB_USER} -p${DB_PASS} ${DB_NAME} > ${DUMP_FILE}" dir="." />
	</target>
	
	<target name="commit" depends="backup">
		<exec command="svn.exe commit -m "db_backup" --username ${SVN_USER} --password ${SVN_PASS} ${DUMP_FILE}" dir="." />
	</target>
</project>

Как видите, большую часть файла занимают свойства (имена, пароли, адрес сервера, размещение mysqldump).

В принципе, их можно было указать прямо в командах, но в большинстве случаев build-файлы гораздо сложнее. И сложно сказать заранее, что какое-то значение будет использован только один раз. Поэтому удобнее задать их один раз в начале файла.

Для выполнение наших команд мы использовали стандартную задачу exec. Как несложно догадаться она просто выполняет указанную команду.

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

Думаю, вы догадались, что используя такие build-файлы можно автоматизировать работу с любыми консольными программами.

Конечно, создание самого build-файла отнимает немного времени, но вы быстро его вернете и, кроме того, будете делать меньше ошибок (особенно если нужно выполнять длинные последовательности операций).

И в заключение, небольшой совет. По-умолчанию Phing не выводит результат выполнения команды. Т.е. вы не знаете выполнилась на самом деле команда или нет.

Например, если в данном примере написать sbn.exe вместо svn.exe и запустить этот build-файл, то в результате вы увидите обычное сообщение BUILD FINISHED. Естественно, новая версия файла в репозитории сохранена не будет.

Поэтому на этапе тестирования очень полезно запускать phing с параметром -verbose.

phing -verbose

В этом случае вы увидите множество интересных сообщений и в том числе

“sbn.exe” не является внутренней или внешней командой …

После того, как вы убедитесь, что всё работает правильно, можно перейти обычный режим.

Время – деньги. Цените его! 🙂