Gibt es eine Rake-Aufgabe zum Sichern der Daten in Ihrer Datenbank?
-
09-06-2019 - |
Frage
Gibt es eine Rake-Aufgabe zum Sichern der Daten in Ihrer Datenbank?
Ich habe mein Schema bereits gesichert, möchte aber eine Sicherungskopie der Daten erstellen.Es ist eine kleine MySQL-Datenbank.
Lösung
Das folgende Skript ist eine vereinfachte Version aus eycap, konkret von Diese Datei.
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
Bearbeiten:Ja, ich glaube, ich habe den Punkt übersehen, dass Sie nach einer Rake-Aufgabe und nicht nach einer Capistrano-Aufgabe gesucht haben, aber ich habe keine Rake-Aufgabe zur Hand, tut mir leid.
Andere Tipps
Ich habe keine Rake-Aufgabe zum Sichern meiner MySQL-Datenbank, aber ich habe in Ruby ein Skript geschrieben, um genau das für meine WordPress-Datenbank zu tun:
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
Sie sollten in der Lage sein, dies zu nehmen und es leicht zu bereinigen, um Ihren Benutzernamen/Passwort/Datenbanknamen einzugeben, damit es für Sie funktioniert.Ich habe es auch in meine Crontab eingefügt, um es jeden Tag auszuführen, und es sollte nicht zu viel Arbeit sein, es so zu konvertieren, dass es als Rake-Aufgabe ausgeführt wird, da es sich bereits um Ruby-Code handelt (könnte auch eine gute Lernübung sein).
Sagen Sie uns, wie es läuft!
Es gibt A wenige Lösungen schon bei Google.Ich gehe davon aus, dass Sie ActiveRecord als Orm verwenden?
Wenn Sie Rails ausführen, können Sie sich die Rake-Datei ansehen, die für ActiveRecord in uby\lib uby\gems\1.8\gems ails-2.0.2-\lib asks\database.rake verwendet wird.Dadurch habe ich viele Informationen darüber erhalten, wie ich das generische Rakefile erweitern kann.
Du könntest die Capistrano-Aufgaben übernehmen thelsdj bereitstellt, und fügen Sie es Ihrer Rake-Datei hinzu.Ändern Sie es dann ein wenig, sodass die ActiveRecord-Verbindung zur Datenbank verwendet wird.
Es gibt ein Plugin namens „MySQL-Aufgaben“, googeln Sie einfach danach.Es ist nur ein Rakefile – ich fand es sehr einfach zu verwenden.
Für den Fall, dass die Leute immer noch nach Lösungen suchen: Wir verwenden derzeit das Plugin ar_fixtures, um unsere Datenbank zu sichern, sowieso als Teil der Lösung.
Es liefert den Rechen db:fixtures:dump
Aufgaben.Dadurch wird alles in YAML in Test/Fixtures ausgespuckt, sodass es erneut geladen werden kann db:fixtures:load
.
Wir verwenden dies zur Sicherung vor jedem Feature-Push in die Produktion.Wir haben dies auch bei der Migration von sqlite3 zu Postgres verwendet – was sehr nützlich ist, da Inkompatibilitäten zwischen SQL-Dialekten größtenteils verborgen sind.
Alles Gute, D
Stellen Sie sicher, dass Sie den Parameter „--routines“ zu mysqldump hinzufügen, wenn Sie in Ihrer Datenbank gespeicherte Prozesse haben, damit diese ebenfalls gesichert werden.
Es gibt meine Rake-Aufgabe, MySQL zu sichern und Backups zyklisch zu rotieren.
#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