هل هناك مهمة أشعل النار لإجراء نسخ احتياطي للبيانات في قاعدة البيانات الخاصة بك؟

StackOverflow https://stackoverflow.com/questions/27442

سؤال

هل هناك مهمة أشعل النار لإجراء نسخ احتياطي للبيانات في قاعدة البيانات الخاصة بك؟

لقد قمت بالفعل بنسخ المخطط احتياطيًا، ولكنني أرغب في عمل نسخة احتياطية من البيانات.إنها قاعدة بيانات MySQL صغيرة.

هل كانت مفيدة؟

المحلول

البرنامج النصي أدناه هو نسخة مبسطة مأخوذة من com.eycap, ، وتحديداً من هذا الملف.

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

يحرر:نعم، أعتقد أنني فاتني النقطة التي كنت تبحث فيها عن مهمة أشعل النار وليس مهمة كابيسترانو، لكن ليس لدي مهمة أشعل النار في متناول اليد، آسف.

نصائح أخرى

ليس لدي مهمة Rake لعمل نسخة احتياطية من قاعدة بيانات MySQL الخاصة بي، لكنني قمت بكتابة برنامج نصي في Ruby للقيام بذلك لقاعدة بيانات 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

يجب أن تكون قادرًا على أخذ هذا وإجراء بعض التهذيب البسيط له لوضع اسم المستخدم/كلمة المرور/اسم dbname الخاص بك لتنشيطه والعمل من أجلك.لقد وضعته في crontab الخاص بي ليتم تشغيله كل يوم أيضًا، ولا ينبغي أن يتطلب الأمر الكثير من العمل لتحويله ليتم تشغيله كمهمة أشعل النار نظرًا لأنه كود روبي بالفعل (قد يكون تمرينًا تعليميًا جيدًا أيضًا).

أخبرنا كيف ستسير الأمور!

هناك أ عدد قليل حلول بالفعل على جوجل.سأخمن أنك تستخدم activerecord كوالدك؟

إذا كنت تقوم بتشغيل Rails، فيمكنك إلقاء نظرة على ملف Rakefile الذي يستخدمه لـ activerecord في uby\lib uby\gems\1.8\gems ails-2.0.2-\lib asks\database.rake.لقد أعطاني ذلك الكثير من المعلومات حول كيفية توسيع ملف Rakefile العام.

يمكنك أن تأخذ مهام الكابسترانو thelsdj يوفر، وإضافته إلى ملف Rake الخاص بك.ثم قم بتعديله قليلاً بحيث يستخدم اتصال activerecord بقاعدة البيانات.

يوجد مكون إضافي يسمى "مهام MySQL"، ما عليك سوى البحث عنه في Google.إنه مجرد ملف rakefile - لقد وجدته سهل الاستخدام للغاية.

فقط في حالة استمرار الأشخاص في البحث عن حلول، فإننا نستخدم حاليًا المكون الإضافي ar_fixtures لعمل نسخة احتياطية من قاعدة بياناتنا، بالإضافة إلى جزء من الحل على أي حال.

ويوفر أشعل النار db:fixtures:dump مهام.يؤدي هذا إلى إخراج كل شيء في YAML إلى اختبار/تركيبات، بحيث يمكن تحميله مرة أخرى باستخدام db:fixtures:load.

نحن نستخدم هذا للنسخ الاحتياطي قبل دفع كل ميزة إلى الإنتاج.لقد استخدمنا هذا أيضًا عند الترحيل من sqlite3 إلى Postgres - وهو أمر مفيد جدًا نظرًا لأن عدم التوافق بين لهجات SQL يكون مخفيًا في معظم الأحيان.

كل التوفيق، د

تأكد من إضافة المعلمة "--routines" إلى mysqldump إذا كان لديك أي إجراءات مخزنة في قاعدة البيانات الخاصة بك بحيث يتم نسخها احتياطيًا أيضًا.

هناك مهمة أشعل النار الخاصة بي لإجراء نسخ احتياطي لـ MySQL، وتدوير النسخ الاحتياطية بشكل دوري.

#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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top