2012-07-25 29 views
7

我正在开发一个Rails项目,有时我在家里编程,有时在工作。在我的开发过程中,我将数据添加到数据库中,而且我真的需要一种方法来同步家中和工作中的数据库。Rake任务来备份和恢复数据库

我在考虑Rake任务来备份/恢复Rails应用程序中的整个数据库。
有没有办法做到这一点?

回答

15

写rake任务:

namespace :db do 
    task :backup do 
    system "mysqldump --opt --user=root --password rose userdetails> xyz.sql" 
    end 

    task :restore do 
    system "mysqldump --user=root --password < xyz.sql" 
    end 
end 

通过rake db:backup你会得到你可以提交你的Git/SVN,一旦你在家工作,以恢复它拉和运行rake db:restore

+3

这的sql是一个很好的解决方案,作为额外的好处,它可以从database.yml文件读取用户名/密码。 – 2012-07-25 18:44:53

+3

还原任务的唯一问题是,mysqldump为每个表写入一个“DROP TABLE”,然后写入“CREATE TABLE ...”。如果您编写添加表的迁移,然后在没有正确迁移的情况下运行'rake db:restore',则额外的表将不会被删除(因为它们不会被mysqldump写入)。所以如果你想要一个“真正的”还原,你应该先删除所有现有的表,然后加载.sql文件。 – istrasci 2013-09-05 18:12:38

4

我使用将数据库转储到特定位置的脚本,第二次提取转储并使用它来还原指定的数据库。我用的是每当宝石来安排日常备份(通过调用第一个脚本),通过将这种在schedule.rb文件:

every :day, :at => "05:00" do 
    command "/var/www/current/script/db_backup.sh -n #{@db_name}" 
    end 

脚本的确切内容取决于你所使用的数据库。由于我使用PostgreSQL,备份脚本,搞清楚正确的位置转储后,运行的pg_dump:

pg_dump -F t -U username -f file_location<timestamp>.dat database_name 

和“恢复”的脚本,我用它来制作备份复制到本地数据库测试中,使用pg_restore的:

pg_restore -U username -O -x -d database_name_new path/to/file 

如果你使用的是其他数据库,这些工具显然是不同的,但大多数数据库支持的备份和恢复以某种形式。