Question

I am using rails and capistrano with a staging and production server. I need to be able to copy the production database to the staging database when I deploy to staging. Is there an easy way to accomplish this?

I thought about doing this with mysql and something like:

before "deploy:migrate" do
  run "mysqldump -u root #{application}_production > output.sql"
  run "mysql -u root #{application}_staging < output.sql"
end

(I have not tested this btw, so not sure it would even work) but it would be easier / better if there was another way.

Thanks for any help

OTHER TIPS

This is a quick way to do it also. This uses SSH remote commands and pipes to avoid temp files.

mysql -e 'DROP DATABASE stag_dbname;'
ssh prod.foo.com mysqldump -uprodsqluser -pprodsqlpw prod_dbname | gzip -c | gunzip -c | mysql stag_dbname

Here's my deployment snippet:

namespace :deploy do
  task :clone_production_database, :except => { :no_release => true } do
    mysql_user = "username"
    mysql_password = "s3C_re"
    production_database = "production"
    preview_database = "preview"
    run "mysql -u#{mysql_user} -p#{mysql_password} --execute='CREATE DATABASE IF NOT EXISTS #{preview_database}';"
    run "mysqldump -u#{mysql_user} -p#{mysql_password} #{production_database} | mysql -u#{mysql_user} -p#{mysql_password} #{preview_database}"
  end
end
before "deploy:migrate", "deploy:clone_production_database"
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top