シェルスクリプトと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さん、はじめまして。
パーミッションですが、特に変更する必要はないと思います。うちもそれで動いてますので。
ただ、改行コードはLFにしないとだめですね。そのせいで(?)、失敗してるのかもしれません。
ちなみに、文字エンコーディングはEUCにしてます。
ありがとうございます!
早速やってみます。また失敗したら手を差し伸べていただけると幸いです。
スクリプト、とても役に立ちました-!
参考にしてDBバックアップを仕込むことができました。
感謝感謝です
トラックバック (4)
[…] シェルスクリプトとCronでデータベースを自動バックアップ&ローテーション – (DxD)∞ […]
[…] シェルスクリプトとCronでデータベースを自動バックアップ&ローテーション – (DxD)∞ […]
[…] https://dxd8.com/archives/168/ […]
[…] でデータベースを自動バックアップ&ローテーション – (DxD)∞ https://dxd8.com/archives/168/ […]
はじめまして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」のディレクトリのパーミッションはどのようにすれば良いのでしょうか?
まったくお門違いなご質問かもしれませんが、何卒、ご教示いただけると幸いです。