Чи є резервна копія бази даних MySQL в Git?


57

Я намагаюся покращити ситуацію резервного копіювання для свого додатка. У мене є програма Django та база даних MySQL. Я прочитав статтю, в якій пропонується створити резервну копію бази даних в Git.

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

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

(Дамп-файл на даний момент 100 Мб нестиснений, 5,7 МБ при бізуванні.)

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


13
Якщо у вашої компанії є відділ інформаційних технологій (ops), вони повинні цим займатися.
Майкл Хемптон

1
це частина даних програми або що створюється через додаток?
Вінстон Еверт

1
Git намагатиметься відрізняти всі файли під час запуску git gc(або він лежить в основі git repack; git, за налаштованим за замовчуванням, періодично запускається автоматично). Це також завжди буде виснажувати їх , тому може бути насправді краще зберігати їх нестисненими.
Ян Худек

1
Що це за база даних: це виробництво чи розробка?
el.pescado

6
viget.com/extend/backup-your-database-in-git , він "старший розробник".
wobbily_col

Відповіді:


101

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

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

Ось деякі проблеми, які я можу передбачити, намагаючись створити резервну копію вашої бази даних в git:

  • Сховище різко зросте з кожною "резервною копією". Оскільки git зберігає цілі об'єкти (хоч і стиснуті), а потім розрізняє їх пізніше (наприклад, під час запуску git gc) і зберігає історію назавжди , у вас буде дуже великий обсяг даних, які вам насправді не потрібні або навіть не потрібні. Можливо, вам знадобиться обмежити кількість або тривалість зберігання резервних копій, які ви робите для економії місця на диску або з юридичних причин, але важко видалити старі версії з git repo без великих пошкоджень.
  • Відновлення обмежене моментом часу, який ви зберегли у сховищі, і оскільки дані настільки великі, повернення більше тривіального часу може бути повільним. Система резервного копіювання, розроблена для цієї мети, обмежує кількість даних, що зберігаються, потенційно надаючи більш детальну деталізацію, та забезпечує швидше відновлення, скорочуючи час простою у випадку катастрофи. Рішення щодо резервного копіювання даних ( приклад ), що знають базу даних, також можуть забезпечувати постійне резервне копіювання, гарантуючи, що не буде втрачена жодна транзакція.
  • Коміти, ймовірно, також будуть повільними та повільнішими у міру зростання бази даних. Пам'ятайте, що git - це, по суті, сховище даних ключових значень, відображене на файлову систему , і, таким чином, підпорядковується характеристикам продуктивності базової файлової системи. За цей проміжок часу можливо в кінцевому підсумку перевищити інтервал резервного копіювання, і в цей момент ви більше не зможете відповідати вашій угоді за угодою. Правильні системи резервного копіювання також потребують більшого часу для резервного копіювання в міру зростання даних, але не настільки різко, оскільки вони автоматично керуватимуть власним розміром на основі налаштованої вами політики збереження.

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


Це найкраща відповідь, оскільки Майкл висвітлював питання послідовності. Залежно від розміру та використання бази даних, знімок не може надійно відтворити дані в даний момент часу, і ви, ймовірно, зіткнетеся з проблемами обмеження. Реплікація може бути те, що ви хочете заглянути - dev.mysql.com/doc/refman/5.0/uk/replication.html
Аарон Ньютон,

4
Це не просто найкраща відповідь, це єдина відповідь. Як правило, ви розробник, тому резервне копіювання не є вашою справою; хтось ще (або повинен бути) вже доглядає за ними, і якщо ви почнете залучатись, ви можете заважати системі, яка вже працює. Ці поля вже повинні бути резервні, тому ви матимете резервну копію, свою власну резервну копію та резервну копію вашої власної резервної копії, і все це має все більший розмір. Це просто горіхи. Плюс: ви розробник: чому ви (напевно) все-таки підходите до виробничих коробок?
Максим Мінімус

2
@JimmyShelter Існує школа думки, що DevOps означає не те, що Dev і Ops тісно працюють разом, а те, що Dev насправді робить Ops. Зазвичай це не працює добре, але це не заважає людям намагатися.
Майкл Хемптон

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

Дозвольте зазначити, що я опублікував свою відповідь, припускаючи, що в ОП немає жодної операційної групи, яка би могла вирішити цю проблему. Я погоджуюсь з вами, що подібне завдання найкраще залишити тим, хто насправді керує системою, і знає їхній шлях. Але бувають ситуації, коли ви повинні надіти шапку, яка не є саме вашою, і я вважаю, що в цій ситуації краще спробувати засвоїти деякі найкращі практики, ніж просто придумати власне надумане рішення. Треба сказати, що я також визнав вашу відповідь дуже повчальною!
logc

39

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

Дозвольте припустити, що головна причина, чому ви думаєте про це, - це "зберігати копію даних та коду синхронно", і це означає, що ви переживаєте, що версія 2.0 вашого коду потребує іншої схеми бази даних, ніж версія 1.0 . Більш простим рішенням було б зберігання схеми бази даних як набору SQL-скриптів із CREATEзаявами вздовж вихідного коду у вашому репозиторії Git. Тоді частиною вашої процедури встановлення буде виконання цих скриптів на раніше встановленому сервері баз даних.

Фактичний вміст цих просто CREATE-d таблиць не має нічого спільного з версією вашого вихідного коду. Уявіть, що ви встановлюєте програмне забезпечення версії 1.0 на сервер A і на сервер B, які використовуються в різних компаніях різними командами. Через декілька тижнів зміст таблиць буде дуже різним, навіть якщо схеми точно однакові.

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

Редагувати :

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

mysqldumpЧастина звуку, так як це один із способів резервного копіювання , перерахованих в документації в MySQL. Частина GIT - це те, де автор не помічає, що сервери баз даних зберігають журнал транзакцій для відновлення після збоїв, включаючи MySQL . За допомогою цього журналу , а не GIT, ви повинні створювати додаткові резервні копії для вашої бази даних. Це, перш за все, перевага в тому, що ви можете обертати або змивати журнали після відновлення, замість того, щоб розвантажувати сховище GIT у нескінченність і далі ...


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

10
Сенс зберігання схеми без даних полягає в тому, що відразу після встановлення ваше програмне забезпечення має бути «готовим до використання». Якщо це вікі, то слід бути готовим розпочати створення вікі-сторінок і щось написати на них. Якщо ви встановите схему та вміст, то ваша wiki вже заповнена сторінками X wiki після встановлення ... Це не зовсім "встановлення вікі-системи для запису нашого вмісту", а "копіювання вікі звідкись для її читання" .
logc

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

2
@wobbily_col Нетекстовий бінарний формат має обмежене значення в контексті управління джерелами. Ви не можете розрізнити його, ви не можете розгалужувати / об'єднувати його і т. Д. Отже, хоча ви, звичайно, можете використовувати git для зберігання БД, більшість людей вважають за краще сценарій структури БД, а також необхідних даних. Це компроміс між трішки більшою роботою, але наданням наведеного вище переліку функцій. Вам доведеться зважити, чи це хороша ідея для вашого рішення. Інакше, можливо, ви можете отримати GIT безпосередньо для зберігання БД, це просто не найкраще підходить для виконання завдання.
Даніель Б

3
@RaduMurzea: Я думаю, це питання принципів. Система управління версіями призначена для управління вихідним кодом, а не бінарними файлами, ось і все. Це не питання розміру. Ні, скидання баз даних не повинні бути зареєстровані у сховищі, як і навчальні відеозаписи, не слід перевіряти ні в одному. Але вас ніхто не заважає робити це. :)
logc

7

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

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

Моє остаточне зауваження щодо резервного копіювання бази даних та GIT: Адміністратору бази даних, коли йому потрібно відновити базу даних, оскільки деякі дані були втрачені, не потрібно перевіряти відмінності між файлом резервного копіювання за 1 день та файлом резервного копіювання на 2 день, йому потрібно просто знати, що саме останній файл резервної копії, який дозволить йому відновити базу даних, без будь-яких помилок і втрати даних, скорочуючи час простою. Дійсно, завдання адміністратора бази даних - зробити доступними для відновлення дані якомога швидше, коли система з якихось причин виходить з ладу. Якщо ви зберігаєте резервні копії бази даних у GIT, пов’язані з вашими комісіями, ви не дозволяєте адміністратору бази даних швидко відновити дані, оскільки ваші резервні копії обмежені часом, який ви зберігаєте у сховищі GIT, та скорочуєте час простою. системи,

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


Можливо, супровідник пояснить, чому він / вона порушив голову ..
Альберто Солано

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

@DanielB Я пропоную не використовувати систему управління версіями для зберігання файлів резервного копіювання бази даних. Я думаю, що проблема резервного копіювання бази даних може бути легко вирішена без використання будь-якої системи контролю версій. Системи управління версіями (GIT, TFS, SVN тощо) розроблені для програмного забезпечення, а не для скидання файлів або резервного копіювання бази даних або просто для зберігання даних (для цього існує маса рішень).
Альберто Солано

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

1
@AlbertoSolano я бачу; але читаючи питання ("чи можу я створити резервну копію моєї БД в GIT?"), а потім ваше перше твердження ("добре зберігати файл резервної копії ..."), схоже, ви говорите навпаки. Інша відповідь, здається, говорить, що це ні тут, ні там, хоча я підозрюю, що більшість людей думають, що це аварія поїзда, яка чекає цього.
Даніель Б

1

Не слід зберігати двійкові дані в Git - особливо в базі даних.
Зміни коду та зміни DML бази даних - це абсолютно різні речі.

MySQL та Oracle можуть записувати журнали архівів з метою відновлення до будь-якого моменту часу. Просто створіть резервні копії цих журналів кудись у безпечному місці, і вам буде добре.

Використовувати Git для резервного копіювання цих "архівів журналів" не має сенсу. Журнали архівів у виробничих умовах досить важкі і їх слід видаляти після регулярних повних резервних копій. Крім того, марно їх класти в git - вони вже є сховищем у певному сенсі.


1
чому б не використовувати Git для резервного копіювання цих "архівів журналів", створених MySQL?
гнат

1
Просто тому, що це не має сенсу. Журнали архівів у виробничих умовах досить важкі і їх слід видаляти після регулярних повних резервних копій. Крім того, марно їх класти в git - вони вже є сховищем у певному сенсі. Майкл Хемптон дає досить гарну відповідь на це питання (на цій сторінці).
Jehy

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