Синхронизация баз MySQL с помощью сервиса Dropbox

    По долгу службы мне приходиться трудиться много и в разных местах. На работе, дома и в командировках меня преследует одержимость моей работой. Я работаю в небольшой веб-студии и в мои задачи входит верстка сайтов и проектирование GUI для интранет-проектов. Не могу не упомянуть неоценимую помощь моих верных друзей, их имена iMac, Mac Pro и MacBook. В своей работе я использую джентльменский набор верстальщика в Mac OS X: Coda — для редактирования HTML/JavaScript и MAMP — для запуска локального веб-сервера. Но речь пойдет не о установке и настройке вышеперечисленных продуктов, а о том как облегчить жизнь разработчикам имеющим в своем парке два и более компьютера работающих под управлением Mac OS X.

    Давным-давно, когда много-мегабитные интернет каналы существовали у обычного обывателя только в фантазиях, все мы довольствовались простым способом переноса данных с одного компьютера на другой — флешка или внешний винчестер. За последний год, мой флеш-брелок служивший мне верой и правдой больше четырех лет, мирно покоится на книжной полке. Его заменил аккаунт Dropbox — всем Вам известном сервисе по хранению и синхронизации данных. Бесплатного аккаунта размером 2Гб мне вполне хватает для синхронизации всех рабочих проектов между моими рабочими лошадками.

    Если с синхронизацией обычных файлов, HTML-шаблонов и скриптов, скорее всего, ни у кого из Вас вопросов не возникает, то с синхронизацией баз MySQL не все так просто. Нет. Вру..! На самом деле все очень просто! Есть два (бесплатных) варианта:
    1. В конце рабочего сеанса делать выгрузку дампа измененных баз (естественно в Dropbox) с последующим импортом дампа в MySQL на следующей машине
    2. Полностью хранить базы в Dropbox

    Нетрудно догадаться, что второй вариант идеален, а его воплощение в жизнь займет у Вас не более пяти минут. Итак приступим:

    В-первую очередь выясним где MySQL запущенный с помощью MAMP хранит свои данные. Запускаем phpmyadmin и переходим на закладку «Переменные». В списке находим переменную datadir и ее значение. В переменной указано местоположение на диске файлов с базами. В моем случае — /Library/Application Support/appsolute/MAMP PRO/db/mysql/

    1. Выключаем MySQL сервер, открываем терминал и начинаем шаманить.
    2. Создадим папку для хранения базы MySQL:
    mkdir -p ~/Dropbox/database
    3. Переходим в папку с каталогом базы (не забываем про экранирование пробелов)
    cd /Library/Application\ Support/appsolute/MAMP\ PRO
    4. На компьютере с актуальной базой данных перемещаем папку с локальной копией базы MySQL в хранилище Dropbox. На всех последующих компьютерах этот шаг пропускаем.
    mv db ~/Dropbox/database/db
    5. Удаляем папку с локальной копией базы MySQL:
    rm -rf db
    6. Создаем символическую ссылку на хранилище Dropbox
    ln -s ~/Dropbox/database/db db
    7. Всё готово! Теперь можно запускать MySQL сервер.

    Действия по указанному алгоритму необходимо выполнить на всех синхронизируемых машинах.

    Для корректной синхронизации, в конце рабочего сеанса необходимо отключать mysql сервер. Это связано с тем, что работающий mysql блокирует файлы с которыми он работает и синхронизация таких файлов невозможна до их разблокировки. Упростить процедуру завершения трудового сеанса можно создав скрипт в Automator.

    Надеюсь моя небольшая заметка принесет вам пользу.

    Комментарии 22

      +2
      :) я туда домашние свн репозитарии закинул
        0
        Mercurial в этом плане удобнее (сугубо IMHO).
          0
          а можете рассказать почему?
            +1
            Дело в том, что моё хранилище нельзя назвать «домашним» на 100%, так как использую его всё же не только я, а ещё и мой друг. Поэтому я естественно не открываю файлы прямо из Dropbox'a: во-первых, в таком случае они бы апдейтились у них при каждом сохранении, а во-вторых, при активном юзании обновляться будет не один десяток файлов, и так каждые пару минут.

            Соответственно, в локальной копии хранилища я веду всю работу, делаю коммиты, и только по окончании всей работы синхронизирую с хранилищем в Dropbox. За это время мой друг может сделать то же самое, и тогда в хранилище просто образуется две ветки, которые впоследствии можно будет слить.

            Ну и ещё мне нравится, что в Mercurial вся «служебная» инфа находится в одной папке .hg в корне хранилища вместо десятка .svn (по одной на каждый уровень).

            Возможно мои аргументы вовсе не аргументы :) Но мне почему-то кажется, что удобнее.
              0
              Я кстати удосужился-таки пробежаться глазами по статье и понял, что мой способ соответствует варианту №1, представленному там.
                0
                спасибо) я просто совсем не знаком с Меркуриалом… вот узнал насчет .hg интересный факт)
        0
        Отличный первый пост на хабре.
        У меня конечно только один помощник — из семейства эпловых, но все-равно, способ очень действенный даже для одной машинки.
          0
          На Mac OS X работать в консоли? O_o!
          Если серьёзно, то давно использую Dropbox и очень нравится мне этот сервис! Синхронизировать можно всё, что вздумается, даже папку ~/, если надо! :) Вот только автоматизировать бы включение/выключение mysql и расписание синхронизации самого dropbox, иначе он будет синхронизировать каждую буковку изменённую в базе!
          Например запускать dropbox после включения компьютера и выгружать после синхронизации и снова запускать перед выключением — так у вас синхронизируются все накопленные изменения за период работы.
            0
            Консоль порой позволяет гораздо больше чем GUI. По поводу синхронизации каждой буковки в базе… Ведь в этом и есть смысл мероприятия. При этом фалы mysql синхронизируются только когда mysql-сервер прекращает с ними работу, до завершения работы mysql-сервера файлы в локе
              0
              Насчет локов там отдельная тема, мне не нравилось, что dropbox постоянно дёргал свой сервер, если файл был залочен. Возможно в последних версиях это пофиксено, я не смотрел.
                0
                Скорее не дергает, а держит коннект… Трафика мизер уходит
            0
            А можно тупой вопрос?

            Пока Вы шаманите с лежащим MySQL сервером — Ваш web-сервер лежит.
            И все посетители идут лесом?
              0
              А это не для посетителей делается, а для мобильного рабочего места разработчика
                0
                Речь в заметке шла о синхронизации локальных веб-серверов и баз. Т.е. машин на которых ведеться разработка. В частности моя работа. С локальной машины (с одной из трех в моем случае) сделаная работа выгружается в SVN. Из SVN проект выгружается на продакшен сервер, который в свою очередь естественно не выключается.
                +1
                Настройте реплику между MySQL и не шаманьте дропбоксом…
                  0
                  Для того что бы реплика работала необходимо держать включенными одновременно все машины на которых производится синхронизация. Две как минимум это точно. Или я ошибаюсь?
                  0
                  Это же очевидно — mv и симлинк.
                  А я вот делаю так: ~/Dropbox/emacs/config.el — конфиг емакса (использую на маке Aquamacs. Люто, бешено ненавижу Coda, ибо 100 баксов. И мне не svn нужен, а bzr), в .emacs — init-file этого конфига (:

                  P.S. ссылку на dropbox.com мог бы заменить на инвайт-ссылку (+250мб).
                    0
                    Реклама dropbox, да еще и с тегом реферала… как так можно?

                    Ни один нормальный человек реальные базы MySQL так мучать не будет, это бред какой-то. Если на обоих машинах есть интернет, то настрить синхронизацию нужный баз/данных — вопрос максимум пол часа, если руки из верхней части тела растут.
                    А вообще, для веб. дизайна терминальный доступ на одну из машин напорядок лучше, настраивается вообще за 15 секунд и задача переноса пропадает как класс. Всегда работаешь на одной машине, все остальные — только чтоб терминал запустить.
                      –1
                      Ну вы хотя бы вникните в суть проблемы. Синхронизация локальных баз MySQL на трех компах, при этом одновременно включен только один. Один комп на работе (уходишь с работы выключаешь его), один дома (уезжаешь в командировку выключаю домашний комп) и ноутбук для коммандировок (работаю дома или на работе ноутбук выключен и лежит на полке). Какие терминалы??? Вы о чем?
                        0
                        Зачем выключать машину на работе? Терминальтесь к ней из дома и с ноутбука
                          0
                          А если интернета нет то тогда что делать? Не работать?
                      0
                      У меня возник вопрос с синхронизацией mysql но в связке с Laravel + Homestead + VirtualBox
                      Ваша идея приминима и в этой связке, только вот мне не нравится что блокируется доступ к файлам. Тут будут проблемы. Компьютеры у меня включены постоянно и я не очень забочусь что бы гасить както-то сервис. Хотя может cron настроить на определенных машина в определенное время. Может тогда не будет конфликтов версий?

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое