Резервный скрипт базы данных Rails

0

В настоящее время я использую 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
  • 0
    Мне кажется, ваш скрипт уже поддерживает «начать удаление с 50 элементов и сначала удалить самые старые», просто передайте параметр MAX = 50.
  • 0
    Для людей, которые приходят сюда из Google, посмотрите резервный камень .
Теги:
rake

3 ответа

2
Лучший ответ

Мы используем этот 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.

1

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

0

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

  • 0
    Это не ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню