Как я могу поместить базу данных в git (контроль версий)?

Я делаю веб-приложение, и мне нужно создать ветку для некоторых серьезных изменений, дело в том, что эти изменения требуют изменений в схеме базы данных, поэтому я также хотел бы поместить всю базу данных в git.

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

Мне нужно быть уверенным, потому что эти изменения не имеют обратной совместимости; Я не могу позволить себе облажаться.

База данных в моем случае - PostgreSQL

Редактировать:

Кто-то предложил делать резервные копии и помещать файл резервной копии под контроль версий вместо базы данных. Если честно, мне это действительно трудно проглотить.

Должен быть способ получше.

Обновлять:

Хорошо, лучшего способа нет, но я все еще не совсем уверен, поэтому я немного изменю вопрос:

Я хотел бы поставить всю базу данных под контроль версий, какой механизм базы данных я могу использовать, чтобы я мог поставить под контроль версий фактическую базу данных вместо ее дампа?

Будет ли sqlite дружественным к git?

Поскольку это только среда разработки, я могу выбрать любую базу данных, которую хочу.

Edit2:

На самом деле я хочу не отслеживать историю своей разработки, а иметь возможность переключаться с моей ветки «новые радикальные изменения» на «текущую стабильную ветку» и иметь возможность, например, исправлять некоторые ошибки / проблемы и т. Д. С текущим стабильная ветка. Таким образом, когда я переключаю ветки, база данных автоматически волшебным образом становится совместимой с веткой, в которой я сейчас нахожусь. Меня не особо интересуют фактические данные.


person hasen    schedule 11.05.2009    source источник
comment
Честно говоря, я просто делаю копии базы данных, если я вношу изменения в схему и мне приходится иметь дело с несколькими ветвями разработки одновременно ... базы данных разработчиков должны быть достаточно маленькими для этого. Я бы рассмотрел любую систему, которая пыталась быть умной и вносила изменения в БД только потому, что я с подозрением изменил исходную ветку. И я также хотел бы, чтобы все продолжало работать, если бы я просто клонировал свое рабочее пространство и имел одну ветку в одном месте, а другую - в новом.   -  person araqnid    schedule 12.05.2009
comment
См. Также инструмент резервного копирования на основе git bup   -  person VonC    schedule 21.10.2013
comment
Если вы считаете, что сценарий (и его компоненты) для инициализации вашей базы данных является артефактом, находящимся под контролем версий, то «резервное копирование» может показаться не таким уж плохим. Если вы измените схему базы данных в радикальной ветке, вам необходимо обновить скрипт, который запускает базу данных с данными.   -  person Fuhrmanator    schedule 20.07.2014
comment
Ознакомьтесь с моим ответом на программное обеспечение, которое именно это делает: stackoverflow.com/a/28123546/1662984   -  person Kevin    schedule 24.01.2015
comment
comment
liquibase.org?   -  person    schedule 16.04.2015
comment
Большие двоичные файлы (например, файлы базы данных) плохо работают с git. Вы можете легко это сделать, просто убедитесь, что git не пытается исправить окончания строк.   -  person Thorbjørn Ravn Andersen    schedule 19.03.2016
comment
Сводка вариантов управления версиями базы данных - многие из них относятся к PostgreSQL: stackoverflow.com/questions/846659/   -  person Dharmendar Kumar 'DK'    schedule 24.09.2018


Ответы (23)


Возьмите дамп базы данных и контролируйте его версию. Таким образом, это простой текстовый файл.

Лично я предлагаю вам сохранить как дамп данных, так и дамп схемы. Таким образом, используя diff, становится довольно легко увидеть, что изменилось в схеме от ревизии к ревизии.

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

person X-Istence    schedule 11.05.2009
comment
Какие? Должен быть способ получше. - person hasen; 11.05.2009
comment
Файлы базы данных PostGreSQL представляют собой двоичные файлы, не стесняйтесь помещать их в свой репозиторий git, вы просто не сможете делать с ними какие-либо различия, и любые изменения, скорее всего, изменят всю базу данных, поэтому теперь вам нужно отправить полную базу данных по сети в репозиторий git и сохраните ее. Это неэффективно, медленно и чрезвычайно затрудняет работу. Кроме того, я не уверен, что файлы базы данных, хранящиеся на диске без VACUUM и выключения PostgreSQL для создания копии, стабильны, поскольку все данные всегда верны, что может привести к повреждению данных. - person X-Istence; 11.05.2009
comment
Мм понятно! Ну, а есть ли системы баз данных, которые более дружелюбны к git? - person hasen; 11.05.2009
comment
Этот тип решения довольно стандартен, а схема фактически является исходным кодом. - person Dana the Sane; 11.05.2009
comment
Я уверен, что есть какой-нибудь инструмент для получения DDL из PostGreSQL ... это то, что вы должны поставить на свою VCS - person Áxel Costas Pena; 21.09.2015
comment
Сейчас 2017 год, есть обновления по этому вопросу? нет ли на самом деле контроля версий БД из коробки? В самом деле ? - person Stavm; 20.08.2017
comment
вы можете использовать доктрину или систему управления версиями, такую ​​как Liquibase, которые хранят модель в xml, php или другом текстовом файле, в котором можно управлять версиями. - person ericksho; 26.02.2018
comment
Имейте в виду, что если у вас есть соединения с оболочкой внешних данных с паролями, эти пароли хранятся в схеме. Поэтому, если вы поместите дамп в систему контроля версий, эти пароли попадут в систему контроля версий. - person Gregory Arenius; 16.05.2018
comment
Проверьте функцию «путешествия во времени» на Flur.ee (flur.ee/index.html) база данных. Он был построен для блокчейна, поэтому различия в модели данных были фундаментальной частью его дизайна. - person Tails; 29.04.2019
comment
Слегка раздражен отсутствием понимания того, почему мы не версируем двоичные файлы (и почти каждый активный db является двоичным для эффективности). Краткий ответ: они не меняются так же, как исходные файлы, что делает неэффективным ведение длинного списка исправлений. Если вы хотите изменить версию схемы базы данных и вас не беспокоит создание дампа вручную, используйте git-хуки (или хуки в ваших любимых vcs), чтобы он автоматически запрашивал дамп схемы с сервера db. Тогда у вас будет что-то постоянное, что может отличаться от вашего vcs. - person mechalynx; 27.09.2019

Я начинаю думать о действительно простом решении, не знаю, почему я не подумал об этом раньше !!

  • Дублируйте базу данных (как схему, так и данные).
  • В ветке для новых-основных-изменений просто измените конфигурацию проекта, чтобы использовать новую дублирующую базу данных.

Таким образом, я могу переключать ветки, не беспокоясь об изменениях схемы базы данных.

РЕДАКТИРОВАТЬ:

Под дублированием я подразумеваю создание другой базы данных с другим именем (например, my_db_2); не делать дамп или что-то в этом роде.

person hasen    schedule 11.05.2009
comment
Это кажется самым простым и эффективным решением, но было бы неплохо, если бы был какой-то способ автоматизировать это ... Я удивлен, что пока что-то нет ... - person JustMaier; 20.04.2014
comment
git hook для создания базы данных из шаблона на основе имени ветки, - person dalore; 26.03.2015
comment
Это то, что я делаю, я также добавляю строку проверки IP в включаемый файл для переменных БД, чтобы, если я случайно загружу неправильный файл ветки на рабочий сервер, ничего не сломается. - person liamvictor; 05.05.2015
comment
так что почти каждая ветка получает свою собственную БД, да? ???? - person olli; 28.04.2019
comment
Для меня это имеет больше смысла, чем версионирование выгруженного файла db. - person illevens; 10.04.2021

Используйте что-то вроде LiquiBase, чтобы сохранить контроль версий ваших файлов Liquibase. вы можете пометить изменения только для производства и попросить lb поддерживать вашу БД в актуальном состоянии либо для производства, либо для разработки (или любой другой схемы, которую вы хотите).

person zie    schedule 14.02.2010
comment
Лучшие практики Liguibase рекомендуют хранить сценарии создания схемы как набор последовательных сценариев, которые должны выполняться по порядку. Хотя это хорошая практика, я не понимаю, как она будет работать без центрального репозитория, который не является GIT. - person Frank Schwieterman; 17.03.2010
comment
Что ж, это будет отлично работать с git, если вы будете осторожны с тегами id = и author =. Теоретически у каждого пользователя будет своя собственная запись об авторе (ХОРОШО), и если вы сделаете что-нибудь разумное с id =, скажем, YYYYMMDD_REV, тогда все будет в порядке. Даже с git у большинства есть «центральное репо» для данного проекта. У 99% людей нет чего-то «центрального». Опять же, файлы Liquibase - это просто плановые текстовые файлы в формате XML со стеком команд, которые необходимо выполнить для данной БД (или набора). Скорее всего, 99% всех проектов будут иметь 0 проблем после этого на практике, даже с DVCS. - person zie; 30.03.2010
comment
+1 За это ответ. Это то, что мы используем в нескольких проектах. Идентификаторы должны быть уникальными только в одном XML-файле. Если вы назовете идентификаторы из реализуемого варианта использования, они будут достаточно уникальными. Вы должны быть осторожны, не изменяя уже примененные ревизии, иначе вы получите ошибки контрольной суммы. - person bernardn; 05.05.2013

Есть отличный проект под названием Migrations under Doctrine, созданный специально для этой цели.

Он все еще находится в альфа-состоянии и построен для php.

http://docs.doctrine-project.org/projects/doctrine-migrations/en/latest/index.html

person Hakan Deryal    schedule 25.02.2011
comment
опс! ваша ссылка не работает ... возможно, вы имеете в виду следующее: github.com/doctrine/migrations - person Francesco Casula; 31.08.2012
comment
здесь документы для пакета, который объединяет миграции доктрины в Symfony2: symfony.com/ doc / master / bundles / DoctrineMigrationsBundle / - person Francesco Casula; 31.08.2012
comment
Спасибо за подсказку, ребята из Doctrine имеют тенденцию изменять расположение документов, что приводит к появлению множества неработающих ссылок как здесь, так и в Google. Исправил ссылку. - person Hakan Deryal; 31.08.2012

Я столкнулся с этим вопросом, так как у меня есть аналогичная проблема, когда что-то приближенное к структуре каталогов на основе БД, хранит файлы, и мне нужен git для управления этим. Он распределен в облаке с использованием репликации, поэтому его точка доступа будет через MySQL.

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

Git - это система, которая по сути хранит базу данных дельт (различий), которую можно собрать заново, чтобы воспроизвести контекст. Обычное использование git предполагает, что контекст - это файловая система, а эти дельты - это различия в этой файловой системе, но на самом деле все git - это иерархическая база данных дельт (иерархическая, потому что в большинстве случаев каждая дельта представляет собой фиксацию как минимум с 1 родители, расположенные на дереве).

Теоретически, если вы можете сгенерировать дельту, git может ее сохранить. Проблема обычно в том, что git ожидает, что контекст, в котором он генерирует дельту, будет файловой системой, и аналогично, когда вы проверяете точку в иерархии git, он ожидает сгенерировать файловую систему.

Если вы хотите управлять изменениями в базе данных, у вас есть 2 отдельные проблемы, и я бы рассмотрел их отдельно (на вашем месте). Первый - это схема, второй - данные (хотя в вашем вопросе вы указываете, что данные вас не беспокоят). Проблема, с которой я сталкивался в прошлом, заключалась в базе данных Dev и Prod, где Dev мог вносить инкрементные изменения в схему, и эти изменения должны были быть задокументированы в CVS и распространяться вживую вместе с дополнениями к одному из нескольких «статических». таблицы. Мы сделали это с помощью третьей базы данных под названием Cruise, которая содержала только статические данные. В любой момент можно было сравнить схему из Dev и Cruise, и у нас был сценарий, который брал разницу этих двух файлов и создавал файл SQL, содержащий операторы ALTER, для его применения. Точно так же любые новые данные могут быть преобразованы в файл SQL, содержащий команды INSERT. Пока поля и таблицы только добавляются и никогда не удаляются, процесс может автоматизировать создание операторов SQL для применения дельты.

Механизм, с помощью которого git генерирует дельты, равен diff, а механизм, с помощью которого он объединяет одну или несколько дельт с файлом, называется merge. Если вы можете придумать метод сравнения и слияния из другого контекста, git должен работать, но, как уже говорилось, вы можете предпочесть инструмент, который сделает это за вас. Моя первая мысль о решении этой проблемы - это https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#External-Merge-and-Diff-Tools, в котором подробно описано, как заменить внутренний diff и инструмент слияния. Я обновлю этот ответ, поскольку придумываю лучшее решение проблемы, но в моем случае я ожидаю, что мне придется только управлять изменениями данных, поскольку хранилище файлов на основе БД может измениться, поэтому мое решение может быть не совсем то, что вам нужно.

person sibaz    schedule 07.03.2016

  • Irmin (ветвление + путешествие во времени)
  • Flur.ee (неизменяемый + путешествие во времени)
  • Crux DB (путешествия во времени)
  • TerminusDB (ветвление + путешествие во времени)
  • DoltDB (ветвление + путешествие во времени)

Некоторое время я искал ту же функцию для Postgres (или баз данных SQL в целом), но не нашел подходящих инструментов (простых и интуитивно понятных). Вероятно, это связано с двоичным характером хранения данных. Klonio звучит идеально, но выглядит мертвым. Noms DB выглядит интересно (и живо). Также ознакомьтесь с Irmin (на основе OCaml с Git-свойствами).

Хотя это не дает ответа на вопрос, что это будет работать с Postgres, проверьте базу данных Flur.ee. В нем есть функция путешествий во времени, которая позволяет запрашивать данные из произвольного момента времени. Я предполагаю, что он должен уметь работать с моделью ветвления.

Эта база данных недавно разрабатывалась для целей блокчейна. Из-за природы блокчейнов данные должны записываться с приращениями, и именно так работает git. Они нацелены на выпуск с открытым исходным кодом во втором квартале 2019 года.

Поскольку каждая база данных Fluree представляет собой цепочку блоков, в ней хранится вся история каждой выполненной транзакции. Это часть того, как блокчейн обеспечивает неизменность и безопасность информации.

Обновление. Также ознакомьтесь с базой данных Crux, которая может запрашивать временное измерение вставок, которые вы могли видеть как «версии». Crux, похоже, представляет собой реализацию высоко оцененного Datomic с открытым исходным кодом. Однако он не поддерживает ветвление, как Dolt и Git.

Crux - это битемпоральная база данных, в которой хранятся время транзакции и действительные временные истории. В то время как [одно] темпоральная база данных позволяет выполнять запросы в путешествиях во времени через транзакционную последовательность состояний базы данных от момента создания базы данных до ее текущего состояния, Crux также обеспечивает запросы путешествий во времени для дискретной действительной оси времени без излишней сложности проекта или влияния на производительность. Это означает, что пользователь Crux может заполнять базу данных прошлой и будущей информацией независимо от порядка, в котором эта информация поступает, и вносить исправления в прошлые записи, чтобы построить постоянно улучшающуюся временную модель данной области.

Обновление II. Ознакомьтесь с Terminus DB: документацией для TerminusDB - графической базы данных с открытым исходным кодом, в которой хранятся данные, подобные git. Он поддерживает ветвление, как Dolt и Git, но пока не выглядит очень зрелым.

Обновление III NomsDB был разветвлен и теперь используется в DoltDB: https://github.com/dolthub/dolt

person Tails    schedule 29.04.2019

Взгляните на RedGate SQL Source Control.

http://www.red-gate.com/products/sql-development/sql-source-control/

Этот инструмент представляет собой оснастку SQL Server Management Studio, которая позволит вам поместить вашу базу данных в систему управления версиями с помощью Git.

Это немного дороговато - 495 долларов за пользователя, но доступна 28-дневная бесплатная пробная версия.

ПРИМЕЧАНИЕ. Я никоим образом не связан с RedGate.

person CShark    schedule 22.05.2015

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

Я собираюсь следовать идеям, изложенным в этой публикации, из базы данных Владимира Хорикова передовой опыт управления версиями ". В общем, я буду

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

В случае, если это поможет!

person Ciges    schedule 11.10.2017

Вы не можете сделать это без атомарности, и вы не можете получить атомарность без использования pg_dump или файловой системы моментальных снимков.

Мой экземпляр postgres находится на zfs, и я время от времени снимаю его. Это примерно мгновенно и последовательно.

person Dustin    schedule 11.05.2009

По сути, вам нужно что-то вроде Post Facto, в котором версии базы данных хранятся в база данных. Проверьте эту презентацию.

Похоже, что этот проект никуда не делся, так что он, вероятно, не поможет вам сразу, но это интересная концепция. Я боюсь, что сделать это должным образом будет очень сложно, потому что даже в версии 1 нужно было бы уточнить все детали, чтобы люди доверяли ей свою работу.

person Peter Eisentraut    schedule 25.02.2011

Я выпустил инструмент для sqlite, который делает то, о чем вы просите. Он использует настраиваемый драйвер diff, использующий инструмент проектов sqlite sqldiff, UUID в качестве первичных ключей и исключает sqlite rowid. Он все еще находится в альфа-версии, поэтому обратная связь приветствуется.

Postgres и mysql сложнее, поскольку двоичные данные хранятся в нескольких файлах и могут даже быть недействительными, если вы смогли сделать их снимок.

https://github.com/cannadayr/git-sqlite

person cannadayr    schedule 09.07.2017
comment
Похоже, вы позволили git хранить двоичные данные как есть. Вместо этого можно использовать фильтры очистки / размазывания для хранения дампов. Для этого есть несколько скриптов. - person max630; 28.12.2017
comment
Достойный подход, за исключением случаев, когда вы сравниваете два состояния базы данных, вы выполняете текстовое сравнение дампа. Используя sqldiff в качестве настраиваемого драйвера сравнения, вы получаете фактические команды для преобразования вашей базы данных в следующее состояние. - person cannadayr; 30.12.2017
comment
Я хотел бы увидеть несколько примеров, прежде чем попробовать. Есть ли какой-нибудь учебник / демонстрация / демонстрация? - person Borhan Kazimipour; 21.09.2020
comment
посетите github.com/cannadayr/git-sqlite#usage-guide. если у вас есть еще вопросы, напишите мне (см. мой профиль на github). - person cannadayr; 21.09.2020

Я думаю, что X-Istence на правильном пути, но есть еще несколько улучшений, которые вы можете внести в эту стратегию. Сначала используйте:

$pg_dump --schema ... 

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

Затем выполните дамп данных для набора таблиц, которые содержат конфигурацию, необходимую для работы вашего приложения (вероятно, должны пропустить пользовательские данные и т. Д.), Например значения по умолчанию для формы и другие данные, не изменяемые пользователем. Вы можете сделать это выборочно, используя:

$pg_dump --table=.. <or> --exclude-table=..

Это хорошая идея, потому что репо может стать действительно неуклюжим, когда ваша база данных достигает 100 МБ + при выполнении полного дампа данных. Лучше всего создать резервную копию более минимального набора данных, необходимого для тестирования вашего приложения. Если ваши данные по умолчанию очень большие, это все равно может вызвать проблемы.

Если вам абсолютно необходимо разместить полные резервные копии в репо, подумайте о том, чтобы сделать это в ветке за пределами вашего исходного дерева. Однако для этого, вероятно, лучше всего подойдет внешняя система резервного копирования с некоторой ссылкой на соответствующий svn rev.

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

Наконец, прочтите документацию по резервному копированию postgres, если у вас нет т уже. То, как вы комментируете резервное копирование «базы данных», а не дампа, заставляет меня задаться вопросом, думаете ли вы о резервных копиях на основе файловой системы (см. Раздел 23.2 с предостережениями).

person Dana the Sane    schedule 11.05.2009
comment
разве дамп не резервная копия? - person hasen; 12.05.2009
comment
Да, но вы можете восстановить его в альтернативной базе данных и внести в нее изменения. - person Dana the Sane; 12.05.2009

На этот вопрос в значительной степени дан ответ, но я хотел бы дополнить ответ X-Istence и Dana the Sane небольшим предложением.

Если вам нужен контроль версий с некоторой степенью детализации, скажем, ежедневно, вы можете связать текстовый дамп таблиц и схемы с помощью такого инструмента, как rdiff-backup, который выполняет инкрементное резервное копирование. Преимущество состоит в том, что вместо хранения моментальных снимков ежедневных резервных копий вы просто сохраняете различия с предыдущим днем.

Благодаря этому у вас есть и преимущество контроля версий, и вы не тратите слишком много места.

В любом случае использование git непосредственно для больших плоских файлов, которые очень часто меняются, не является хорошим решением. Если ваша база данных станет слишком большой, у git начнутся проблемы с управлением файлами.

person unode    schedule 26.07.2010

Вот что я пытаюсь делать в своих проектах:

  • отдельные данные и схему и данные по умолчанию.

Конфигурация базы данных хранится в файле конфигурации, который не находится под контролем версий (.gitignore).

Параметры базы данных по умолчанию (для настройки новых проектов) представляют собой простой файл SQL с контролем версий.

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

Наиболее распространенный способ - иметь сценарии обновления, содержащие операторы SQL (ALTER Table .. или UPDATE). Вам также необходимо иметь место в вашей базе данных, где вы сохраняете текущую версию вашей схемы)

Взгляните на другие большие проекты баз данных с открытым исходным кодом (piwik или ваша любимая система cms), все они используют скрипты обновлений (1.sql, 2.sql, 3.sh, 4.php.5.sql)

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

Итак, теоретически (и это то, что я ищу) вы могли бы сбрасывать схему базы данных после каждого изменения (вручную, conjob, git hooks (возможно, до фиксации)) (и только в некоторых очень особых случаях создавать скрипты обновлений)

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

person key_    schedule 29.03.2012

Я бы порекомендовал neXtep для управления версиями базы данных, у него есть хороший набор документации и форумов, в которых объясняется, как для установки и обнаруженных ошибок. Я тестировал его для postgreSQL 9.1 и 9.3, мне удалось заставить его работать для 9.1, но для 9.3 он, похоже, не работает.

person Jerry M Sunny    schedule 03.03.2014
comment
@Nickolay Да вроде бы сняли с производства. В качестве альтернативы, почему вам не попробовать Skitch, вы найдете его здесь sqitch.org. - person Jerry M Sunny; 16.08.2018
comment
Спасибо, проверю! - person Nickolay; 16.08.2018

Что я делаю в своих личных проектах, так это то, что я сохраняю всю свою базу данных в dropbox, а затем указываю MAMP, рабочий процесс WAMP, чтобы использовать его прямо оттуда. Таким образом, база данных всегда актуальна, когда мне нужно что-то разработать. Но это только для разработчиков! Живые сайты, конечно же, используют для этого собственный сервер! :)

person Marko    schedule 13.05.2014

Сохранение каждого уровня изменений базы данных под контролем версий git аналогично отправке всей базы данных при каждой фиксации и восстановлению всей базы данных при каждом извлечении. Если ваша база данных так подвержена критическим изменениям и вы не можете позволить себе их потерять, вы можете просто обновить хуки pre_commit и post_merge. Я сделал то же самое с одним из моих проектов, и вы можете найти направления здесь.

person AkiShankar    schedule 22.05.2015

Вот как я это делаю:

Поскольку у вас есть свободный выбор типа БД, используйте файловую БД, например, жар-птица.

Создайте базу данных шаблонов со схемой, подходящей для вашей фактической ветки, и сохраните ее в своем репозитории.

При выполнении приложения программно создайте копию базы данных шаблона, сохраните ее в другом месте и просто работайте с этой копией.

Таким образом, вы можете поставить свою схему БД под контроль версий без данных. И если вы измените свою схему, вам просто нужно изменить базу данных шаблона

person RomCoo    schedule 16.05.2016

Раньше мы запускали социальный веб-сайт в стандартной конфигурации LAMP. У нас были живой сервер, тестовый сервер и сервер разработки, а также машины местных разработчиков. Все управлялись с помощью GIT.

На каждой машине у нас были файлы PHP, а также служба MySQL и папка с изображениями, которые пользователи загружали. Live-сервер вырос до 100К (!) Постоянных пользователей, дамп был около 2ГБ (!), Папка с изображениями была около 50ГБ (!). К тому времени, когда я ушел, наш сервер достиг предела своего ЦП, ОЗУ и, прежде всего, пределов одновременных сетевых подключений (мы даже скомпилировали нашу собственную версию драйвера сетевой карты, чтобы максимально использовать сервер 'lol'). Мы не могли (и вы не должны предполагать со своим веб-сайтом) разместить 2 ГБ данных и 50 ГБ изображений в GIT.

Чтобы легко управлять всем этим в GIT, мы бы проигнорировали двоичные папки (папки, содержащие изображения), вставив эти пути к папкам в .gitignore. У нас также была папка с именем SQL вне корневого пути документа Apache. В эту папку SQL мы будем помещать наши файлы SQL от разработчиков в инкрементальной нумерации (001.florianm.sql, 001.johns.sql, 002.florianm.sql и т. Д.). Эти файлы SQL также управлялись GIT. Первый файл sql действительно будет содержать большой набор схемы БД. Мы не добавляем пользовательские данные в GIT (например, записи таблицы пользователей или таблицы комментариев), но данные, такие как конфигурации или топология, или другие данные, специфичные для сайта, сохранялись в файлах sql (и, следовательно, в GIT). В основном это разработчики (которые лучше всего знают код), которые определяют, что и что не поддерживается GIT в отношении схемы и данных SQL.

Когда дело доходит до выпуска, администратор входит на сервер разработчика, объединяет живую ветку со всеми разработчиками и необходимые ветки на машине разработчика в ветку обновления и отправляет ее на тестовый сервер. На тестовом сервере он проверяет, действует ли процесс обновления для Live-сервера, и в быстрой последовательности направляет весь трафик в Apache на сайт-заполнитель, создает дамп БД, указывает рабочий каталог с «live» на «update». ', выполняет все новые файлы sql в mysql и перенаправляет трафик обратно на правильный сайт. Когда все заинтересованные стороны согласились после просмотра тестового сервера, администратор проделал то же самое с тестового сервера на рабочий сервер. После этого он объединяет живую ветвь на производственном сервере с главной веткой на всех серверах и перебазирует все живые ветки. Разработчики сами отвечали за перебазирование своих веток, но в целом они знают, что делают.

Если на тестовом сервере возникли проблемы, например. при слиянии было слишком много конфликтов, затем код был возвращен (указав рабочую ветвь обратно на «live»), и файлы sql никогда не выполнялись. В момент выполнения файлов sql это считалось необратимым действием. Если файлы SQL не работали должным образом, то БД восстанавливалась с помощью дампа (и разработчики отругали его за предоставление плохо проверенных файлов SQL).

Сегодня мы поддерживаем папки sql-up и sql-down с эквивалентными именами файлов, где разработчики должны проверить, что оба обновляемых файла sql могут быть в равной степени понижены. В конечном итоге это может быть выполнено с помощью сценария bash, но было бы неплохо, если бы человеческий глаз продолжал следить за процессом обновления.

Это не здорово, но управляемо. Надеюсь, это даст представление о реальном, практичном и относительно высокодоступном сайте. Пусть это немного устарело, но все же последовало.

person Florian Mertens    schedule 07.06.2017

Я говорю, нет. Данные могут измениться в любой момент. Вместо этого вы должны фиксировать только модели данных в своем коде, определениях схемы и таблиц (операторы create database и create table) и образцы данных для модульных тестов. Это своего рода способ, которым Laravel делает это, совершая миграции и начальные данные базы данных.

person OzzyTheGiant    schedule 25.06.2020

Используйте такой инструмент, как iBatis Migrations (руководство, короткое обучающее видео), которое позволяет управлять версиями изменений, которые вы вносите в базу данных на протяжении всего жизненного цикла проекта, а не в самой базе данных.

Это позволяет выборочно применять отдельные изменения к разным средам, вести журнал изменений, в котором указаны изменения в каких средах, создавать сценарии для применения изменений от A до N, откатывать изменения и т. Д.

person matt b    schedule 11.08.2010

Я хотел бы поставить всю базу данных под контроль версий, какой механизм базы данных я могу использовать, чтобы я мог поставить под контроль версий фактическую базу данных вместо ее дампа?

Это не зависит от ядра базы данных. В Microsoft SQL Server существует множество программ контроля версий. Я не думаю, что эту проблему можно решить с помощью git, вам нужно использовать систему управления версиями схемы, специфичную для pgsql. Не знаю, существует такая штука или нет ...

person inf3rno    schedule 09.02.2012
comment
Вам действительно стоит взглянуть на klonio, который специально разработан для управления версиями баз данных (в настоящее время поддерживает Mongo и MySQL). Все еще находится в стадии бета-тестирования, но выглядит многообещающим. - person farthVader; 25.01.2015

Обновление от 26 августа 2019 г .:

Netlify CMS делает это с помощью GitHub, здесь можно найти пример реализации со всей информацией о том, как они реализовали его netlify-cms-backend-github

person Ceddy Muhoza    schedule 26.08.2019