代码之家  ›  专栏  ›  技术社区  ›  amaseuk

Rails数据库备份脚本

  •  0
  • amaseuk  · 技术社区  · 14 年前

    目前,我只删除项目后,大量已经达到-这是不好的。有人知道我如何删除一个月前的项目,或者在有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
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   pjmorse    14 年前

    我们使用这个脚本,它不像你的脚本那么复杂,但做的事情大致相同:

    #!/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/天,但显然我们只保留每天最新的一个,因为每天后面的会覆盖前面的)。它保存了两天的备份;我们有一个远程服务器 scp 复制整个 /path/to/backups/dbs/

    请注意,如果未删除某个文件,该文件将挂起相当长的一段时间——脚本只删除“昨天的”文件,而不删除“X以前的所有文件”,您的脚本会这样做。但是你可以从中得到一些想法,并将它们融入到你的剧本中。

        2
  •  1
  •   fluxsaas    13 年前

    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
  •  0
  •   leonkhu    14 年前

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