В настоящее время я использую script ниже для резервного копирования веб-сайта, но его можно значительно улучшить! Можете ли вы предложить какие-либо улучшения или, возможно, альтернативные решения?
В настоящее время я удаляю элементы только после того, как была достигнута огромная сумма - и это не хорошо. Кто-нибудь знает, как я могу удалить элементы, которые являются месяцами, или начать удаление при наличии пятидесяти резервных копий и начать сначала удалять самые старые элементы?
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
Мы используем этот script, который не такой сложный, как ваш, но делает более или менее одно и то же:
#!/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.
Обратите внимание: если он пропустит удаление, файл будет долгое время находиться в очереди - script удаляет только "вчерашний" файл, а не "все файлы старше X", что делает ваш script. Но вы, вероятно, можете взять некоторые идеи из этого и включить их в свой script.
почему не использовать 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" [email protected]
не удалять файл, история для всех дампов mysqls в зависимости от времени выполнения задания cron...
Поскольку вы уже установили отметку времени в своем резервном имени папки, почему бы вам не разобрать имя папки и удалить все временные метки, которые были старше 30 дней?