我目前使用下面的脚本备份网站,但可以大大改进!请问您能否提出任何改进建议,或者可能是替代解决方案?
目前,我只是在达到大量资金后才删除项目 - 这并不好。有没有人知道我如何删除一个月前的项目,或者在有五十个备份并开始删除最早的项目时开始删除?
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
答案 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天的内容?