RailsアプリのMySQL、PostgreSQLを自動バックアップ

Railsで運用中のデータベース(MySQL、PostgreSQL)をwhenever + backupを使ってcronでバックアップする。backupというgemはUNNIX系(Linux Mac OSX)でデータベースやファイル、ディレクトリのバックアップをRuby DSLで簡単に設定、実行するためのRubyGem。
様々なバックアップ先(Amazon S3、Dropbox)などに圧縮してバックアップし、メールやツイッターで結果を通知してくれる。

バージョン3からはRails以外でも利用できるようになっているが、今回はRailsでデータベースのみのバックアップを取りたい場合の設定方法。

■サポートするデータベース
 MySQL
 PostgreSQL
 MongoDB
 Redis
詳細:Databases

■バックアップ対象のストレージ
 Amazon S3
 Rackspace Cloud Files
 Dropbox
 リモートサーバー(FTP SFTP SCP RSync)
詳細:Storages

■Rubyのバージョン
 Ruby 1.9.2
 Ruby 1.8.7
 Ruby Enterprise Edition 1.8.7

■backupのインストール
gem install backup


■設定ファイルの作成
backup gem自体はRailsに限らないため、通常は~/Backup/config.rbに作成されてしまうが、これだとRailsで管理できないので、pathオプションをつけて作成先を Railsアプリのルートフォルダ/configに指定する。
Railsアプリのディレクトリに移動して
backup generate --path='config/' --databases='mysql' --storages='ftp' --compressors='gzip'

※オプションについて
--databases:MySQL、PostgreSQLなどを指定
--storages:保存先のストレージ(Amazon S3、FTPなど)を指定
--compressors:圧縮形式
詳細:Generator

これでconfig/config.rbが作成される。

■config.rbの編集
Using Backup With Railsを参考に
#
# Backup
# Generated Template
#
# For more information:
#
# View the Git repository at https://github.com/meskyanichi/backup
# View the Wiki/Documentation at https://github.com/meskyanichi/backup/wiki
# View the issue log at https://github.com/meskyanichi/backup/issues
#
# When you're finished configuring this configuration file,
# you can run it from the command line by issuing the following command:
#
# $ backup -t my_backup [-c ]

#Railsのdatabase.ymlを参照してパスワードなどを設定
database_yml = File.expand_path('database.yml', __FILE__)
RAILS_ENV = ENV['RAILS_ENV'] || 'production'
require 'yaml'
config = YAML.load_file(database_yml)

Backup::Model.new(:my_backup, 'My Backup') do
# MySQLバックアップ
database MySQL do |db|
db.name = config[RAILS_ENV]["database"]
db.username = config[RAILS_ENV]["username"]
db.password = config[RAILS_ENV]["password"]
db.host = "localhost"
db.port = 3306
db.socket = "/tmp/mysql.sock"
db.skip_tables = []
end
 #PostgreSQLなどその他データベースの場合の設定はDatabasesを参照

# 外部サーバへのバックアップ
# rsyncで外部へバックアップする場合=====================
# ローカルにバックアップし、それをrsyncで外部に同期する

# ローカルへのバックアップ
store_with Local do |local|
local.path = '/home/user/Backup/data/'
# バックアップとして保存する上限の数
local.keep = 5
end

# rsyncで外部サーバへ同期
# ※ssh公開鍵認証で接続できるようバックアップ先のサーバに
# バックアップ元のサーバの公開鍵を登録しておく。
sync_with RSync::Push do |rsync|
rsync.ip = "my_domain.jp"
rsync.port = 22
rsync.username = "my_username"
# バックアップ先のディレクトリ
rsync.path = "data/db_backup/my_app"
rsync.mirror = true
rsync.compress = true

rsync.directories do |directory|
# バックアップ対象のディレクトリ
directory.add "/home/user/Backup/data"
end
end
#============================================================
# FTPで外部にバックアップする場合============================
 store_with FTP do |server|
 server.username = 'my_username'
 server.password = 'my_password'
 server.ip = '123.45.678.90'
 server.port = 21
 server.path = '~/backups/'
 server.keep = 5 #バックアップする数
 end
#============================================================
 #Amazon S3、Dropboxなどその他ストレージの場合の設定はStoragesを参照

compress_with Gzip do |compression|
compression.best = true
compression.fast = false
end

end


■wheneverでバックアップするためschedule.rbの設定
wheneverはcronを簡単にするためのプラグイン。
詳細は以下を参照されたし。
参考:RailsでCronを簡単にするプラグインwhenever
1日 1回 5時にバックアップする場合
every 1.days, :at=>'05:00' do
    command "backup perform --trigger my_backup --config_file 'rails_app/current/config'"
end

※オプションについて
--trigger:config.rbのBackup::Model.new(:my_backup, 'My Backup') do ・・・の名前を指定
--config_file:config.rbのパスを指定。

これでデプロイすると、wheneverで指定した時刻にバックアップされるようになる・・はず。

※ちなみに、本番環境では結局バージョン2でやってしまったので、試せていません・・・。
バージョン2でやる場合はBackupライブラリでプロジェクトのバックアップもD.R.Y化しよう | KRAY Incが参考になります。
バージョン2はデータベースのマイグレーションが必要でしたが、3からはその辺が不要になっており、より手軽に利用できます。

■シェルスクリプトでバックアップする場合
backup gemを使用しない場合は、mysqldumpとcronでMySQLを自動バックアップする | Linuxで自宅サーバ構築を参考にシェルスクリプトを作成し、
every 1.days, :at=>'05:00' do
    command '/home/user/mysql_backup.sh'
end
という感じでシェルスクリプトを実行すればオーケー。
posted by digital-squad at 2011年05月20日 15時17分 | Comment(0) | TrackBack(0) | Ruby on Rails / Ruby
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/202435240
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック