5

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

我已经备份了架构,但我想备份数据。这是一个小型的 MySQL 数据库。

4

7 回答 7

5

下面的脚本是取自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 任务的观点,但我手头没有耙子,抱歉。

于 2008-08-26T05:28:39.190 回答
1

我没有备份我的 MySQL 数据库的 rake 任务,但我确实在 Ruby 中编写了一个脚本来为我的 WordPress 数据库执行此操作:

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 $1 == "USER"
        username = $2
      elsif $1 == "PASSWORD"
        password = $2
      elsif $1 == "NAME"
        db_name = $2
      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 代码(也可能是一个很好的学习练习)。

告诉我们进展如何!

于 2008-08-26T07:12:22.763 回答
1

谷歌上已经有一些解决方案 我猜你正在使用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 连接。

于 2008-08-26T07:29:03.033 回答
1

那里有一个名为“mysql tasks”的插件,只需谷歌即可。它只是一个 rakefile——我发现它非常易于使用。

于 2008-09-10T05:14:27.430 回答
1

以防万一人们仍在寻找解决方案,我们目前使用 ar_fixtures 插件来备份我们的数据库,无论如何它也是解决方案的一部分。

它提供了 rakedb:fixtures:dump任务。这会将 YAML 中的所有内容都输出到测试/夹具中,因此可以使用db:fixtures:load.

在将每个功能推向生产之前,我们都会使用它来备份。我们在从 sqlite3 迁移到 Postgres 时也使用了它——这非常有用,因为 SQL 方言之间的不兼容性在很大程度上是隐藏的。

一切顺利,D

于 2009-07-15T14:26:53.323 回答
0

如果您的数据库中有任何存储的过程,请确保将“--routines”参数添加到 mysqldump,以便它也备份它们。

于 2008-08-27T00:53:49.187 回答
0

我的 rake 任务是备份 mysql,并循环轮换备份。

#encoding: utf-8
#require 'fileutils'

namespace :mls do
  desc 'Create of realty_dev database backup'

  task :backup => :environment do
    backup_max_records = 4
    datestamp = Time.now.strftime("%Y-%m-%d_%H-%M")
    backup_dir = File.join(Rails.root, ENV['DIR'] || 'backups', 'db')
    backup_file_name = "#{datestamp}_#{Rails.env}_dump.sql"
    backup_file_path = File.join(backup_dir, "#{backup_file_name}")
    FileUtils.mkdir_p(backup_dir)

    #database processing
    db_config = ActiveRecord::Base.configurations[Rails.env]
    system "mysqldump -u#{db_config['username']} -p#{db_config['password']} -i -c -q #{db_config['database']} > #{backup_file_path}"
    raise 'Unable to make DB backup!' if ($?.to_i > 0)

    # sql dump file compression
    system "gzip -9 #{backup_file_path}"

    # backup rotation
    dir = Dir.new(backup_dir)
    backup_all_records = dir.entries.sort[2..-1].reverse
    puts "Created backup: #{backup_file_name}.gz"
    #redundant records
    backup_del_records = backup_all_records[backup_max_records..-1] || []

    # backup deleting too old records
    for backup_del_record in backup_del_records
      FileUtils.rm_rf(File.join(backup_dir, backup_del_record))
    end

    puts "Deleted #{backup_del_records.length} old backups, #{backup_all_records.length - backup_del_records.length} backups available"
    puts "Backup passed"
  end
end

=begin
 run by this command: " rake db:backup RAILS_ENV="development" "
=end
于 2013-11-01T15:51:29.940 回答