2008-08-26 35 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