هل هناك مهمة أشعل النار لإجراء نسخ احتياطي للبيانات في قاعدة البيانات الخاصة بك؟
-
09-06-2019 - |
سؤال
هل هناك مهمة أشعل النار لإجراء نسخ احتياطي للبيانات في قاعدة البيانات الخاصة بك؟
لقد قمت بالفعل بنسخ المخطط احتياطيًا، ولكنني أرغب في عمل نسخة احتياطية من البيانات.إنها قاعدة بيانات 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