Резервный скрипт базы данных Rails - PullRequest
0 голосов
/ 05 октября 2010

В настоящее время я использую приведенный ниже скрипт для резервного копирования сайта, но его можно значительно улучшить! Не могли бы вы предложить какие-либо улучшения или альтернативные решения?

В настоящее время я удаляю предметы только после того, как было достигнуто огромное количество - и это не хорошо. Кто-нибудь знает, как я могу удалить элементы, которым больше месяца, или начать удалять, когда существует пятьдесят резервных копий, и начать сначала удалять самые старые элементы?

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 ]

2 голосов
/ 06 октября 2010

Мы используем этот скрипт, который не такой сложный, как ваш, но делает более или менее то же самое:

#!/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/ два раза в день, и тот хранит резервные копии до тех пор, пока у нас не будет времени записать их на DVD-диск.

Обратите внимание, что если он пропуститудаление файла будет зависать довольно долго - скрипт удаляет только «вчерашний» файл, а не «все файлы старше X», что делает ваш скрипт.Но вы, вероятно, можете взять некоторые идеи из этого и включить их в свой сценарий.

1 голос
/ 14 марта 2011

почему не использовать 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 ...

0 голосов
/ 06 октября 2010

Поскольку вы уже поместили метку времени в имя своей резервной копии, почему бы вам не проанализировать имя папки и не удалить то, что имеет метку времени старше 30 дней?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...