是否有rake任务来备份数据库中的数据?

时间:2020-03-05 18:43:09  来源:igfitidea点击:

是否有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