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.

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top