出席者の誰もバックアップの重要性を説明する必要はないと思います。
問題は、何十もの既製のソリューションのうち、どれもコロケーションのスタンドアロン* NIXサーバーの要件を実際に満たしていないことです。
バックアップには何が必要でしたか?
1)すべてのデータの毎日の
完全な bakap。 増分バックはありません。
2)単一ファイルの最速の回復。 アーカイバ(tar / gzip / bzip2 / rar)が消えます
3)迅速な監視「昨日156GBサーバーを正確にアップロードしたのは誰ですか?!!!」
4)ディスクに十分な空き領域がある限り、バックアップコピーを保持したい。
5)ディスク容量がまだ不足している場合、古いコピーを手動で削除することを心配したくない
簡単に言えば、LinuxサーバーにMAC OS TimeMachine機能を実装したかったのです。
そして、スクリプトを書き始めました。
おそらく既にTimeMachineの基礎は
cp -al +
rsyncの組み合わせであると推測しました
指では、次のようになります。
cp -al _backup _backup
今日はハードリンク付きで昨日のファイルをコピーします。 このようなコピーは、実際のディスク容量をほとんど占有しません。 それから始まります
rsync -a --del _backup
昨日のバックアップのコピーの違いをスキャンし、違いが見つかった場合、ハードリンクを削除してファイルの新しいバージョンを書き込みます。 新しいファイルとディレクトリの作成/コピー。 存在しないファイルを削除します。 この場合、昨日のバックアップ内のすべてのファイルはそれぞれの場所に残ります。
通常の作業バックアップスクリプトを作成するには、これら2つのコマンドでは不十分であることが明らかです。 スクリプトを2つのファイルに書くことにしました-1つは一連の機能を持つすべてのサーバーの標準、もう1つはcronを直接実行するサーバーごとの短い個別のファイルです。
したがって、これらのスクリプト:(
ここからダウンロードできます )
backup_functions.sh
および
backup.sh :
Backup_functions.shは
/ usr / local / sbinにあると想定されてい
ます 。 別のディレクトリにある場合
-backup.shの対応する行を修正します
ご覧のとおり、スクリプトはグローバル変数を豊富に使用しています。 例えば
RESERVE_G-今日のバックアップを開始
する前に最も古いコピーを削除することによってスクリプトが提供する予約(ギガバイト単位)
BACKUP_EXPIRES_DAYS-まだディスク領域がある場合でも、古いバックアップを削除する日数。 BACKUP_EXPIRES_DAYS == 0の場合、これは行われません。
BACKUP_MAIN_DIR-バックアップが書き込まれるディレクトリ。 内部には、「2011-11-15」のようなフォルダが作成され、そこにバックアップが書き込まれます。
VERIFY_BACKUP_MOUNTED-バックアップの下に別のディスクパーティションがマウントされているかどうかを確認します。 選択したパーティションが何らかの理由でマウント解除された場合、このチェックを行わないと、バックアップがrootfsまたはこれに適さないディスクの別のパーティションに大きく落ちることに注意してください。 ただし、バックアップが明示的かつ明確にrootfsまたは別の非専門パーティションに具体的に書き込まれる場合があります。 次に、指定する必要があります
VERIFY_BACKUP_MOUNTED = "no"
cronによってすでに直接実行できる短いbackup.shスクリプトは、いくつかの自作関数を呼び出します。
prepare_for_backup-この関数は、直接コピーする前にすべてを準備します。 大まかに言って、彼女は
cp -al +あらゆる種類のチェックを行い、ディスクの空き容量がなくなったかどうかを確認します。
make_backup (パラメーター付き)-関数は実際にコピーを作成します
make_backup_with_delta (同じパラメーター)-関数はコピーを作成し、オプションですべての新しいファイルを
ハードリンクディレクトリ
2011-11-15 / _deltaにマージします。 このディレクトリを調べると、昨日サーバーに156GBをアップロードしたユーザーをすばやく簡単に見つけることができます。
send_email_report-この関数は、バックアップ中にエラー(ある場合)を含む電子メールを管理者に送信します。
ファイルのバックアップに加えて、付録のMySQLのバックアップ関数も作成しました。
make_mysql_backup-この関数はパラメーターなしで呼び出され、テーブルmysqldump(つまり、1つのテーブル
-1つの.sqlファイル)を作成し、各データベースのすべての.sqlファイルを
db_name.tar.gzにパックします
シートごめんなさい。 誰かが役に立つといいな。
更新:1日に1回以上バックアップを作成する場合-backup_functions.shの最初の行で次の行を置き換えます
CURR_DATE =「日付+%F」に
CURR_DATE =「日付+%F_%R」rsyncがインストールされていない場合、スクリプトは対応するメッセージで中断されます。
ioniceがインストールされている場合、rsyncは低いio優先度で起動されます(パラメーターは次の行で変更できます)
[-n "` which ionice` "] && IONICE_CMD = 'ionice -c2 -n6'