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


274

Я роблю веб-додаток, і мені потрібно зробити гілку для деяких великих змін. Справа в тому, що ці зміни потребують змін у схемі бази даних, тому я також хотів би поставити всю базу даних під git.

Як це зробити? чи є певна папка, яку я можу зберігати під сховищем git? Як я можу знати, який з них? Як я можу бути впевнений, що я вкладаю потрібну папку?

Мені потрібно бути впевненим, оскільки ці зміни не є сумісними назад; Я не можу дозволити собі накрутити.

База даних у моєму випадку - PostgreSQL

Редагувати:

Хтось запропонував зробити резервні копії та поставити файл резервної копії під контроль версій замість бази даних. Якщо чесно, мені таке важко ковтати.

Має бути кращий спосіб.

Оновлення:

Гаразд, так що немає кращого способу, але я все ще не зовсім переконаний, тому я трохи зміню питання:

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

Чи буде sqlite зручним для git?

Оскільки це лише середовище розробки, я можу вибрати будь-яку базу даних.

Edit2:

Мені дуже хочеться не відслідковувати мою історію розвитку, а мати можливість переходити з моєї гілки "нових радикальних змін" на "поточну стабільну гілку" і мати можливість, наприклад, виправляти деякі помилки / проблеми тощо за допомогою поточного стабільна галузь. Такий, що коли я перемикаю гілки, база даних автоматично магічно стає сумісною з гілкою, на якій я зараз перебуваю. Мені не дуже важливо фактичних даних.


5
Якщо чесно, я просто роблю копії бази даних, якщо я ввожу зміни в схемі і доводиться одночасно працювати з декількома гілками розвитку ... Бази даних розробників повинні, мабуть, бути досить маленькими для цього. Я б розглядав будь-яку систему, яка намагалася бути розумною і вносити зміни в БД тільки тому, що я змінила гілку джерела з підозрою. І я також хотів би бути впевненим, що продовжувати працювати, якщо я просто клонував свою робочу область і мав одну гілку в одному місці, а іншу в новій.
araqnid


Якщо ви вважаєте, що скрипт (та його компоненти) викликають в вашу базу даних артефакт, що знаходиться під контролем версій, то "резервне копіювання" може не здаватися такою поганою справою. Якщо ви змінили схему db в радикальній гілці, вам потрібно оновити скрипт, який вкладає в базу даних дані.
Фурманатор

1
Отримайте мою відповідь на програмне забезпечення, яке працює саме так: stackoverflow.com/a/28123546/1662984
Кевін

Відповіді:


140

Натомість візьміть дамп бази даних та керуйте версіями. Таким чином це плоский текстовий файл.

Особисто я пропоную вам зберігати як дамп даних, так і дамп схеми. Таким чином, використовуючи diff, стає досить легко побачити, що змінилося в схемі від перегляду до редакції.

Якщо ви робите великі зміни, у вас повинна бути вторинна база даних, в яку ви вносите зміни в нову схему, а не торкаєтесь старої, оскільки, як ви сказали, ви робите гілку.


132
Що? Треба бути кращим способом.
hasen

18
Файли баз даних PostGreSQL - це бінарні файли, сміливо поміщайте їх у своє сховище git, ви просто не зможете робити жодних розбіжностей на них, і будь-які зміни, швидше за все, змінять усю базу даних, і тепер вам доведеться надсилати повну базу даних по дроту до вашого git repo та зберігайте його. Це неефективно, повільно і робить надзвичайно важкою роботу. Крім того, я не впевнений, що файли баз даних, що зберігаються на диску без VACUUM і вимикають PostgreSQL, щоб зробити копію, є "стабільними", оскільки всі дані завжди правильні, тим самим можливо залишаючи вас зіпсованими даними.
X-Istence

6
Хм, я бачу! Ну, чи є системи db, більш зручні для git?
hasen

16
Цей тип рішення досить стандартний, а схема - це фактично вихідний код.
Дана Здорова

12
це 2017 рік, будь-які оновлення з цього питання? чи немає насправді контролю версії БД поза коробкою? справді?
Ставм

48

Ознайомтеся з базами даних Refactoring ( http://databaserefactoring.com/ ), щоб отримати купу хороших методик для підтримки вашої бази даних у тандемі зі змінами коду.

Досить сказати, що ви задаєте неправильні запитання. Замість того, щоб ставити базу даних в git, вам слід розкласти свої зміни на невеликі перевірені кроки, щоб ви могли легко мігрувати / відмовляти зміни схеми.

Якщо ви хочете отримати повну відновлюваність, вам слід розглянути питання архівації ваших журналів WAL postgres та використати PITR (відновлення моменту часу) для відтворення транзакцій назад / переадресації до конкретних відомих хороших станів.


2
Я не знайшов релевантної інформації на сайті datarefactoring ... Здається, перераховані різні методи рефакторингу для коду БД (як Фоулер робив для звичайного коду)
Ніколай,

26

Я починаю думати про дуже просте рішення, не знаю, чому я не думав про це раніше !!

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

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

Редагувати:

Під дублікатами я маю на увазі створення іншої бази даних з іншим ім’ям (як my_db_2); не роблячи сміття чи нічого подібного.


3
Це здається найпростішим та найефективнішим рішенням, але було б непогано, якби був якийсь спосіб автоматизувати це ... Я здивований, що там ще щось немає ...
JustMaier

git гак, щоб створити базу даних із шаблону на основі назви гілки,
dalore

Це те, що я роблю, я також додаю контрольну лінію IP до файлу включення змінних БД, так що якщо я випадково завантажую файл "неправильної" гілки на живий сервер, нічого не порушується.
liamvictor

так що майже кожна гілка отримує свій власний БД, так? 🤔
Оллі

19

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


3
Найкращі практики Liguibase рекомендують зберігати сценарії створення схем як набір послідовних сценаріїв, які слід проводити в порядку. Хоча це найкраща найкраща практика, я не бачу, як це працювало б без центрального сховища, яке є un-GIT.
Френк Швітерман

1
Що ж, це буде добре, якщо ви будете уважні до своїх тегів id = та author =. Теоретично, кожен користувач матиме власний авторський запис (ДОБРИЙ), і якщо ви зробите щось розумне з id =, скажімо, YYYYMMDD_REV, то вам дуже добре піти. Навіть з git, у більшості всіх є "центральний репо" для даного проекту. 99% людей не мають чогось "центрального". Знову ж таки, файли Liquibase - це просто планувати текстові файли XML-іш, зі стеком команд, які потрібно виконати проти заданої БД (або набору). Швидше за все, що 99% усіх проектів матимуть 0 питань, що слідкують за цим на практиці, навіть із DVCS.
zie

+1 Для цієї відповіді. Це те, що ми використовуємо в кількох проектах. Ідентифікатори повинні бути унікальними лише в одному XML-файлі. Якщо ви називаєте ідентифікатори із використовуваного випадку використання, вони достатньо унікальні. Ви повинні бути обережними, не змінюючи вже застосовані набори змін, інакше ви отримаєте помилки контрольної суми.
bernardn

7

Зіштовхнувшись із подібною потребою, ось ось що моє дослідження систем контролю версій бази даних:

  1. Sqitch - відкритий код на основі perl; доступний для всіх основних баз даних, включаючи PostgreSQL https://github.com/sqitchers/sqitch
  2. Mahout - лише для PostgreSQL; керування версіями схеми бази даних з відкритим кодом. https://github.com/cbbrowne/mahout
  3. Liquibase - ще одне відкрите джерело керування версіями db sw. безкоштовна версія Datical. http://www.liquibase.org/index.html
  4. Datical - комерційна версія Liquibase - https://www.datical.com/
  5. Flyway від BoxFuse - комерційний sw. https://flywaydb.org/
  6. Інший проект з відкритим кодом https://gitlab.com/depesz/Versioning Автор надає посібник тут: https://www.depesz.com/2010/08/22/versioning/
  7. Автоматизація змін червоних воріт - лише для SQL Server. https://www.red-gate.com/products/sql-development/sql-change-automation/

У минулому також щось називали ChronicDB: ChronicDB provides dynamic database upgrades with zero database downtime and inconsistencies. crunchbase.com/organization/chronicdb#section-overview Хлопець на ім’я Крістіс Макрис був одним із засновників, можливо, відомим SCMBug: mkgnu.net/scmbug
Thorsten

6

Існує чудовий проект під назвою «Міграції в рамках доктрини», який був побудований саме для цієї мети.

Його досі в альфа-стані та створено для php.

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


ops! ваше посилання порушено ... можливо, ви маєте на увазі це: github.com/doctrine/migrations
Франческо

ось документи для пакета, що інтегрує міграцію доктрини в Symfony2
Франческо

1
Дякуємо за підказку, хлопці з доктрини мають тенденцію змінювати місце розташування документів, внаслідок чого багато непрацюючих посилань, як тут, так і в Google. Виправлено посилання.
Хакан Деріал

4

Я зіткнувся з цим питанням, оскільки у мене є подібна проблема, де щось, що наближає структуру каталогу, заснованої на БД, зберігає "файли", і мені потрібно git, щоб керувати ним. Він розповсюджується в хмарі за допомогою реплікації, отже, його точка доступу буде здійснюватися через MySQL.

Суть вищезазначених відповідей, схоже, пропонує також альтернативне рішення заданої проблеми, яка не вникає в суті, використання Git для управління чимось у базі даних, тому я спробую відповісти на це питання.

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

Поки ви можете створити дельту, теоретично git може її зберігати. Зазвичай проблема полягає в тому, що git очікує, що контекст, в якому він генерує дельту, є файловою системою, і аналогічно, коли ви перевіряєте точку в ієрархії git, вона очікує створення файлової системи.

Якщо ви хочете керувати змінами, у вашій базі даних є дві дискретні проблеми, і я би вирішував їх окремо (якби я був на вашій увазі). Перше - це схема, друге - дані (хоча у вашому запитанні ви заявляєте дані - це не те, що вас хвилює). Проблемою, яка була в мене раніше, була база даних Dev and Prod, де Dev міг робити додаткові зміни в схемі, і ці зміни повинні бути задокументовані в CVS та запропоновані до проживання разом із доповненнями до одного з кількох "статичних" столи. Ми зробили це, маючи 3-ту базу даних під назвою Cruise, яка містила лише статичні дані. У будь-який момент можна порівняти схему від Dev і Cruise, і у нас був сценарій, щоб взяти diff цих 2 файлів і створити файл SQL, що містить ALTER заяви, щоб застосувати його. Аналогічно будь-які нові дані, можна перегнати у файл SQL, що містить команди INSERT. Поки поля та таблиці тільки додаються і ніколи не видаляються, процес може автоматизувати генерацію операторів SQL для застосування дельти.

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


3

Погляньте на RedGate SQL Source Control.

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

Цей інструмент являє собою оснащення програми SQL Server Management Studio, яка дозволить вам розмістити свою базу даних під управлінням Source та Git.

Це трохи дорого - 495 доларів за кожного користувача, але є 28-денна безкоштовна пробна версія.

ПРИМІТКА. Я жодним чином не пов'язаний з RedGate.


3

Я хочу зробити щось подібне, додати зміни в базу даних до моєї системи контролю версій.

Я буду дотримуватися ідей у ​​цьому дописі від Володимира Хорікова "Найкращі практики версій бази даних" . Підсумовуючи, я буду

  • зберігати як його схему, так і довідкові дані в системі управління джерелом.
  • для кожної модифікації ми створимо окремий скрипт SQL із змінами

У випадку, якщо це допоможе!


3
  • Ірмін
  • Flur.ee
  • Crux DB

Я деякий час шукав ту саму функцію для Postgres (або взагалі баз даних SQL), але не знайшов інструментів, які були б достатньо підходящими (простими та інтуїтивно зрозумілими). Ймовірно, це пов'язано з бінарним характером того, як зберігаються дані. Клоніо звучить ідеально, але виглядає мертвим. Noms DB виглядає цікаво ( і живим ). Також погляньте на Irmin (на базі OCaml з властивостями Git).

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

Ця база даних нещодавно розроблялася для цілей blockchain. Зважаючи на характер блокчейнів, дані потрібно записувати з кроком, саме так працює git. Вони націлені на випуск з відкритим кодом у другому кварталі 2019 року .

Оскільки кожна база даних Fluree - це блокчейн, вона зберігає всю історію кожної здійсненої транзакції. Це частина того, як блокчейн забезпечує незмінність та безпеку інформації .

Оновлення : також перегляньте базу даних Crux , яка може запитувати через часовий вимір вставок, який ви можете бачити як "версії". Crux, здається, є реалізацією з відкритим кодом високо оціненої Datomic.

Crux - це бітмопоральна база даних, яка зберігає час транзакцій та дійсні історії часу. У той час як тимчасова база даних [uni] дозволяє запитувати "подорож у часі" через транзакційну послідовність станів бази даних з моменту створення бази даних до її поточного стану, Crux також забезпечує запит "подорожі в часі" для дискретної дійсної осі часу без зайвої складності проектування або ефективність. Це означає, що користувач Crux може заповнювати базу даних минулою та майбутньою інформацією незалежно від порядку, в якому інформація надходить, і вносити виправлення в минулі записи для побудови постійно вдосконалюваної часової моделі даного домену.


2

Ви не можете зробити це без атомності, і ви не можете отримати атомність, не використовуючи ні pg_dump, ні файлову систему.

Мій екземпляр постгресів знаходиться на zfs, який я час від часу знімаю. Це приблизно миттєво і послідовно.


2

Те, що ви хочете, за духом, можливо, щось на зразок Post Facto , який зберігає версії бази даних у базі даних. Перевірте цю презентацію .

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


2

Я випустив інструмент для sqlite, який робить те, що ви просите. Він використовує спеціальний драйвер diff, використовуючи інструмент sqlite проектів 'sqldiff', UUID в якості первинних ключів, і не залишає sqlite rowid. Він все ще знаходиться в альфа, тому відгуки високо оцінені.

Postgres і mysql складніші, оскільки двійкові дані зберігаються в декількох файлах і навіть не можуть бути дійсними, якщо вам вдалося зробити знімок.

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


Здається, ви дозволяєте git зберігати бінарні дані як є. Натомість можна використовувати фільтри «чисті / розмиті» для зберігання сміттєзвалищ. Є деякі сценарії, які це роблять.
max630

1
Гідний підхід, за винятком випадків, коли ви відрізняєте два стани бази даних, ви виконуєте текстовий розбір дампа. Використовуючи sqldiff як спеціальний драйвер diff, ви отримуєте фактичні команди мутувати базу даних до наступного стану.
candaydayr

1

Я думаю, що X-Istence на правильному шляху, але є ще кілька вдосконалень, які ви можете внести до цієї стратегії. Спочатку скористайтеся:

$pg_dump --schema ... 

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

Далі виконайте дамп даних для набору таблиць, що містять конфігурацію, необхідну для роботи вашої програми (можливо, слід пропустити дані користувачів тощо), наприклад, за замовчуванням форми та іншими даними, які не змінюються користувачем. Це можна зробити вибірково, використовуючи:

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

Це гарна ідея, оскільки репо може отримати справді незграбний результат, коли ваша база даних досягне 100 Мбіт + при виконанні повного дампа даних. Краща ідея - створити резервну копію більш мінімального набору даних, необхідних для тестування програми. Якщо ваші дані за замовчуванням дуже великі, однак це все ж може спричинити проблеми.

Якщо вам абсолютно потрібно розмістити повні резервні копії в репо, подумайте про це у гілці поза вашим вихідним деревом. Імовірно, найкраща для цього зовнішня система резервного копіювання, яка має посилання на відповідний svn rev.

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

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


це не сміття лише резервне копіювання?
hasen

Так, але ви можете відновити його в альтернативній базі даних та внести свої зміни в неї.
Dana Sane

1

На це питання досить відповіли, але я хотів би доповнити відповідь X-Istence і Дани Сане невеликою пропозицією.

Якщо вам потрібен контроль редагування з певним ступенем деталізації, скажімо, щодня, ви можете з’єднати текстовий дамп як таблиць, так і схеми з таким інструментом, як rdiff-backup, який робить додаткові резервні копії. Перевага полягає в тому, що замість того, щоб зберігати знімки щоденних резервних копій, ви просто зберігаєте відмінності від попереднього дня.

Завдяки цьому ви маєте як перевагу контролю за версією, так і не витрачаєте занадто багато місця.

У будь-якому випадку, використання git безпосередньо на великих плоских файлах, які дуже часто змінюються, не є хорошим рішенням. Якщо ваша база даних стане занадто великою, у Git почнуть виникати деякі проблеми з управлінням файлами.


1

Ось що я намагаюся зробити у своїх проектах:

  • окремі дані та схеми та дані за замовчуванням.

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

За замовчуванням у базі даних (для налаштування нових проектів) - це простий файл SQL під контролем версій.

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

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

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

Але це дуже трудомістка робота, вам потрібно створити та протестувати сценарії оновлення, і вам потрібно запустити загальний сценарій оновлення, який порівнює версію та виконувати всі необхідні сценарії оновлення.

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

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


1

Я рекомендую neXtep для версії, що контролює базу даних, вона має гарний набір документації та форумів, що пояснює, як встановити та виникли помилки. Я перевірив його на postgreSQL 9.1 і 9.3, мені вдалося змусити його працювати для 9.1, але для 9.3 він, здається, не працює.


@Nickolay Так, здається, його припинили. Як альтернативу, чому б не спробувати Skitch, ви знайдете його тут sqitch.org
Джеррі М Сонячний

Дякую, перевіримо це!
Миколай

1

Що я роблю в своїх особистих проектах, це те, що я зберігаю всю свою базу даних у папці "вікна", а потім вказую на MAMP, WAMP робочий процес, щоб використовувати її прямо звідти. Таким чином, база даних завжди оновлюється там, де коли-небудь мені потрібно зробити якісь розробки. Але це тільки для дев! Живі сайти використовують власний сервер для цього поза курсом! :)


1

Зберігання кожного рівня змін у базі даних під контролем версії git - це як виштовхування всієї бази даних з кожним фіксацією та відновлення всієї бази даних з кожним потягненням. Якщо ваша база даних настільки схильна до кардинальних змін, і ви не можете дозволити їх втратити, ви можете просто оновити свої гачки pre_commit та post_merge . Я зробив те саме з одним зі своїх проектів, і ви можете знайти тут вказівки .


1

Ось як я це роблю:

Оскільки у вас є вибір на вибір типу БД, використовуйте базу даних на базі файлів, наприклад, firebird.

Створіть БД шаблону, яка має схему, що відповідає вашій фактичній гілці, і збережіть її у вашому сховищі.

Під час виконання вашої програми програмно створіть копію БД шаблону, зберігайте її десь в іншому місці та просто працюйте з цією копією.

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


1

Ми використовували соціальний веб-сайт за стандартною конфігурацією LAMP. У нас був сервер Live, тестовий сервер та сервер розвитку, а також місцеві машини розробників. Усі були керовані за допомогою GIT.

На кожній машині у нас були файли PHP, але також служба MySQL та папка із зображеннями, які користувачі завантажуватимуть. На Live сервері виросло близько 100 К (!) Періодичних користувачів, дамп - близько 2 ГБ (!), Папка "Зображення" - приблизно 50 ГБ (!). На той момент, коли я пішов, наш сервер досягав межі свого CPU, Ram, і, головне, одночасних лімітів мережевого підключення (Ми навіть склали власну версію драйвера мережевої карти, щоб максимально перевищити «lol» сервера). Ми не могли ( і не варто вважати, що на вашому веб-сайті ) розміщувати 2 ГБ даних і 50 ГБ зображень у GIT.

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

Коли він дійшов до випуску, адміністратор заходить у сервер розробок, з’єднує живу гілку з усіма розробниками та потрібними гілками на машині розробки з гілкою оновлення та переміщує її на тестовий сервер. На тестовому сервері він перевіряє, чи є процес оновлення для Live-сервера все-таки дійсним, і швидко поспіль вказує весь трафік Apache на сайт-заповнювач, створює дамп БД, вказує робочий каталог з "живого" на "оновлення" ', виконує всі нові sql файли в mysql і повертає трафік назад на правильний сайт. Коли всі зацікавлені сторони погодились після перегляду тестового сервера, адміністратор зробив те саме, що і від тестового сервера до сервера Live. Після цього він об'єднує живу гілку на виробничому сервері, до ведучої гілки через усі сервери та перезавантажує всі живі гілки.

Якщо на тестовому сервері виникли проблеми, наприклад. у злиттях було занадто багато конфліктів, тоді код було повернено (вказуючи робочу гілку назад на "живе"), а файли sql ніколи не виконувалися. У той момент, коли були виконані файли sql, це було розцінено як незворотну дію. Якщо файли SQL не працювали належним чином, то БД було відновлено за допомогою дампа (і розробники сказали, що надавали неправильно перевірені файли SQL).

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

Це не велико, але керовано. Сподіваюсь, це дає уявлення про реальний, практичний, відносно великий доступний сайт. Нехай це трохи застаріло, але все-таки слідувало.


0

Використовуйте такий інструмент, як iBatis Migrations ( посібник , коротке відео-підручник ), який дозволяє контролювати версії змін, які ви вносите в базу даних протягом життєвого циклу проекту, а не саму базу даних.

Це дозволяє вибірково застосовувати окремі зміни до різних середовищ, зберігати журнал змін, в яких змінах, в яких середовищах, створювати сценарії для застосування змін від A до N, зміни відката тощо.


0

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

Це не залежить від двигуна бази даних. У Microsoft SQL Server існує безліч програм для контролю версій. Я не думаю, що цю проблему можна вирішити за допомогою git, вам доведеться використовувати систему управління версіями для певної системи pgsql. Я не знаю, існує така річ чи ні ...


2
Ви дійсно повинні ознайомитись з klonio , який створений для баз даних версій (наразі підтримує Mongo та MySQL). Ще в бета-версії, але здається досить перспективним.
farthVader

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.