Photo by mondopiccolo
Capistranoではdeployしても、前のソースが残っているために、すぐに前のバージョンに戻せますが、データベースはそうはいきません。
そこで、deploy:migrationsを実行する前に自動でDBのバックアップを取るようなタスクを探してみました。
MySQL専用ですが、これでローカルのbackupsというディレクトリに、migration実行前のダンプがダウンロードされます。
require 'yaml' desc "Backup the remote production database" task :backup, :roles => :db, :only => { :primary => true } do filename = "#{application}.dump.#{Time.now.to_i}.sql.bz2" file = "/tmp/#{filename}" on_rollback { delete file } db = YAML::load(ERB.new(IO.read(File.join(File.dirname(__FILE__), 'database.yml'))).result)['production'] run "mysqldump -u #{db['username']} --password=#{db['password']} #{db['database']} | bzip2 -c > #{file}" do |ch, stream, data| puts data end backup_dir = File.dirname(__FILE__) + "/../backups/" `mkdir -p #{backup_dir}` unless File.exists?(backup_dir) get file, "#{backup_dir}/#{filename}" run "rm #{file}" end desc "Backup the database before running migrations" task :before_migrate do backup end