LINUX.ORG.RU

как бы мне коммитить DB в svn:)


0

0

Доброе время суток.

Делаю я тут небольшой сайтецок на друпале и вот захотелось мне блекджека^W засунуть свой сайтец в svn репозиторий. Впринципе занимаюсь я сайтом один и работаю с ним макимум с двух машин, так что понимаю что репозиторий тут излишен, но решил всётаки выеб^Wпопробовать)

С файлами на диске всё понятно, а как быть с базой данной (на мускуле)? Делать mysqldump и запихивать дамп в репозиторий показалось мне слишком бредовой и неудобной затеей. Можно ли какнибудь поудобнее организовать revision control базы данных? обработка бд особая и не нужна. можно как бинарный файл даже его гонять. diff и прочее не нужны. Но вот как сделать чтобы при svn commit/update бд автоматически синхронизировалась?..

З.Ы. пока писал вспомнил про hooks

★★★★★

хотя хуки выполняются на стороне сервера. такчто не подойдёт

Nao ★★★★★
() автор топика

> С файлами на диске всё понятно, а как быть с базой данной (на мускуле)? Делать mysqldump и запихивать дамп в репозиторий показалось мне слишком бредовой и неудобной затеей.

Абсолютно нормальная идея. У тебя ведь база тестовая, маленькая? Если да - mysqldump без вариантов. Можно разбиать на два файла - в одном создание таблиц, в другом insert'ы... тогда в первом файле будет история как ddl таблиц менялась...

> Можно ли какнибудь поудобнее организовать revision control базы данных? обработка бд особая и не нужна. можно как бинарный файл даже его гонять.

это закончится тем что ты подменишь файл при невыключенном mysql'е и получишь table corruption.

gods-little-toy ★★★
()

Навскидку примерно так:

cat >$HOME/bin/prjCommit <<EOF
#!/bin/sh

PROJECT_NAME=$1; shift
ROOT_OF_PROJECTS=$HOME/src

mysqldump -h "host" --hex-blob -u "user" -p "pass" "$PROJECT_NAME" >$ROOT_OF_PROJECTS/$PROJECT_NAME/dbdump.sql

pushd $ROOT_OF_PROJECTS/$PROJECT_NAME
svn ci -m "$@"
popd
EOF

Использование:

prjCommit "myCoolProject" "Adding some feature with changes in db"

Работу не проверял, выдал "на коленке" саму идею.

Slavaz ★★★★★
()
Ответ на: комментарий от gods-little-toy

>Абсолютно нормальная идея. У тебя ведь база тестовая, маленькая? Если да - mysqldump без вариантов. Можно разбиать на два файла - в одном создание таблиц, в другом insert'ы... тогда в первом файле будет история как ddl таблиц менялась...

хм. счас покурим man mysqldump. вроде мысль интересная.

>это закончится тем что ты подменишь файл при невыключенном mysql'е и получишь table corruption.

ну трогать файлы бд в /var/lib я и не собирался. это в любом случае нужно экспорт/импорт делать. другой вопрос чтобы это както прикрутить к svn поудобнее, впринципе конечно можно тупо сделать скрипт вида mysqldump > somefile && svn commit и соответственный скрипт для svn up, но можно ли както заставить команду svn выполнять определённые внешние скрипты? что-то вроде hooks но на стороне клиента?

Nao ★★★★★
() автор топика
Ответ на: комментарий от Nao

Re: как бы мне коммитить DB в svn:) Если разделять структуру и данные. то так:

# functions mysqldump -h "host" -d -n -t -R -u "user" -p "pass" "$PROJECT_NAME" >$ROOT_OF_PROJECTS/$PROJECT_NAME/dbdump-funcs.sql

# schema mysqldump -h "host" -d -u "user" -p "pass" "$PROJECT_NAME" >$ROOT_OF_PROJECTS/$PROJECT_NAME/dbdump-schema.sql

# data mysqldump -h "host" --hex-blob -n -t -u "user" -p "pass" "$PROJECT_NAME" >$ROOT_OF_PROJECTS/$PROJECT_NAME/dbdump-data.sql

Это, если надо, вставь вместо одного mysqldump в скрипте

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

спасибо. как раз сейчас подбираю опции. странно что у меня (бубунта 8.04) в мане по mysqldump нет опции -d однако она работает и делает как-раз то что нужно.

Nao ★★★★★
() автор топика

бетта версия скрипта обёртки для svn commit:

#!/bin/sh
DB_SETTINGS_FILE=site/sites/default/settings.php
MYSQLDUMP=mysqldump
SVN=svn
DB_DIR=db

[ -n "$1" ] || (echo usage: $0 commit_message ; exit 1)
MESSAGE=$1

if [ -d "$DB_DIR" ] && $SVN info >/dev/null 2>/dev/null && [ -r "$DB_SETTINGS_FILE" ] ; then
        grep ^\$db_url $DB_SETTINGS_FILE | \
        sed s'#^.*mysql://\([^:]*\):\([^@]*\)@\([^/]*\)/\([^'\'']*\).*#\1 \2 \3 \4#' | \
        (read DB_USERNAME DB_PASSWD DB_HOST DB_NAME
                [ -n "$DB_USERNAME" -a -n "$DB_PASSWD" -a -n "$DB_HOST" -a -n "$DB_NAME" ] || \
                        (
                                echo error: cannot read database configuration
                                exit 1
                        )
                echo -n dumping database "$DB_NAME"...
                $MYSQLDUMP -h "$DB_HOST" -d -u "$DB_USER" -p"$DB_PASSWD" "$DB_NAME" > $DB_DIR/db-schema.sql && \
                $MYSQLDUMP -h "$DB_HOST" -n -t --hex-blob -u "$DB_USER" -p"$DB_PASSWD" "$DB_NAME" > $DB_DIR/db-data.sql && \
                echo "done" || \
                (echo "error" ; echo "cannot dump database. exiting"; exit 2)
        ) && \
        (
                echo "running svn commit..."
                $SVN -m "$MESSAGE" ci || (echo "error: cannot commit to repository" ; exit 3)
                echo "commited"
        )

else
        echo error: this is not project root directory
        exit 1
fi 


скрипт для движка drupal. настройки выдёргиваются из соответствующего конфига. бд складываются в каталог DB_DIR. 
можно адаптировать под другие нужды, только нужно изменить алгоритм доставания параметров БД

Nao ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.