C'è un task rake per il backup dei dati nel database?
-
09-06-2019 - |
Domanda
C'è un task rake per il backup dei dati nel database?
Ho già un mio schema di backup, ma voglio fare una copia di backup dei dati.Si tratta di un piccolo database MySQL.
Soluzione
Il seguente script è una versione semplificata preso da eycap, più specificamente da questo file.
set :dbuser "user"
set :dbhost "host"
set :database "db"
namespace :db do
desc "Get the database password from user"
task :get_password do
set(:dbpass) do
Capistrano::CLI.ui.ask "Enter mysql password: "
end
end
task :backup_name, :only => { :primary => true } do
now = Time.now
run "mkdir -p #{shared_path}/db_backups"
backup_time = [now.year,now.month,now.day,now.hour,now.min,now.sec].join('-')
set :backup_file, "#{shared_path}/db_backups/#{database}-snapshot-#{backup_time}.sql"
end
desc "Dump database to backup file"
task :dump, :roles => :db, :only => {:primary => true} do
backup_name
run "mysqldump --add-drop-table -u #{dbuser} -h #{dbhost} -p#{dbpass} #{database} | bzip2 -c > #{backup_file}.bz2"
end
end
Edit:Sì, credo che ho perso il punto che è alla ricerca di una task rake e non un capistrano compito, ma non ho un rastrello uno a portata di mano, mi dispiace.
Altri suggerimenti
Non ho una task rake per il backup del mio db MySQL, ma ho fatto scrivere uno script in Ruby per fare proprio questo per il mio DB di WordPress:
filename = 'wp-config.php'
def get_db_info(file)
username = nil
password = nil
db_name = nil
file.each { |line|
if line =~ /'DB_(USER|PASSWORD|NAME)', '([[:alnum:]]*)'/
if $1 == "USER"
username = $2
elsif $1 == "PASSWORD"
password = $2
elsif $1 == "NAME"
db_name = $2
end
end
}
if username.nil? || password.nil? || db_name.nil?
puts "[backup_db][bad] couldn't get all needed info"
exit
end
return username, password, db_name
end
begin
config_file = open("#{filename}")
rescue Errno::ENOENT
puts "[backup_db][bad] File '#{filename}' didn't exist"
exit
else
puts "[backup_db][good] File '#{filename}' existed"
end
username, password, db_name = get_db_info(config_file)
sql_dump_info = `mysqldump --user=#{username} --password=#{password} #{dbname}`
puts sql_dump_info
Si dovrebbe essere in grado di prendere questo e fare una leggera potatura di mettere il tuo nome utente/password/nomedb per arrivare fino a lavorare per voi.L'ho messo nel mio crontab per eseguire tutti i giorni così, e non dovrebbe essere troppo lavoro per la conversione di eseguire un task rake poiché già il codice Ruby (che potrebbe essere anche un buon esercizio di apprendimento, come pure).
Dicci come va!
Ci sono un pochi soluzioni già su google.Ho intenzione di indovinare che si sta utilizzando activerecord come orm?
Se si esegue le rotaie, poi si può guarda il Rakefile che utilizza per activerecord, in uby\lib uby\gemme\1.8\gemme ails-2.0.2-\lib asks\database.rastrello.Che mi ha dato un sacco di informazioni su come estendere il generico Rakefile.
Si potrebbe prendere il capistrano attività che thelsdj fornisce, e aggiungerlo al tuo rake file.Quindi modificare un po ' in modo che utilizzi il activerecord connessione al database.
C'è un plugin là fuori chiamato "mysql compiti", solo su google.E ' solo un rakefile -- io l'ho trovato molto facile da usare.
Solo nel caso in cui le persone sono ancora surf per soluzioni attualmente in uso il ar_fixtures plugin per il backup del nostro db, così come parte della soluzione in ogni caso.
Esso fornisce il rastrello db:fixtures:dump
attività.Questo sputa fuori tutto in YAML, di test/infissi, in modo che possa essere caricato nel nuovo utilizzando db:fixtures:load
.
Usiamo questo per backup prima di ogni funzione push-to-produzione.Abbiamo usato anche questo quando si esegue la migrazione da sqlite3 per Postgres - che è la finezza molto utile per incompatibilità tra dialetti SQL sono, per la maggior parte, nascosto.
Tutti i migliori, D
Assicurarsi di aggiungere il "--routine" parametro di mysqldump se avete qualsiasi stored procedure nel database in modo che effettua anche per voi.
C'è il mio rastrello compito di eseguire il backup di mysql, e ruotare i backup in modo ciclico.
#encoding: utf-8
#require 'fileutils'
namespace :mls do
desc 'Create of realty_dev database backup'
task :backup => :environment do
backup_max_records = 4
datestamp = Time.now.strftime("%Y-%m-%d_%H-%M")
backup_dir = File.join(Rails.root, ENV['DIR'] || 'backups', 'db')
backup_file_name = "#{datestamp}_#{Rails.env}_dump.sql"
backup_file_path = File.join(backup_dir, "#{backup_file_name}")
FileUtils.mkdir_p(backup_dir)
#database processing
db_config = ActiveRecord::Base.configurations[Rails.env]
system "mysqldump -u#{db_config['username']} -p#{db_config['password']} -i -c -q #{db_config['database']} > #{backup_file_path}"
raise 'Unable to make DB backup!' if ($?.to_i > 0)
# sql dump file compression
system "gzip -9 #{backup_file_path}"
# backup rotation
dir = Dir.new(backup_dir)
backup_all_records = dir.entries.sort[2..-1].reverse
puts "Created backup: #{backup_file_name}.gz"
#redundant records
backup_del_records = backup_all_records[backup_max_records..-1] || []
# backup deleting too old records
for backup_del_record in backup_del_records
FileUtils.rm_rf(File.join(backup_dir, backup_del_record))
end
puts "Deleted #{backup_del_records.length} old backups, #{backup_all_records.length - backup_del_records.length} backups available"
puts "Backup passed"
end
end
=begin
run by this command: " rake db:backup RAILS_ENV="development" "
=end