Question

Existe-t-il une tâche Rake pour sauvegarder les données de votre base de données ?

J'ai déjà sauvegardé mon schéma, mais je souhaite faire une sauvegarde des données.C'est une petite base de données MySQL.

Était-ce utile?

La solution

Le script ci-dessous est une version simplifiée tirée de oeillet, spécifiquement de ce fichier.

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

Modifier:Ouais, je suppose que j'ai raté le fait que vous recherchiez une tâche de râteau et non une tâche de capistrano, mais je n'en ai pas sous la main, désolé.

Autres conseils

Je n'ai pas de tâche de sauvegarde pour sauvegarder ma base de données MySQL, mais j'ai écrit un script en Ruby pour faire exactement cela pour ma base de données 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

Vous devriez être en mesure de prendre ceci et d'en faire un léger élagage pour y insérer votre nom d'utilisateur/mot de passe/nom de base de données afin de le faire fonctionner pour vous.Je l'ai mis dans ma crontab pour qu'il s'exécute également tous les jours, et cela ne devrait pas être trop de travail de le convertir pour qu'il s'exécute comme une tâche rake car il s'agit déjà de code Ruby (cela pourrait aussi être un bon exercice d'apprentissage).

Racontez-nous comment ça se passe !

Il y a un peu solutions déjà sur google.Je vais supposer que vous utilisez activerecord comme orm ?

Si vous exécutez Rails, vous pouvez consulter le fichier Rakefile qu'il utilise pour activerecord dans uby\lib uby\gems\1.8\gems ails-2.0.2-\lib asks\database.rake.Cela m'a donné beaucoup d'informations sur la façon d'étendre le Rakefile générique.

Tu pourrais prendre les tâches de Capistrano qui thelsdj fournit et ajoutez-le à votre fichier rake.Modifiez-le ensuite un peu pour qu'il utilise la connexion activerecord à la base de données.

Il existe un plugin appelé "tâches MySQL", il suffit de le rechercher sur Google.C'est juste un rakefile – je l'ai trouvé très facile à utiliser.

Juste au cas où les gens chercheraient encore des solutions, nous utilisons actuellement le plugin ar_fixtures pour sauvegarder notre base de données, ainsi qu'une partie de la solution de toute façon.

Il fournit le râteau db:fixtures:dump Tâches.Cela crache tout ce qui se trouve dans YAML dans des tests/appareils, afin qu'il puisse être chargé à nouveau en utilisant db:fixtures:load.

Nous l'utilisons pour effectuer une sauvegarde avant chaque mise en production de chaque fonctionnalité.Nous l'avons également utilisé lors de la migration de sqlite3 vers Postgres - ce qui est subtilement très utile car les incompatibilités entre les dialectes SQL sont, pour la plupart, cachées.

Tout le meilleur, D

Assurez-vous d'ajouter le paramètre "--routines" à mysqldump si vous avez des procédures stockées dans votre base de données afin qu'il les sauvegarde également.

Il y a ma tâche de rake pour sauvegarder MySQL et faire pivoter les sauvegardes de manière cyclique.

#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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top