web-dev-qa-db-ja.com

バックアップツールとしてのGIT

サーバーにgitをインストールします

cd /
git init
git add .
git commit -a -m "Yes, this is server"

次に、/.git/を取得して、ネットワークドライブ(SAN、NFS、Sambaなど)または別のディスクを指定します。変更を更新するには、1時間ごと、1日ごとなどにcronジョブを使用します。 .gitディレクトリには、すべてのサーバーファイルのバージョン付きコピーが含まれます(/ proc、/ devなどの役に立たない/複雑なファイルは除きます)。

重要ではない開発サーバーの場合、適切なバックアップシステムにセットアップする手間やコストが不要で、バックアップは便宜上のものにすぎません(つまり、need toこのサーバーをバックアップしますが、問題が発生した場合に時間を節約できます)、これは有効なバックアップソリューションになるか、大量のファイルに分類されますか?

105
Smudge

あなたは愚かな人ではありません。 gitをバックアップメカニズムとして使用することは魅力的であり、他の人々が言っ​​ていることにもかかわらず、gitはバイナリファイルでうまく機能します。このトピックの詳細については、 Gitブックのこのページ を参照してください。基本的に、gitはデルタストレージメカニズムを使用していないため、実際には問題ありませんwhatファイルは次のように見えます(ただし、git diffのユーティリティはバイナリではかなり低いですストック構成のファイル)。

バックアップにgitを使用する場合の最大の問題は、ほとんどのファイルシステムメタデータが保持されないことです。具体的には、gitは以下を記録しません。

  • ファイルグループ
  • ファイル所有者
  • ファイル権限(「これは実行可能か」以外)
  • 拡張属性

これを解決するには、この情報を明示的にリポジトリに記録するツールを作成しますが、これを正しく行うのは難しい場合があります。

Googleで git backup metadata を検索すると、読む価値があると思われる多くの結果が得られます(ここで私が提起した問題をすでに補償しようとするいくつかのツールを含みます)。

etckeeper/etcをバックアップするために開発され、これらの問題の多くを解決します。

92
larsks

使ったことはありませんが、gitベースのバックアップツールである bup を参照してください。

22
stew

これは有効なバックアップソリューションになる可能性があります。etckeeperはこのアイデアに基づいています。しかし、.gitディレクトリ権限、そうでない場合は/etc/shadow.gitディレクトリ。

12
Stone

技術的にはこれを行うことができますが、私はそれに2つの警告をします。

1、バイナリデータのソースバージョン管理システムを使用しています。したがって、設計されていないものに使用しています。

2、新しいマシンを構築するためのプロセス(ドキュメントまたは自動化)がない場合、開発プロセスについて心配します。あなたがバスを買ってヒットしたら、誰が何をすべきか、そして何が重要であるかを知っているでしょうか?

災害復旧は重要ですが、すべてをバックアップするだけではなく、新しい開発ボックスの設定を自動化(スクリプト)する方が適切です。もちろん、スクリプト/ドキュメントにはgitを使用しますが、コンピューター上のすべてのファイルには使用しません。

12
Phil Hannent

私はWindowsシステムのバックアップとしてgitを使用していますが、これは非常に便利です。投稿の下部に、Windowsシステムでの構成に使用するスクリプトを示します。システムのバックアップとしてgitを使用すると、2つの大きな利点があります。

  1. 商用ソリューションが独自の独自の形式を使用することが多いのとは異なり、バックアップは、広くサポートされ、十分に文書化されているオープンソース形式です。これにより、データを完全に制御できます。どのファイルがいつ変更されたかを簡単に確認できます。履歴を切り捨てる場合は、それも可能です。あなたの歴史から何かを消去したいですか?問題ない。ファイルのバージョンを取得するのは、他のgitコマンドと同じくらい簡単です。
  2. ミラーは必要な数だけ、または少なく、すべてカスタマイズしたバックアップ時間を持つことができます。ローカルミラーが得られます。これは、低速のインターネットトラフィックによる負担がなく、(1)1日を通してより頻繁にバックアップを実行でき、(2)復元時間を短縮できます。 (私がドキュメントを失うことが最も多いのはユーザーエラーによるものであるため、頻繁なバックアップは大きなプラスです。たとえば、子供が過去5時間作業していたドキュメントを子供が誤って上書きしてしまいます。)しかし、ローカル災害や盗難の場合にデータ保護の利点を提供するリモートミラー。また、インターネットバンド幅を節約するために、リモートミラーをカスタマイズした時間にバックアップしたいとしますか?問題ない。

結論:gitバックアップは、バックアップの実行方法を制御する上で驚異的なパワーを提供します。

これをWindowsシステムで構成しました。最初のステップは、すべてのローカルデータをコミットするローカルgitリポジトリを作成することです。ローカルの2台目のハードドライブを使用することをお勧めしますが、同じハードドライブを使用しても問題ありません(ただし、これをリモートのどこかにプッシュするか、ハードドライブが故障した場合はねじ込みます)。

最初にcygwin(rsyncを使用)をインストールする必要があり、さらにgit for Windowsをインストールする必要があります: http://git-scm.com/download/win

次に、ローカルのgitリポジトリを作成します(1回だけ実行します)。

init-repo.bat:

@echo off
REM SCRIPT PURPOSE: CREATE YOUR LOCAL GIT-REPO (RUN ONLY ONCE)

REM Set where the git repository will be stored
SET GBKUP_LOCAL_MIRROR_HOME=E:\backup\mirror


REM Create the backup git repo. 
SET GIT_PARAMS=--git-dir=%GBKUP_LOCAL_MIRROR_HOME%\.git --work-tree=%GBKUP_LOCAL_MIRROR_HOME% 
mkdir %GBKUP_LOCAL_MIRROR_HOME%
git %GIT_PARAMS% init
git %GIT_PARAMS% config core.autocrlf false
git %GIT_PARAMS% config core.ignorecase false 
git %GIT_PARAMS% config core.fileMode false
git %GIT_PARAMS% config user.email backup@yourComputerName
git %GIT_PARAMS% config user.name backup

REM add a remote to the git repo.  Make sure you have set myRemoteServer in ~/.ssh/config   
REM The path on the remote server will vary.  Our remote server is a Windows machine running cygwin+ssh.  
REM For better security, you could install gitolite on the remote server, and forbid any non-fast-forward merges, and thus stop a malicious user from overwriting your backups.
git %GIT_PARAMS% remote add Origin myRemoteServer:/cygdrive/c/backup/yourComputerName.git

REM treat all files as binary; so you don't have to worry about autocrlf changing your line endings
SET ATTRIBUTES_FILE=%GBKUP_LOCAL_MIRROR_HOME%\.git\info\attributes
echo.>> %ATTRIBUTES_FILE% 
echo *.gbkuptest text>> %ATTRIBUTES_FILE% 
echo * binary>> %ATTRIBUTES_FILE% 
REM compression is often a waste of time with binary files
echo * -delta>> %ATTRIBUTES_FILE% 
REM You may need to get rid of windows new lines. We use cygwin's tool
C:\cygwin64\bin\dos2unix %ATTRIBUTES_FILE%

次に、Windowsスケジューラによって定期的に呼び出されるバックアップスクリプトラッパーがあります。

gbackup.vbs:

' A simple vbs wrapper to run your bat file in the background
Set oShell = CreateObject ("Wscript.Shell") 
Dim strArgs
strArgs = "cmd /c C:\opt\gbackup\gbackup.bat"
oShell.Run strArgs, 0, false

次に、ラッパーが呼び出すバックアップスクリプト自体があります。

gbackup.bat:

    @echo off

REM Set where the git repository will be stored
SET GBKUP_LOCAL_MIRROR_HOME=E:\backup\mirror
REM the user which runs the scheduler
SET GBKUP_RUN_AS_USER=yourWindowsUserName
REM exclude file
SET GBKUP_EXCLUDE_FILE=/cygdrive/c/opt/gbackup/exclude-from.txt

SET GBKUP_TMP_GIT_DIR_NAME=git-renamed
for /f "delims=" %%i in ('C:\cygwin64\bin\cygpath %GBKUP_LOCAL_MIRROR_HOME%') do set GBKUP_LOCAL_MIRROR_CYGWIN=%%i

REM rename any .git directories as they were (see below command)
for /r %GBKUP_LOCAL_MIRROR_HOME% %%i in (%GBKUP_TMP_GIT_DIR_NAME%) do ren "%%i" ".git" 2> nul

SET RSYNC_CMD_BASE=C:\cygwin64\bin\rsync -ahv --progress --delete --exclude-from %GBKUP_EXCLUDE_FILE%

REM rsync all needed directories to local mirror
%RSYNC_CMD_BASE% /cygdrive/c/dev %GBKUP_LOCAL_MIRROR_CYGWIN%
%RSYNC_CMD_BASE% /cygdrive/c/Users/asmith %GBKUP_LOCAL_MIRROR_CYGWIN%
%RSYNC_CMD_BASE% /cygdrive/c/Users/bsmith %GBKUP_LOCAL_MIRROR_CYGWIN%

cacls %GBKUP_LOCAL_MIRROR_HOME% /t /e /p  %GBKUP_RUN_AS_USER%:f

REM rename any .git directories as git will ignore the entire directory, except the main one
for /r %GBKUP_LOCAL_MIRROR_HOME% %%i in (.git) do ren "%%i" "%GBKUP_TMP_GIT_DIR_NAME%" 2> nul
ren %GBKUP_LOCAL_MIRROR_HOME%\%GBKUP_TMP_GIT_DIR_NAME% .git

REM finally commit to git
SET GIT_PARAMS=--git-dir=%GBKUP_LOCAL_MIRROR_HOME%\.git --work-tree=%GBKUP_LOCAL_MIRROR_HOME% 
SET BKUP_LOG_FILE=%TMP%\git-backup.log
SET TO_LOG=1^>^> %BKUP_LOG_FILE% 2^>^&1
echo ===========================BACKUP START=========================== %TO_LOG%
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c-%%a-%%b)
For /f "tokens=1-2 delims=/:" %%a in ('time /t') do (set mytime=%%a%%b)
echo %mydate%_%mytime% %TO_LOG%
echo updating git index, committing, and then pushing to remote %TO_LOG%
REM Caution: The --ignore-errors directive tells git to continue even if it can't access a file.
git %GIT_PARAMS% add -Av --ignore-errors %TO_LOG%
git %GIT_PARAMS% commit -m "backup" %TO_LOG%
git %GIT_PARAMS% Push -vv --progress Origin master %TO_LOG%
echo ===========================BACKUP END=========================== %TO_LOG%

Exclude-from.txtファイルがあり、すべてのファイルを無視します。

exclude-from.txt:

target/
logs/
AppData/
Downloads/
trash/
temp/
.idea/
.m2/
.IntelliJIdea14/
OLD/
Searches/
Videos/
NTUSER.DAT*
ntuser.dat*

リモートリポジトリに移動して、それらに対して「git init --bare」を実行する必要があります。バックアップスクリプトを実行して、スクリプトをテストできます。すべてが機能していると想定して、Windowsスケジューラに移動し、1時間ごとのバックアップをvbsファイルに向けます。その後、1時間ごとにコンピューターのgit履歴が表示されます。それは非常に便利です-誤ってテキストのセクションを削除して、それを逃してしまいますか? gitリポジトリを確認してください。

6
user64141

まあそれは悪い考えではありませんが、私は2つの赤い旗を掲げるべきだと思います:

  • ハードディスクに障害が発生した場合、コミットを別のサーバー/ドライブにプッシュしないと、すべてが失われます。 (イベントの計画がある場合は、言及したいと思います。)

...しかし、それでも、破損に関連するものの適切なバックアップになる可能性があります。または、あなたが言ったように、.git /フォルダーが別の場所にある場合。

  • このバックアップは常にサイズが大きくなります。デフォルトでは剪定や回転などはありません。

...したがって、タグを追加するようにcronjobに指示する必要がある場合があります。次に、タグ付けされていないコミットがクリーンアップされることを確認します。

5
FMaz008

Subversionをベースにしたバックアップソリューションを開発したことがあります。それはかなりうまくいきました(そしてgitはもっとうまく動くはずです)が、ここにはもっと良い解決策があると思います。

私はrsnapshotがより良いものの1つであると考えています-そうでない場合はtheより良いです。ハードリンクを上手に利用することで、300 GBのファイルサーバー(50万個のファイルを含む)があり、毎日、毎週、および毎月のバックアップが1年間まで遡ります。合計使用ディスク領域は、1つの完全コピー+各バックアップの増分部分のみですが、ハードリンクのおかげで、それぞれにcomplete「ライブ」ディレクトリ構造がありますバックアップの。つまり、daily.0(最新のバックアップ)だけでなく、daily.1(yestarday)やweekly.2(2週間前)などでも直接ファイルにアクセスできます。

Sambaでバックアップフォルダーを再共有すると、ユーザーは自分のPCをバックアップサーバーに向けるだけで、バックアップからファイルをプルできます。

別の非常に優れたオプションはrdiff-backupですが、エクスプローラーを\\ servernameに移動するだけでファイルに常にアクセスできるようにしたいので、rsnapshotの方が優れたソリューションでした。

3
shodanshok

私は完全なシステムで試したことはありませんが、MySQLバックアップ(--skip-extended-insertオプションを使用)に使用しており、本当にうまくいきました。

バイナリデータファイルで問題が発生し(内容全体が変更される可能性があり、変更される可能性があります)、.gitフォルダが非常に大きくなるという問題が発生する可能性があります。 .gitignoreファイルを設定し、本当に必要なテキストファイルのみをバックアップすることをお勧めします。

3

私はgitでバックアップするのと同じ考えを持っていましたが、基本的にはバージョン付きのバックアップが可能だからです。次に rdiff-backup を見ました。これはその機能(およびその他)を提供します。それは本当に素敵なユーザーインターフェイスを持っています(CLIオプションを見てください)。とても満足しています。 --remove-older-than 2Wはかなりクールです。 2週間以上前のバージョンを削除するだけです。 rdiff-backupはファイルの差分のみを保存します。

2
Daniel

私はgitに非常に慣れていませんが、デフォルトではブランチはローカルではなく、リモートリポジトリに明示的にプッシュする必要がありますか?これは不愉快で予期せぬ驚きでした。結局のところ、ローカルリポジトリのallをサーバーに「バックアップ」したくないのですか? git book を読む:

ローカルブランチは、書き込み先のリモートと自動的に同期されません。共有するブランチを明示的にプッシュする必要があります。そうすることで、共有したくない作業にプライベートブランチを使用し、共同作業をしたいトピックブランチのみをプッシュアップできます。

私にとってこれは、ローカルマシン上の他のgit以外のファイルと同様に、それらのローカルブランチが、いくつかのgit以外の手段で定期的にバックアップされない限り、失われるリスクがあることを意味しました。私はとにかくこれを行いますが、それは私のリポジトリのgitの「すべてをバックアップする」という私の想定を破りました。これについての説明が大好きです!

2
Matthew Cornell

これは使用されるアプローチであり、理にかなっています。

Keepconf このジョブにはrsyncとgitを使用します。これは、事を簡単に行うためのこのツールのラッパーです。

バックアップサーバーへのアクセス用に構成されたssh-keysを備えた中央サーバーと、構成ファイルの数行のみが必要です。たとえば、これはすべての/ etc /およびdebianパッケージをインストールしたままにするための私の独自のファイルです。

[hosts]
192.168.1.10
192.168.1.11
192.168.1.12

[files]
/etc/*
/var/lib/dpkg/status

これで、rsyncバックアップとgitコミットができました。

1
Rfraile

バックアップにgitを使用する目的で設計された githubのbup をチェックアウトすることをお勧めします。

1
mcantsin

これは私の開発ボックスにとって良い方法であることがわかりました。バックアップする必要があるものから、デプロイメントエンドポイントのみに変更します。

構成とパッケージのインストールマニフェストはすべてPuppetに保存されるため、簡単に再デプロイして構成を更新できます。 Puppetディレクトリはgitでバックアップされます。キックスタートは、初期デプロイを行うために使用されます。

また、その時点で開発中のパッケージ用のカスタムYUMリポジトリも保持しています。これには、作業しているすべてのパッケージがローカルシステムの無人バイナリとして残されないという追加の利点があります。それが発生し、ファイルがうまくまとまってしまう場合。誰かが適切な手順に従わなかった。

1
Tim Brigham

ある程度は機能しますが、2つの警告があります。

  1. コミットを実行しても、ファイルの追加は自動的には取得されません。コミットする前に、-porcelean om git statusを使用して、追加する新しいものを見つけます。

  2. .sshのリモートマウントが面倒なのはなぜですか?それは壊れやすいBdかもしれません、あなたはそれが失敗したことを知らないでしょう。通常のsshキーログインで、遠端にベアリポジトリを使用します。リポジトリが裸で、1つのソースからのみプッシュする限り、マージで機能することが保証されます。

0
Andrew

私の個人的な見解では、これは基本的にすべて逆です。ファイルを引き出すのではなく、バックアップソリューションにプッシュしています。

サーバーの構成を最初に集中化し、人形のようなものを使用してサーバーをプルダウンする方がはるかに良いでしょう。

とはいえ、うまくいくかもしれませんが、それほど良いとは思いません。

Backuppcを調べてみてください。設定はかなり簡単で、率直に言って素晴らしいです。

0
Sirex