Rails: Best way to make changes to a production database Rails: Best way to make changes to a production database ruby-on-rails ruby-on-rails

Rails: Best way to make changes to a production database


I always follow this procedure:

  • Dump prod database with mysqldump command
  • Populate dev / test database with dump using mysql command
  • Run migrations in dev / test
  • Check migration worked
  • Dump prod database with mysqldump command (as it may have changed) keeping backup on server
  • Run migrations on prod (using capristano)
  • Test migration has worked on prod
  • Drink beer (while watching error logs)


It sounds like you're in a state where the production db schema doesn't exactly match what you're using in dev (although it's not totally clear). I would draw a line in the sand, and get that prod db in a better state. Essentially what you want to do is make sure that the prod db has a "schema_info" table that lists any migrations that you >don't< ever want to run in production. Then you can add migrations to your hearts content and they'll work against the production db.

Once you've done that you can write migrations that add schema changes or add data, but one thing you need to be really careful about is that if you add data using a migration, you must define the model within the migration itself, like this:

class AddSomeColumnsToUserTable < ActiveRecord::Migration  class User < ActiveRecord::Base; end  def self.up    add_column :users, :super_cool, :boolean, :default => :false    u = User.find_by_login('cameron')    u.super_cool = true    u.save  end  def self.down    remove_column :users, :super_cool  endend

The reason for this is that in the future, you might remove the model altogether, during some refactoring or other. If you don't define the user class on line "User.find_by_login..." the migration will throw an exception which is a big pain.


Is there a reason you are not using the same migrations you used in your dev environment?