Existe uma tarefa rake para fazer backup dos dados em seu banco de dados?
-
09-06-2019 - |
Pergunta
Existe uma tarefa rake para fazer backup dos dados em seu banco de dados?
Já tenho backup do meu esquema, mas quero fazer um backup dos dados.É um pequeno banco de dados MySQL.
Solução
O script abaixo é uma versão simplificada retirada de eycap, especificamente de este ficheiro.
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
Editar:Sim, acho que não entendi que você estava procurando uma tarefa de rake e não uma tarefa de capistrano, mas não tenho uma tarefa de rake em mãos, desculpe.
Outras dicas
Não tenho uma tarefa rake para fazer backup do meu banco de dados MySQL, mas escrevi um script em Ruby para fazer exatamente isso no meu banco de dados 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
Você deve ser capaz de pegar isso e fazer uma leve poda para inserir seu nome de usuário/senha/nome do banco de dados para que ele funcione para você.Eu coloquei no meu crontab para rodar todos os dias também, e não deve ser muito trabalhoso convertê-lo para rodar como uma tarefa rake, já que já é um código Ruby (pode ser um bom exercício de aprendizado também).
Conte-nos como foi!
Há a alguns soluções já está no google.Suponho que você esteja usando o activerecord como seu formulário.
Se você estiver executando o Rails, poderá consultar o Rakefile que ele usa para o activerecord em uby\lib uby\gems\1.8\gems ails-2.0.2-\lib asks\database.rake.Isso me deu muitas informações sobre como estender o Rakefile genérico.
Você poderia assumir as tarefas capistrano que thelsdj fornece e adicione-o ao seu arquivo rake.Em seguida, modifique-o um pouco para que ele use a conexão activerecord com o banco de dados.
Existe um plugin chamado "tarefas mysql", basta pesquisar no Google.É apenas um rakefile – achei muito fácil de usar.
Caso as pessoas ainda estejam procurando soluções, atualmente usamos o plugin ar_fixtures para fazer backup de nosso banco de dados, bem como parte da solução de qualquer maneira.
Ele fornece o ancinho db:fixtures:dump
tarefas.Isso coloca tudo em YAML em testes/fixtures, para que possa ser carregado novamente usando db:fixtures:load
.
Usamos isso para fazer backup antes de cada recurso ser enviado para produção.Também usamos isso ao migrar do sqlite3 para o Postgres - o que é sutilmente muito útil, pois as incompatibilidades entre dialetos SQL são, em sua maioria, ocultas.
Tudo de bom, D.
Certifique-se de adicionar o parâmetro "--routines" ao mysqldump se você tiver algum proc armazenado em seu banco de dados, para que ele também faça backup deles.
Existe minha tarefa rake para fazer backup do mysql e girar os backups ciclicamente.
#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