【问题标题】:Rails Database Back-up ScriptRails 数据库备份脚本
【发布时间】:2010-10-05 11:48:18
【问题描述】:

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

目前,我只在达到大量数量后才删除项目 - 这并不好。有谁知道我如何删除一个月前的项目,或者在有 50 个备份时开始删除并首先开始删除最旧的项目?

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

【问题讨论】:

  • 在我看来您的脚本已经支持“从 50 个项目开始删除并首先删除最旧的项目”,只需传递 MAX=50 参数即可。
  • 对于从 Google 来到这里的人,请查看 backup gem

标签: mysql ruby-on-rails rake


【解决方案1】:

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

#!/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 运行它(每天 4 次,但显然我们只保留每天最近的一个,因为每天后面的会覆盖之前的)。它保留两天的备份;我们有一个远程服务器,它使用scp 每天两次复制整个/path/to/backups/dbs/ 目录,并且该服务器会保留备份,直到我们有时间将它们刻录到 DVD-ROM。

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

【讨论】:

    【解决方案2】:

    为什么不将 git 与 cron 作业一起使用?

    git 设置:

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

    cron 作业:

    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 作业执行时间...

    【讨论】:

      【解决方案3】:

      既然您已经在备份文件夹名称中添加了时间戳,为什么不解析文件夹名称并删除时间戳超过 30 天的任何内容?

      【讨论】:

      • 这不是答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多