シェルスクリプトとCronでデータベースを自動バックアップ&ローテーション

一部のサイトをCoreserverに移動したのを機に、バックアップ用のシェルスクリプトを見直しました。今回は、データベースの自動バックアップ&ローテーションを行うシェルスクリプトをメモを兼ねて紹介します。

ページ下部のようなシェルスクリプトを文字エンコーディングをEUC-JP、改行コードをLFで作成し、外部からアクセスできない場所に転送します。例ではシェルスクリプトを/virtual/ユーザー名/sh/ディレクトリに作成し、バックアップ先を/virtual/ユーザー名/backup/databases/ディレクトリとしています。

あとは、Cronにこのシェルスクリプトを登録し、1日に1回だけ実行されるように設定するだけです。

シェルスクリプトが実行されるたびに、指定したディレクトリにデータベースのダンプファイルを圧縮したtar.gzファイルが蓄積されていきます。「bk_days」で指定した日数分を超えると、自動的に古いバックアップファイルから削除されていきます。

バックアップはサーバー内に蓄積されていくので、定期的にローカルコンピューターにダウンロードしたり、別のサーバーにサーバー間コピーでバックアップのバックアップを作成するようにしましょう。サーバー自体に問題が発生した場合には、バックアップの意味がなくなってしまいます(経験済み)。

Coreserver以外のサーバーでも、大半のサーバーではディレクトリ名を変えるだけでそのまま使えると思います。

/virtual/ユーザー名/sh/backup_db.sh
#!/bin/sh

# ---------- 設定 ----------
# バックアップ元のデータベース
db_name=データベース名
db_pass=データベースのパスワード

# バックアップ先のディレクトリ・ファイル
bk_dir=/virtual/ユーザ名/backup/databases/
bk_file=$db_name

# 保存する日数
bk_days=90

# ---------- ファイル名を設定 ----------
# タイムスタンプを取得
ts_now=`date +%Y%m%d`
ts_old=`date "-d$bk_days days ago" +%Y%m%d`

# ファイル名を設定
file_temp=$bk_file.sql
file_backup=$bk_file.$ts_now.tar.gz
file_remove=$bk_file.$ts_old.tar.gz

# ---------- バックアップ処理 ----------
# バックアップ先のディレクトリに移動
cd $bk_dir
if [ $? != 0 ]; then
echo "Backup directory does not exist."
exit 1
fi

# データベースをダンプ
/usr/local/mysql/bin/mysqldump $db_name -u $db_name -p$db_pass --opt > $file_temp
if [ $? != 0 -o ! -e $file_temp ]; then
echo "Cannot dump database."
exit 1
fi

# アーカイブを作成
tar cfz $file_backup $file_temp
if [ $? != 0 -o ! -e $file_backup ]; then
echo "Cannot archive files."
exit 1
fi

# テンポラリファイルを削除
rm -f $file_temp

# ローテーション処理
if [ -e $file_remove ]; then
rm -f $file_remove
fi

exit 0

コメント (4)

  • FJ
  • 2009-01-27 11:52

はじめましてFJと申します。
掲載されているDBの自動保存を試みている素人です。当サイトには検索で辿り着きました。貴重な情報ありがとうございます。
そこで、大変恐縮なのですが、backup_db.shについて数点、ご教示いただけなけないでしょうか?

当方、coreserverを使っており、backup_db.shをcronで実行させたいのですがTeraTarmで確認すると「バック: No such file or directory」とエラーが出てしまいます。

backup_db.sh のパーミッションと文字コード、改行コードは755、UTF-8 CR+LFで良いのでしょうか?
それと、バックアップ先のディレクトリ・ファイル bk_dir=/virtual/***/backup/database/の
新規で作成する「backup」と「database」のディレクトリのパーミッションはどのようにすれば良いのでしょうか?
まったくお門違いなご質問かもしれませんが、何卒、ご教示いただけると幸いです。

FJさん、はじめまして。
パーミッションですが、特に変更する必要はないと思います。うちもそれで動いてますので。
ただ、改行コードはLFにしないとだめですね。そのせいで(?)、失敗してるのかもしれません。
ちなみに、文字エンコーディングはEUCにしてます。

  • FJ
  • 2009-01-28 21:46

ありがとうございます!
早速やってみます。また失敗したら手を差し伸べていただけると幸いです。

スクリプト、とても役に立ちました-!
参考にしてDBバックアップを仕込むことができました。

感謝感謝です

コメントフォーム

トラックバック (4)

[…] シェルスクリプトとCronでデータベースを自動バックアップ&ローテーション – (DxD)∞ […]

[…] シェルスクリプトとCronでデータベースを自動バックアップ&ローテーション – (DxD)∞ […]

[…] でデータベースを自動バックアップ&ローテーション – (DxD)∞ http://dxd8.com/archives/168/ […]

この記事のトラックバックURI
http://dxd8.com/archives/168/trackback/
この記事のURI
http://dxd8.com/archives/168/