バックアップ

トップ > チップス > バックアップ
2012-02-13, backup linux

バックアップ

先頭に[host]が付いた章は、バックアップ対象データの存在する実稼動サーバでの操作を、[backend]が付いた章は、データを蓄えるバックアップ用サーバでの操作を意味します。
rsyncコマンドについてはrsyncも参照して下さい。
crontab(自動実行の登録)についてはcronも参照して下さい。
2012.12現在、既にこういったプッシュ型(稼働ホストからバックアップホストへ)のバックアップをとることは止めています。ホストが数台程度の間は問題ありませんが、数が増えてくると管理が面倒です。現在はバックアップ専用のホストから、稼働中の各ホストにアクセスして必要なデータ転送を行っています。

[host]バックアップスクリプトの作成

以下のスクリプトを環境に合わせて書き換え、binフォルダ以下に設置します(パーミションの設定も忘れずに)。

bin/backup.sh

#! /bin/bash
backupUser=<strong>backup</strong>
backupHost=<strong>bk.xxx.com</strong>
backupPath=/home/${backupUser}/head
backupPort=22

# NOTICE - Last '/(slash)' is needed.
targetPath=/home/$(whoami)/<strong>target/</strong>

function transport(){
  SRCPATH=${1}
  N=${2}
  HOSTNAME=$(hostname)
  ssh -p ${backupPort} ${backupUser}@${backupHost} \
    "mkdir -p ${backupPath}/${HOSTNAME}${SRCPATH}"
  rsync -avz${N} --delete -e "ssh -p ${backupPort}" ${SRCPATH} \
    ${backupUser}@${backupHost}:${backupPath}/${HOSTNAME}${SRCPATH}
}

transport ${targetPath}

ダンプが必要なストレージの場合

データベースエンジンやSubversionのリポジトリはそのままファイルベースのバックアップを行っても正しく復元できる保証がありません。よってそれぞれのリポジトリに応じたダンプコマンドを利用してダンプされたファイルが上記のバックアップ対象フォルダに常に存在する状態にする必要があります。

Subversionの場合

$ svnadmin dump path/to/repos | gzip > repos_dump.txt.gz

PostgreSQLの場合

$ pg_dump -C -O database | gzip > database_dump.txt.gz

h2の場合

$ java org.h2.tools.Backup -dir database/ -file backup.zip

[host]crontabへの登録

設置したスクリプトをcrontabに登録します。

MAILTO=<strong>root@bk.xxx.com</strong>
30 1 * * * /home/username/bin/backup.sh

[backend]バックアップユーザの作成

バックアップ対象データを受け取るユーザを作成します。

# useradd <strong>backup</strong>
# passwd <strong>backup</strong>

[backend]ローテーションの定義

head単体のバックアップでは、新しいデータが届くと、以前のデータが直ぐに上書きされてしまいます。以下のコマンドによって定期的にheadディレクトリをコピーすることにより数世代のバックアップを蓄積することが可能です。

rotate.sh

#! /bin/bash

# Get today(yyyy-MM-dd).
DATE=$(date +%F)
BORDER=7

cd
echo "Copying head to ${DATE}.."
cp -R head/ `date +%F`
echo "Removing old snapshot.."
find . -ctime +${BORDER} -prune -name "20*" -print
find . -ctime +${BORDER} -prune -name "20*" -exec rm -rf {} \;
echo "Fin."
0 6 * * * /home/backup/bin/rotate.sh

[host]sshパスワード入力の省略

cronでの実行を行うにはパスワード入力を行わずにバックアップ用サーバへログインができなければいけません。以下のページを参考にしてログイン時のパスワード入力を省略して下さい。 -{link:/tips/bash/old#p11,sshパスワードを省略する}

この記事は役に立ちましたか?