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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top