2008-08-26 36 views

回答

5

下面的脚本是取自eycap的简化版本,具体来说是this file

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 

编辑:是的,我想我错过了你正在寻找一个rake任务,而不是一个Capistrano的任务了点,但我没有手头上有一个耙,对不起。

1

我没有备份我的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 $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 

您应该能够借此并对其进行一些修改,以便输入用户名/密码/数据库名称以便为您解决问题。我把它放在我的crontab中以便每天运行,因为它已经是Ruby代码(可能是一个很好的学习练习),所以将它转换为rake任务并不需要太多工作。

告诉我们它是怎么回事!

1

还有afewsolutions已经在谷歌上。我会猜测你使用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连接到数据库。

0

如果您的数据库中有任何存储的特效,请务必将“--routines”参数添加到mysqldump中,以便将其备份。

1

有一个名为“mysql任务”的插件,只是谷歌它。这只是一个rakefile - 我发现它非常易于使用。

1

为了防止人们仍在冲浪解决方案,我们目前使用ar_fixtures插件来备份我们的数据库,以及解决方案的一部分。

它提供了耙db:fixtures:dump任务。这将YAML中的所有东西都吐出到测试/夹具中,因此可以使用db:fixtures:load重新装入。

我们在每次功能推送到生产之前使用它进行备份。在从sqlite3迁移到Postgres时,我们也使用了这种方法 - 这非常有用,因为SQL方言之间的不兼容性在很大程度上隐藏了。

一切顺利,d

0

还有就是我的耙任务备份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