lib/recipes/database/mysql.rb in capones_recipes-0.2.4 vs lib/recipes/database/mysql.rb in capones_recipes-0.2.5

- old
+ new

@@ -1,91 +1,92 @@ # MySQL Backup/Restore tasks # # Based on code from: # * http://snippets.aktagon.com/snippets/20-Capistrano-2-task-for-backing-up-your-MySQL-production-database-before-each-deployment # * http://www.martin-probst.com/blog/2007/11/20/mysql-backup-restore-task-for-capistrano/ +Capistrano::Configuration.instance.load do + namespace :mysql do + task :backup, :roles => :import do + backup_dir ||= "#{deploy_to}/backups" + run "mkdir -p #{backup_dir}" -namespace :mysql do - task :backup, :roles => :import do - backup_dir ||= "#{deploy_to}/backups" - run "mkdir -p #{backup_dir}" + filename = "#{backup_dir}/#{application}.dump.#{Time.now.strftime('%Y-%m-%d_%H-%M')}.sql.bz2" + text = capture "cat #{deploy_to}/current/config/database.yml" + yaml = YAML::load(text) - filename = "#{backup_dir}/#{application}.dump.#{Time.now.strftime('%Y-%m-%d_%H-%M')}.sql.bz2" - text = capture "cat #{deploy_to}/current/config/database.yml" - yaml = YAML::load(text) + on_rollback { run "rm #{filename}" } - on_rollback { run "rm #{filename}" } - - logger.info "Backing up to #{filename}..." - run "mysqldump -u #{yaml[rails_env]['username']} -p #{yaml[rails_env]['database']} -h #{yaml[rails_env]['host']}| bzip2 -c > #{filename}" do |ch, stream, out| - if out =~ /^Enter password:/ - ch.send_data "#{yaml[rails_env]['password']}\n" - else - puts out + logger.info "Backing up to #{filename}..." + run "mysqldump -u #{yaml[rails_env]['username']} -p #{yaml[rails_env]['database']} -h #{yaml[rails_env]['host']}| bzip2 -c > #{filename}" do |ch, stream, out| + if out =~ /^Enter password:/ + ch.send_data "#{yaml[rails_env]['password']}\n" + else + puts out + end end - end - - run "ln -nfs #{filename} #{backup_dir}/#{application}.latest" - - logger.info "Backup successfull." - end - task :restore, :roles => :import do - backup_dir ||= "#{deploy_to}/backups" + run "ln -nfs #{filename} #{backup_dir}/#{application}.latest" - filename = "#{backup_dir}/#{application}.latest" - text = capture "cat #{deploy_to}/current/config/database.yml" - yaml = YAML::load(text) - - logger.info "Restoring from #{filename}..." - run "bzip2 -d < #{filename} |mysql -u #{yaml[rails_env]['username']} -p#{yaml[rails_env]['password']} -h #{yaml[rails_env]['host']} #{yaml[rails_env]['database']}" do |ch, stream, out| - puts out + logger.info "Backup successfull." end - - logger.info "Restore successfull." - end - namespace :sync do - desc "Sync down the mysql db to local" - task :down, :roles => :app do - sync_dir ||= "#{deploy_to}/sync" - run "mkdir -p #{sync_dir}" + task :restore, :roles => :import do + backup_dir ||= "#{deploy_to}/backups" - filename = "#{application}.dump.#{Time.now.strftime('%Y-%m-%d_%H-%M')}.sql.bz2" + filename = "#{backup_dir}/#{application}.latest" text = capture "cat #{deploy_to}/current/config/database.yml" yaml = YAML::load(text) - on_rollback { delete filename } - # Remote DB dump - run "mysqldump -u #{yaml[rails_env]['username']} -p #{yaml[rails_env]['database']} -h #{yaml[rails_env]['host']} | bzip2 -9 > #{sync_dir}/#{filename}" do |channel, stream, data| - if data =~ /^Enter password:/ - channel.send_data "#{yaml[rails_env]['password']}\n" - else - puts data - end + logger.info "Restoring from #{filename}..." + run "bzip2 -d < #{filename} |mysql -u #{yaml[rails_env]['username']} -p#{yaml[rails_env]['password']} -h #{yaml[rails_env]['host']} #{yaml[rails_env]['database']}" do |ch, stream, out| + puts out end - # Download dump - download "#{sync_dir}/#{filename}", filename + logger.info "Restore successfull." + end - run "rm #{sync_dir}/#{filename}" + namespace :sync do + desc "Sync down the mysql db to local" + task :down, :roles => :app do + sync_dir ||= "#{deploy_to}/sync" + run "mkdir -p #{sync_dir}" - # Local DB import - username, password, database = database_config('development') - system "bzip2 -d -c #{filename} | mysql -u #{username} --password='#{password}' #{database}; rm -f #{filename}" - system "rake db:migrate" + filename = "#{application}.dump.#{Time.now.strftime('%Y-%m-%d_%H-%M')}.sql.bz2" + text = capture "cat #{deploy_to}/current/config/database.yml" + yaml = YAML::load(text) + on_rollback { delete filename } - logger.important "sync database from the stage '#{stage}' to local finished" - end + # Remote DB dump + run "mysqldump -u #{yaml[rails_env]['username']} -p #{yaml[rails_env]['database']} -h #{yaml[rails_env]['host']} | bzip2 -9 > #{sync_dir}/#{filename}" do |channel, stream, data| + if data =~ /^Enter password:/ + channel.send_data "#{yaml[rails_env]['password']}\n" + else + puts data + end + end - # - # Reads the database credentials from the local config/database.yml file - # +db+ the name of the environment to get the credentials for - # Returns username, password, database - # - def database_config(db) - database = YAML::load_file('config/database.yml') - return database["#{db}"]['username'], database["#{db}"]['password'], database["#{db}"]['database'] + # Download dump + download "#{sync_dir}/#{filename}", filename + + run "rm #{sync_dir}/#{filename}" + + # Local DB import + username, password, database = database_config('development') + system "bzip2 -d -c #{filename} | mysql -u #{username} --password='#{password}' #{database}; rm -f #{filename}" + system "rake db:migrate" + + logger.important "sync database from the stage '#{stage}' to local finished" + end + + # + # Reads the database credentials from the local config/database.yml file + # +db+ the name of the environment to get the credentials for + # Returns username, password, database + # + def database_config(db) + database = YAML::load_file('config/database.yml') + return database["#{db}"]['username'], database["#{db}"]['password'], database["#{db}"]['database'] + end end end - end +