5

データベース内のデータをバックアップするための rake タスクはありますか?

既にスキーマをバックアップしていますが、データのバックアップを作成したいと考えています。これは小さな MySQL データベースです。

4

7 に答える 7

5

以下のスクリプトは、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

編集:ええ、私はあなたがカピストラーノタスクではなくレーキタスクを探していたという点を見逃したと思いますが、手元にレーキタスクがありません。

于 2008-08-26T05:28:39.190 に答える
1

人々がまだソリューションを探している場合に備えて、現在、ar_fixtures プラグインを使用してデータベースをバックアップしていますが、とにかくソリューションの一部です。

レーキタスクを提供しますdb:fixtures:dump。これにより、YAML のすべてがテスト/フィクスチャに吐き出されるため、db:fixtures:load.

これを使用して、すべての機能を本番環境にプッシュする前にバックアップします。また、sqlite3 から Postgres に移行するときにもこれを使用しました。これは、SQL ダイアレクト間の非互換性がほとんどの場合隠されているため、非常に便利です。

万歳、D

于 2009-07-15T14:26:53.323 に答える
1

There's a plugin out there called "mysql tasks", just google for it. It's just a rakefile -- I've found it very easy to use.

于 2008-09-10T05:14:27.430 に答える
1

MySQL データベースをバックアップするための rake タスクはありませんが、Ruby でスクリプトを作成して、WordPress DB をバックアップしました。

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

これを取得して、ユーザー名/パスワード/データベース名を入力して動作させるために、いくつかの穏やかなプルーニングを実行できるはずです。毎日実行するように crontab に入れましたが、これはすでに Ruby コードであるため、rake タスクとして実行するように変換するのはそれほど面倒なことではありません (学習にも役立つかもしれません)。

それがどうなるか教えてください!

于 2008-08-26T07:12:22.763 に答える
1

Googleにはすでにいくつか ソリューションがあります。orm として ActiveRecord を使用していると思いますか?

Rails を実行している場合は、\ruby\lib\ruby\gems\1.8\gems\rails-2.0.2-\lib\tasks\database.rake でアクティブ レコードに使用する Rakefile を確認できます。これにより、一般的な Rakefile を拡張する方法に関する多くの情報が得られました。

thelsdjが提供する capistrano タスクを取得して、rake ファイルに追加することができます。次に、データベースへのアクティブレコード接続を使用するように少し変更します。

于 2008-08-26T07:29:03.033 に答える
0

データベースにストアドプロシージャがある場合は、必ず「--routines」パラメータをmysqldumpに追加して、それらもバックアップするようにしてください。

于 2008-08-27T00:53:49.187 に答える