是否有rake任务来备份数据库中的数据?
是否有rake任务来备份数据库中的数据?
我已经备份了架构,但是我想备份数据。这是一个小型MySQL数据库。
解决方案
回答
以下脚本是从eycap(特别是从此文件中)获取的简化版本。
set :dbuser "user" set :dbhost "host" set :database "db" namespace :db do desc "Get the database password from user" task :get_password do set(:dbpass) do Capistrano::CLI.ui.ask "Enter mysql password: " end end task :backup_name, :only => { :primary => true } do now = Time.now run "mkdir -p #{shared_path}/db_backups" backup_time = [now.year,now.month,now.day,now.hour,now.min,now.sec].join('-') set :backup_file, "#{shared_path}/db_backups/#{database}-snapshot-#{backup_time}.sql" end desc "Dump database to backup file" task :dump, :roles => :db, :only => {:primary => true} do backup_name run "mysqldump --add-drop-table -u #{dbuser} -h #{dbhost} -p#{dbpass} #{database} | bzip2 -c > #{backup_file}.bz2" end end
编辑:是的,我想我错过了要寻找耙子任务而不是Capistrano任务的要点,但是抱歉,我手头没有耙子。
回答
我没有用于备份MySQL数据库的rake任务,但是我确实在Ruby中编写了一个脚本来为WordPress DB做到这一点:
filename = 'wp-config.php' def get_db_info(file) username = nil password = nil db_name = nil file.each { |line| if line =~ /'DB_(USER|PASSWORD|NAME)', '([[:alnum:]]*)'/ if == "USER" username = elsif == "PASSWORD" password = elsif == "NAME" db_name = end end } if username.nil? || password.nil? || db_name.nil? puts "[backup_db][bad] couldn't get all needed info" exit end return username, password, db_name end begin config_file = open("#{filename}") rescue Errno::ENOENT puts "[backup_db][bad] File '#{filename}' didn't exist" exit else puts "[backup_db][good] File '#{filename}' existed" end username, password, db_name = get_db_info(config_file) sql_dump_info = `mysqldump --user=#{username} --password=#{password} #{dbname}` puts sql_dump_info
我们应该可以接受此操作,并对其进行一些适当的修剪,以放入用户名/密码/ dbname来进行设置并为我们工作。我把它放在crontab中也可以每天运行,将它转换成rake任务也不必花太多功夫,因为它已经是Ruby代码了(可能也是很好的学习方法)。
告诉我们情况如何!
回答
Google已经有一些解决方案。我猜我们正在使用activerecord作为orm?
如果我们正在运行rails,则可以在\ ruby \ lib \ ruby \ gems \ 1.8 \ gems \ rails-2.0.2- \ lib \ tasks \ database.rake中查看它用于activerecord的Rakefile。这给了我很多有关如何扩展通用Rakefile的信息。
我们可以执行thelsdj提供的capistrano任务,并将其添加到rake文件中。然后对其进行一些修改,以使其使用到数据库的activerecord连接。
回答
如果数据库中有存储的proc,请确保将" --routines"参数添加到mysqldump中,以便它也备份它们。
回答
有一个名为" mysql任务"的插件,只是谷歌。这只是一个rakefile-我发现它非常易于使用。
回答
以防万一人们仍在寻找解决方案,我们目前使用ar_fixtures插件来备份数据库,以及作为解决方案的一部分。
它提供了rakedb:fixtures:dump
任务。这会将YAML中的所有内容吐出到测试/夹具中,因此可以使用db:fixtures:load再次加载它。
在每个功能投入生产之前,我们都会使用它进行备份。从sqlite3迁移到Postgres时,我们也使用了此方法,这非常有用,因为在很大程度上隐藏了SQL方言之间的不兼容性。
祝一切顺利,D