GitでMySQLデータベースをバックアップするのは良い考えですか?


57

アプリケーションのバックアップ状況を改善しようとしています。DjangoアプリケーションとMySQLデータベースがあります。Gitでデータベースをバックアップすることを提案する記事を読みました。

一方で、データとコードのコピーを同期させておくので気に入っています。

しかし、Gitはデータ用ではなくコード用に設計されています。そのため、コミットごとにMySQLダンプを比較する多くの余分な作業を行うことになります。保存する前にファイルを圧縮しても、gitはファイルを差分しますか?

(現在、ダンプファイルは100MB非圧縮、bzip圧縮時は5.7MBです。)

編集:コードとデータベーススキーマの定義は既にGitにあります。これは実際にバックアップすることを心配しているデータです。


13
会社にIT(ops)部門がある場合、彼らはこれを処理する必要があります。
マイケルハンプトン

1
アプリケーションのデータ部分ですか、それともアプリケーションを介して作成されたものですか?
ウィンストンイーバート

1
Gitは、実行時にすべてのファイルを比較しようとしますgit gc(または、基礎となるものgit repackです; gitは、構成可能なデフォルトにより、時々自動的に実行します)。また、常に圧縮されますので、実際には圧縮せずに保存する方が良いかもしれません。
ジャン・ヒューデック

1
それはどのようなデータベースですか:それは本番または開発データベースですか?
el.pescado

6
viget.com/extend/backup-your-database-in-git、彼は「シニア開発者」です。
wobbily_col

回答:


101

データを失う前に、この質問にシステム管理者の視点を紹介してみましょう。

バックアップを作成する理由は1つしかありません。何か問題が発生した場合に必ず復元できるようにすることです。そのため、適切なバックアップシステムには、gitが合理的に処理できる範囲をはるかに超える要件あります

以下は、gitでデータベースをバックアップしようとする際に予測できる問題の一部です。

  • リポジトリは「バックアップ」ごとに劇的に成長します。以来gitの店舗全体のオブジェクト(圧縮されたとはいえ)、その後、後でそれらをdiffを(例えば、あなたが実行してgit gc、および履歴を保持永遠に、あなたが実際に必要とする、あるいはしたくないという保存された非常に大量のデータを持っています。ディスク容量を節約するため、または法的理由のために行うバックアップの量または保持期間を制限する必要があるかもしれませんが、多くの付随的な損害なしにgitリポジトリから古いリビジョン削除することは困難です。
  • 復元は、リポジトリに保存した特定の時点に限定されます。また、データが非常に大きいため、ささいな時間を超えて戻るのが遅い場合があります。この目的のために設計されたバックアップシステムは、格納されるデータの量を制限する一方で、より詳細な粒度を提供し、リストアを高速化し、災害発生時のダウンタイムを削減します。データベース対応のバックアップソリューション()では、継続的なバックアップも提供できるため、単一のトランザクションが失われることはありません。
  • コミットも同様に遅くなり、データベースが大きくなるにつれて遅くなります。gitは、本質的にはfilesystemマッピングされるキーと値のデータストアであり、したがって、基礎となるファイルシステムのパフォーマンス特性の影響を受けることに注意してください。この期間が最終的にバックアップ間隔を超える可能性があり、その時点でSLAを満たすことができなくなります。また、適切なバックアップシステムは、データが大きくなるにつれてバックアップに時間がかかりますが、構成する保持ポリシーに基づいて独自のサイズを自動的に管理するため、それほど劇的ではありません。

データベースダンプをgitに入れた場合、データベースダンプでできることは明らかにいくつかありますが、全体として、バックアップを保持する目的でそれを推奨することはできません。特に、バックアップシステムは広く利用されており(多くはオープンソースでもあります)、データを安全に保ち、可能な限り迅速に復旧できるようにするのに非常に優れています。


Michaelは一貫性の問題を扱っているため、これが最良の答えです。データベースのサイズと使用状況によっては、スナップショットは特定の時点でデータを確実に再現できず、制約の問題が発生する可能性があります。-レプリケーションは、あなたがに見たいものかもしれdev.mysql.com/doc/refman/5.0/en/replication.html
アーロン・ニュートン

4
これは単なる最良の答えではなく、唯一の答えです。一般的なルールとして、あなたは開発者なので、バックアップはあなたのビジネスではありません。他の誰かがすでにそれらの世話をしている(またはする必要があります)。関与し始めると、すでに動作しているシステムに干渉している可能性があります。これらのボックスはすでにバックアップされているはずなので、バックアップ、独自のバックアップ、および独自のバックアップのバックアップがあり、すべてサイズが増え続けています。それはただのナッツです。さらに、あなたは開発者です。どうしてとにかく(おそらく)本番ボックスの近くに行くのですか?
マキシマスミニマス

2
@JimmyShelter DevOpsチームは、デベロッパーとオプスは一緒に密接に動作しますが、デベロッパーが実際にあることないことを意味することに思考の学校がありますオプス。通常、それはうまく機能しませんが、それは人々がそれを試みるのを止めません。
マイケルハンプトン

これは受け入れられた答えでなければなりません。バックアップシステムの要件と目的を明確に説明し、gitがどのように適合しないかを示します。一貫性とパフォーマンスの議論のための追加ボーナスポイント。
ガブリエルバウマン

OPに彼のためにこの問題を処理できる運用チームがないと仮定して、回答を投稿したことに注意してください。この種のタスクは、実際にシステムを操作していて、その方法を知っている人に任せるのが最善であることに同意します。しかし、あなたが必ずしも自分のものではない帽子をかぶらなければならない状況があります。その状況では、自分で考えた解決策を考え出すよりも、いくつかのベストプラクティスを学ぼうとする方が良いと思います。私はあなたの答えも非常に有益だと感じました!
logc

39

私の2セント:私はそれが良いアイデアだとは思わない。GITは、「異なる時点でファイルのセットのスナップショットを保存する」のような何かをするので、あなたができる完全にそのような何かのためにGITを使用していますが、それはあなたが意味するものではありませんはず。GITはソースコードを格納するように設計されているため、その機能のほとんどが失われ、わずかな利便性のために多くのパフォーマンスを犠牲にすることになります。

これについて考えている主な理由は、「データとコードのコピーを同期させる」ことであり、これは、コードのバージョン2.0がバージョン1.0とは異なるデータベーススキーマを必要とすることを心配していることを意味します。より簡単なソリューションはCREATE、Gitリポジトリのソースコードに沿って、データベーススキーマをステートメント付きのSQLスクリプトのセットとして保存することです。次に、インストール手順の一部として、以前にインストールしたデータベースサーバーでこれらのスクリプトを実行します。

これらの単なる-dテーブルの実際の内容CREATE、ソースコードのバージョンとは関係ありません。サーバーAとサーバーBにバージョン1.0のソフトウェアをインストールするとします。これらは、さまざまなチームによってさまざまな企業で使用されています。スキーマがまったく同じであっても、数週間後、テーブルの内容は大きく異なります。

データベースの内容をバックアップしたいので、バックアップダンプが属するソフトウェアの現在のバージョンでバックアップダンプをタグ付けするバックアップスクリプトを使用することをお勧めします。スクリプトはGITリポジトリにある必要があります(そのため、ソースコードバージョン文字列にアクセスできます)が、ダンプ自体はバージョン管理システムに属していません。

編集

質問の動機付けとなっ元の投稿を読んだ後、これはさらに疑わしいアイデアだと思います。重要な点は、mysqldumpコマンドがDBの現在の状態を一連のSQL INSERTステートメントに変換し、GITがそれらを比較して更新されたテーブル行のみを取得できることです。

mysqldumpこれがあるため、一部では、音でのバックアップの方法のいずれかのMySQLのマニュアルに記載されています。GITの部分は、データベースサーバーがMySQLを含むクラッシュから回復するためにトランザクションログを保持していることに気付かない場所です。され、このログを使用して、あなたのデータベースの増分バックアップを作成する必要があることを、GIT、ありません。これには、何よりもまず、GITリポジトリを無限に拡張するのではなく、リカバリ後にログをローテーションまたはフラッシュできるという利点があります...


2
バージョン管理のデータなしでデータベーススキーマを保存する点がどこにあるかわかりません。データは最も重要なものであり、それがバックアップしたいものです。ただし、データベースのバックアップに現在のソフトウェアバージョンをタグ付けするというアイデアは気に入っています。そのようなものを実装しようとします。
wobbily_col

10
データなしでスキーマを保存するポイントは、インストール直後に、ソフトウェアを「使用する準備ができている」ことです。Wikiの場合、Wikiページの作成と何かの書き込みを開始する準備ができているはずです。スキーマコンテンツをインストールする場合、インストール後にウィキはすでにXウィキページで満たされています...これは、「コンテンツを書き込むためのウィキシステムのインストール」ではなく、「どこかからウィキをコピーして読む」ことです。 。
logc

3
実際の状況に合わせて質問を修正することをお勧めします。すべての詳細を投稿できない場合でも、各インストールで修正されていないように見える多くのデータが必要であると述べることが重要です。単一のインストールがあります...
logc

2
@wobbily_col非テキストのバイナリベースの形式は、ソース管理のコンテキストで値が制限されています。あなたがすることができないのdiffそれを、あなたがすることはできません分岐 / マージあなたは確かにDBを保存するためにgitを使用することができながら、だから、それを、など、ほとんどの人は、スクリプトにDBの構造だけでなく、必要なデータを好みます。これは、もう少し作業を行うことと、上記の機能リストを提供することとの妥協案です。これがソリューションに適しているかどうかを検討する必要があります。それ以外の場合は、GITにDBを直接保存させることができますが、これはタスクにぴったりとは限りません。
ダニエルB

3
@RaduMurzea:これは原則の問題だと思います。バージョン管理システムは、バイナリではなくソースコードを管理するように設計されています。サイズの問題ではありません。いいえ、トレーニングビデオもチェックインしないように、データベースダンプをリポジトリにチェックインしないでください。しかし、だれもあなたの行動を止めることはありません。:)
logc

7

個人的には、ソース管理バージョンシステムを使用してバックアップファイルを保存することはお勧めしません。GITバージョン管理は、バイナリやMySQLバックアップダンプファイルのようなダンプファイル用ではなく、データファイル用に設計されているためです。あなたそれ行うことができるという事実は、あなたそれをするべきであること自動的に意味するものではありません。さらに、リポジトリは、新しいコミットごとに新しいデータベースのバックアップを考慮して、大量のハードディスク容量を使用して劇的に成長し、GITのパフォーマンスが影響を受け、ソース管理システムが遅くなります。私にとっては、バックアップ戦略を実行し、コード内の何かがおかしくなったときにデータベースを復元する必要がある場合は常にバックアップファイルを用意しておくことは問題ありませんが、ソース管理ツールはバイナリデータを保存しません。

これらの理由から、1日目と2日目のバックアップファイルを保存し、2つのバックアップファイルの違いを確認するユーティリティはありません。多くの余分で無駄な作業が必要になります。新しいコードをコミットするときにデータベースバックアップを保存するためにGITを使用する代わりに、日付と時刻で区切られた別のパスにデータベースバックアップを保存し、タグを使用して各バージョン用に作成された新しいデータベースバックアップへの参照をコードに挿入します。誰かがすでに提案したように。

データベースのバックアップとGITに関する最後のメモ:データベース管理者は、一部のデータが失われたためにデータベースを復元する必要がある場合、1日目のバックアップファイルと2日目のバックアップファイルの違いを確認する必要はありません。エラーやデータの損失なしにデータベースを復元できるようになり、ダウンタイムを削減する最後のバックアップファイル。実際、データベース管理者のタスクは、何らかの理由でシステムに障害が発生した場合に、できるだけ早くデータを復旧できるようにすることです。コミットにリンクされたGITにデータベースバックアップを保存する場合、バックアップはGITリポジトリに保存した特定の時点に限定され、ダウンタイムを削減するため、データベース管理者がデータをすばやく復元することはできません。システムの

次に、GITを使用してバックアップを保存することはお勧めしません。代わりに優れたバックアップソフトウェアソリューション(ここにいくつかあります)を使用します。これにより、よりきめ細かくなり、データを安全かつ安全に保ち、災害時のデータ復旧が簡単かつ迅速に。


彼/彼女がdownvotedなぜたぶんdownvoterは説明します。..
アルベルト・ソラノ

1
ダウンボーターではありませんが、このアプローチは、ほとんどのgitユーザーが好むブランチで頻繁にマージされるワークフローを特に助長しない、常に存在するマージ競合を導入すると思います。
ダニエルB

@DanielBデータベースバックアップファイルの保存にバージョン管理システムを使用しないことを提案します。データベース管理の問題は、バージョン管理システムを使用しなくても簡単に解決できると思います。バージョン管理システム(GIT、TFS、SVNなど)はソフトウェア用に設計されており、ダンプファイルやデータベースバックアップ、または単にデータを保存するためのものではありません(そのためのソリューションはたくさんあります)。
アルベルトソラノ

ほとんどのユーザーは最初の数文を読んで投票するので、使用してもいいと言っているようです。

1
@AlbertoSolanoなるほど。しかし、質問(「GITでDBをバックアップできますか?」)を読んでから、最初のステートメント(「バックアップファイルを保存しても構いません...」)を読んで、反対のことを言っているようです。残りの答えは、それがここでもそこでもないということであるように見えますが、ほとんどの人は、それが起こるのを待っている列車の難破だと思うと思います。
ダニエルB

1

Git、特にデータベースにバイナリデータを保存しないでください。
コードの変更とデータベースDMLの変更はまったく異なります。

MySQLとOracleは、任意の時点に復元する目的でアーカイブログを書き込むことができます。それらのログを安全な場所にバックアップするだけで大​​丈夫です。

Gitを使用してこれらの「アーカイブログ」をバックアップすることは意味がありません。実稼働環境のアーカイブログはかなり重いため、定期的な完全バックアップを作成した後、削除する必要があります。また、それらをgitに入れることは無意味です-それらはある意味で既にリポジトリです。


1
MySQLで作成されたこれらの「アーカイブログ」をGitでバックアップしないのはなぜですか?
グナット

1
それが意味をなさないという理由だけで。実稼働環境のアーカイブログはかなり重いため、定期的な完全バックアップを作成した後、削除する必要があります。また、それらをgitに入れることは無意味です-それらはある意味で既にリポジトリです。マイケル・ハンプトンは、この問題に関して(このページで)かなり良い答えをしています。
ジェヒ

1
すべてのコピーをgitに保存するのに、なぜログを回転させるのが面倒ですか?モンスターログファイルを1つだけ保持することもできます。
wobbily_col
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.