Existe-t-il une tâche Rake pour sauvegarder les données de votre base de données ?
-
09-06-2019 - |
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.
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