Существует ли задача rake для резервного копирования данных в вашей базе данных?
-
09-06-2019 - |
Вопрос
Существует ли задача rake для резервного копирования данных в вашей базе данных?
У меня уже есть резервная копия моей схемы, но я хочу сделать резервную копию данных.Это небольшая база данных MySQL.
Решение
Приведенный ниже скрипт представляет собой упрощенную версию, взятую из 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 для запуска каждый день, и не должно быть слишком много работы по преобразованию этого для запуска как задачи rake, поскольку это уже Ruby-код (также может быть хорошим учебным упражнением).
Расскажите нам, как это происходит!
Есть такие a немногие Решения уже есть в Google.Я предполагаю, что вы используете activerecord в качестве своего orm?
Если вы используете rails, то вы можете просмотреть файл Rakefile, который он использует для activerecord в uby\lib uby\gems\1.8\gems ails-2.0.2-\lib asks\database.rake.Это дало мне много информации о том, как расширить общий файл Rakefile.
Вы могли бы взять на себя задачи капистрано, которые телсдж предоставляет, и добавьте его в свой файл rake.Затем немного измените его, чтобы он использовал подключение activerecord к базе данных.
Там есть плагин под названием "mysql tasks", просто погуглите его.Это просто файл rakefile - я нашел его очень простым в использовании.
На всякий случай, если люди все еще ищут решения, в настоящее время мы используем плагин ar_fixtures для резервного копирования нашей базы данных, а также в любом случае как часть решения.
Это обеспечивает грабли db:fixtures:dump
задачи.Это выплевывает все, что есть в YAML, в test / fixtures, поэтому его можно загрузить снова, используя db:fixtures:load
.
Мы используем это для резервного копирования перед запуском каждой функции в производство.Мы также использовали это при переходе с sqlite3 на Postgres - тонкость, очень полезная, поскольку несовместимости между диалектами SQL по большей части скрыты.
Всего наилучшего, Д
Обязательно добавьте параметр "--routines" в mysqldump, если у вас есть какие-либо сохраненные процедуры в вашей базе данных, чтобы они также создавали резервные копии.
Существует моя задача rake по резервному копированию 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