【问题标题】:Is there a rake task for backing up the data in your database?是否有用于备份数据库中数据的 rake 任务?
【发布时间】:2010-09-06 20:19:22
【问题描述】:

是否有用于备份数据库中数据的 rake 任务?

我已经备份了架构,但我想备份数据。这是一个小型的 MySQL 数据库。

【问题讨论】:

    标签: mysql ruby-on-rails ruby database rake


    【解决方案1】:

    我的 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
    

    【讨论】:

      【解决方案2】:

      以防万一人们仍在寻找解决方案,我们目前使用 ar_fixtures 插件来备份我们的数据库,无论如何它也是解决方案的一部分。

      它提供了 rake db:fixtures:dump 任务。这会将 YAML 中的所有内容都输出到测试/夹具中,因此可以使用 db:fixtures:load 再次加载它。

      我们使用它在每个功能推送到生产之前进行备份。我们在从 sqlite3 迁移到 Postgres 时也使用了它——这非常有用,因为 SQL 方言之间的不兼容在很大程度上是隐藏的。

      一切顺利,D

      【讨论】:

        【解决方案3】:

        那里有一个名为“mysql tasks”的插件,只需谷歌即可。它只是一个 rakefile——我发现它非常易于使用。

        【讨论】:

          【解决方案4】:

          如果您的数据库中有任何存储过程,请确保将“--routines”参数添加到 mysqldump,以便它也备份它们。

          【讨论】:

            【解决方案5】:

            谷歌上已经有afewsolutions。我猜你正在使用 activerecord 作为你的 orm?

            如果您正在运行 rails,那么您可以在 \ruby\lib\ruby\gems\1.8\gems\rails-2.0.2-\lib\tasks\database.rake 中查看它用于 activerecord 的 Rakefile。这给了我很多关于如何扩展通用 Rakefile 的信息。

            您可以将thelsdj 提供的 capistrano 任务添加到您的 rake 文件中。然后稍微修改一下,让它使用到数据库的 activerecord 连接。

            【讨论】:

              【解决方案6】:

              我没有备份我的 MySQL 数据库的 rake 任务,但我确实用 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 代码(可能也是一个很好的学习练习)。

              告诉我们进展如何!

              【讨论】:

                【解决方案7】:

                以下脚本是取自eycap 的简化版本,具体取自this file

                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 任务而不是 capistrano 任务的观点,但我手头没有一个 rake,抱歉。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2011-12-07
                  • 1970-01-01
                  • 2015-04-15
                  • 2017-10-16
                  • 2013-05-12
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多