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.

Foi útil?

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!

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top