Rails数据库备份脚本

时间:2010-10-05 11:48:19

标签: mysql ruby-on-rails rake

我目前使用下面的脚本备份网站,但可以大大改进!请问您能否提出任何改进建议,或者可能是替代解决方案?

目前,我只是在达到大量资金后才删除项目 - 这并不好。有没有人知道我如何删除一个月前的项目,或者在有五十个备份并开始删除最早的项目时开始删除?

require 'find' 
require 'ftools'
  namespace :db do  desc "Backup the database to a file. Options: DIR=base_dir 
RAILS_ENV=development MAX=20"
    task :backup => [:environment] do
      datestamp = Time.now.strftime("%d-%m-%Y_%H-%M-%S")    
      base_path = ENV["DIR"] || "db"
      backup_base = File.join(base_path, 'backup')
      backup_folder = File.join(backup_base, datestamp)
      backup_file = File.join(backup_folder, "#{RAILS_ENV}_dump.sql.gz")    
      File.makedirs(backup_folder)
      db_config = ActiveRecord::Base.configurations[RAILS_ENV]   
      sh "mysqldump -u #{db_config['username'].to_s} #{'-p' if db_config[
'password']}#{db_config['password'].to_s} --opt #{db_config['database']} | 
gzip -c > #{backup_file}"     
      dir = Dir.new(backup_base)
      all_backups = (dir.entries - ['.', '..']).sort.reverse
      puts "Created backup: #{backup_file}"     
      max_backups = ENV["MAX"] || 10000000
      unwanted_backups = all_backups[max_backups.to_i..-1] || []
      for unwanted_backup in unwanted_backups
      FileUtils.rm_rf(File.join(backup_base, unwanted_backup))
      puts "deleted #{unwanted_backup}"
    end
    puts "Deleted #{unwanted_backups.length} backups, #{all_backups.length - 
unwanted_backups.length} backups available"
  end
end

3 个答案:

答案 0 :(得分:2)

我们使用这个脚本,它不像你的那么复杂但是或多或少地做同样的事情:

#!/usr/bin/env ruby
require "date" 

DBS = %w( list the databases to back up )
USER = "" # Username with rights to all those databases, might be root 
PW = "" # Password for that username 

today_s = Date.today().to_s
yesterday_s = (Date.today()-(2)).to_s

DBS.each do |db|
  system "/usr/bin/mysqldump --user=#{USER} --password=#{PW} --add-drop-database --opt -icC #{db} > ~/dbs/#{today_s}-#{db}.sql" 
  if File.exist?("/path/to/backups/dbs/#{yesterday_s}-#{db}.sql")
    File.unlink("/path/to/backups/dbs/#{yesterday_s}-#{db}.sql")
  end
end

然后我们定期用cron运行它(4x / day,但显然我们每天只保留最新的一个,因为每天的后一个将覆盖之前的那些)。它保留了两天的备份;我们有一个远程服务器,它使用scp每天复制整个/path/to/backups/dbs/目录,并保留备份,直到我们有时间将它们刻录到DVD-ROM。

请注意,如果它错过了删除,文件将会暂停一段时间 - 该脚本只会删除“昨天”文件,而不是“脚本执行的所有早于X的文件”。但您可以从中获取一些想法并将它们合并到您的脚本中。

答案 1 :(得分:1)

为什么不使用git和cron job?

git setup:

cd /PATH/TO/EXPORTFILE/
git init .
git add .
git commit -am "init commit"

cron job:

mysqldump -uUSER -pPASSWORD --skip-extended-insert DBNAME > /PATH/TO/EXPORTFILE/FILENAME.SQL && \
cd /PATH/TO/EXPORTFILE/ && \
git add . && \
git commit -am "MYSQL BACKUP" |  mail -s "MYSQL BACKUP CRON JOB" your@emailaddress.com

没有删除文件,所有mysqls转储的历史记录取决于cron作业执行时间...

答案 2 :(得分:0)

由于您已将时间戳记放在备份文件夹名称中,为什么不解析文件夹名称并删除时间戳超过30天的内容?