Нашим программистам приходится часто сохранять в SVN снимки состояния различных сайтов, расположенных на нашем сервере (FreeBSD). Эти снимки должны включать в себя файлы сайта и дамп его БД (MySQL). Если с файлами всё более менее просто, то вот делать дампы — занятие слегка утомительное (из-за чего программисты часто про них забывают). И вот родилась такая глупая мысль: было бы здорово, если бы удалось разместить в домашней папке сайта (конечно же недоступной через веб) особый файл, при чтении которого возвращался бы текстовый дамп БД. Тогда бы программист, скачивая с сервера файлы сайта, получал бы и дамп.
Поиск в поисковиках готовых решений (например для создания файлов, при чтении которых вызывался бы скрипт) ничего не дал (может не так искал?). Следующая мысль — написать свой драйвер устройства, а в папки сайтов класть символическую ссылку на него. Но тут возникает трудность: БД на сервере много, как драйверу узнать, какую из них дампить? Записать в устройство имя БД перед чтением — не вариант, по понятным причинам. Делать своё устройство для каждой БД тоже не самое удобное решение.
Может у кого-то есть светлые мысли, как решить задачку?
Обновление. Видимо надо пояснить прямо тут. Это не производственная задача. Это скорее интерес — а можно ли сделать что-то подобное? Если получится — хорошо, удастся внедрить — ещё лучше. Поэтому альтернативы вроде «напиши скрипт, который будет делать это по крону», не интересны, т. к. слишком скучны.
Но вообще вам нужно fifo использовать
что-то наподобие
DUMP_FILE=/path/to/fifo
mkfifo $DUMP_FILE
while 1; do
mysql_dump > $DUMP_FILE
done
Т.е. мусклдамп начнет отдавать данные только когда кто-то начнет читать из /path/to/fifo. Т.к. оно зациклено то при каждом чтении будет выдаваться новый дамп. Но я не уверен что mysql_dump не залочит БД сразу при запуске.
Но лучше бы вам просто скрипт для дампа написать и не заниматься фигней.
Ну, как я уже написал выше, делаю больше из интереса, но с надеждой и на практическое применение. Решение с fifo интересное, надеюсь, завтра будет время попробовать. Благодарю!
Вместо скачивания файлов вручную и, тем более, написания своих файловых систем, необходимо написать скрипт (на любом нравящемся вам языке, я бы выбрал bash), который будет соединяться с сервером по ssh, делать дамп БД, и коммитить все нужные файлы в SVN. Сам будет делать всю работу, а не вручную. Тогда проблема «забыл закоммитить файл» исчезает автоматически.
Автоматический коммит в данном случае вообще зло. Потому что его не получится снабдить разумным комментарием с описанием изменений. В нашем случае коммит должен делаться исключительно руками и только тогда, когда программист решит, что файлы готовы для коммита.
Ну и со скриптами тоже не всё радужно. Не все программисты, увы, работают в никсах.
Странные вещи Вы говорите. как минимум TFS (Team Foundation Server) имеет возможность установки правила, что check-in изменений в коде на TFS сервер не будет выполнен без успешной компиляции перед выгрузкой изменений на сервер, понятное дело, оставив логику на программиста.
Более того, как, по Вашему работают автоматические сборки проектов и автотестрование?
И в третьих, что мне в командной строке мешает добавить комментарий вроде -m «crontab auto commit»?
описание изменений тоже можно прикрутить при желании, но обычно все «изменения» делаются и проверяются на тестах
Где я говорил про автоматический коммит? Атвор вопроса пишет, что они заливают бекапы сайтов в SVN вместе с дампом БД (первый раз слышу про бекап в SVN, ну да ладно). Я предложил вместо изобретения новых файловых систем автоматизировать эту работу, прописав все нужные действия в скрипте. Это не автоматический, а как раз самый на то что ни есть ручной коммит.
Описание коммита может как вводить программист, так и генерироваться из времени и названия сайта.
Кронтаб, дамп каждую ночь в часы минимальной нагрузки, скрипт ротации (удаляет самые старые дампы, когда остается мало места). И ничего не нужно делать руками.
Сами файлы дампов нужно жать и скидывать на удаленный сервер (или в dropbox какой-нибудь) для сохранности.
Ага, изобретаю. Хочется сделать больше из интереса, ну а уж если будет и практическая отдача, совсем хорошо. Сервер не боевой, а тестовый, так что нагрузки на нём нет. Но и делать раз в сутки слишком редко, т. к. изменения на сайты вносятся очень часто. Каждую минуту? Это как-то не интересно.
Можно написать скрипт, который прикинется FS с помощью FUSE.
В этой виртуальной FS базы представлять в виде файлов. На каждую операцию read готовить и отдавать дамп.
Только могут быть проблемы с определением размера файла т.к. актуальный размер дампа мы можем узнать только по его готовности.