MSSQL 2008 の 400 万レコードの csv ファイルがあり、そのファイルを heroku の postgresql にインポートしたいと考えています。データを移行するスクリプトを用意しましたが、読み込みに時間がかかりすぎます。複数のファイルに分割しようとしましたが、やはり時間がかかりすぎます。
ローカル PC でインポートを実行してから、データを heroku にプッシュしようとしていますが、それほど高速ではありません。
アイデア、提案はありますか?
ありがとう
MSSQL 2008 の 400 万レコードの csv ファイルがあり、そのファイルを heroku の postgresql にインポートしたいと考えています。データを移行するスクリプトを用意しましたが、読み込みに時間がかかりすぎます。複数のファイルに分割しようとしましたが、やはり時間がかかりすぎます。
ローカル PC でインポートを実行してから、データを heroku にプッシュしようとしていますが、それほど高速ではありません。
アイデア、提案はありますか?
ありがとう
最近、3,000 万以上のレコードを含む大規模なインポートを行いました。
これが私たちがしたことです。
postgres のローカル コピーをセットアップしました。Rails アプリを実行しているので、これを開発データベースとして接続し、すべての移行を実行して、探していた適切なテーブル構造とインデックスを取得しました。
その後、Heroku にプッシュする MSSQL および MySQL 環境からデータをインポートしました。
テスト スクリプトを実行し、アプリをテストして、すべてのデータが有効であることを確認しました (日付、ブール フィールド、セットなどの列をチェックします)。
すべてのデータが設定された後、データに対してローカルの pgdump を実行しました。次のコマンドを使用しました。
PGPASSWORD=your_db_password_here pg_dump -Fc --no-acl --no-owner -h localhost -U your_db_user_here your_db_name_here > mydb.dump
その後、heroku が簡単に見つけられるように、プライベート amazon s3 バケットに配置します。
Heroku に複数のデータベースがある場合、または専用の postgres インスタンスを使用している場合は、コマンドラインからデータベースを設定してください。
heroku pg:promote HEROKU_POSTGRESQL_RED
HEROKU_POSTGRESQL_RED を自分のものに置き換えます。heroku pg:info コマンドで見つけることができます。これを行わないと、データベースが共有インスタンスにインポートされ、このプロセスをやり直す必要があります。
また、インポートを行う前に、pgbackups アドオンが有効になっていることを確認する必要があります。まだ行っていない場合は、今すぐ行ってください。
次のステップは Heroku のドキュメント ページです: https://devcenter.heroku.com/articles/pgbackups#importing_from_a_backup
heroku pgbackups:restore DATABASE 'http://s3.amazonaws.com/.....mydb.dump?authparameters'
その後、あなたは行く準備ができているはずです。お気軽にご質問ください。データ ダンプのサイズが 50 ギガを超えていたため、これを理解するのに少し時間がかかりました。
このような大規模なインポート (私の場合は 1 ミル) があったとき、2 つのスクリプトを使用してそれを実行しました。
1 つは、インポートを 100 行のセクションに分割し、そのインポートを DelayedJob タスクにエンキューします。
2 つ目は、DelayedJob が実行したものをインポートしたスクリプトです。
バッチメーカーは次のとおりです。
def Importer.create_import_jobs(filename)
batch_size = 100
puts "reading csv"
rows = []
batch_counter = 1
CSV.foreach(filename, :headers => true) do |row|
rows << row
if rows.size == batch_size
puts "making batch #{batch_counter}"
Delayed::Job.enqueue ImportJob.new(rows)
rows = []
batch_counter += 1
end
end
end
これがワーカーです
class ImportJob < Struct.new(:rows)
def perform
rows.each do |row|
# do you import command here. if you want to go through ActiveRecord it would be like Employee.create(:name => row[1], :phone => row[2])
end
end
def error(job, exception)
Airbrake.notify(exception) # for my debugging / exception purposes, not necessary
end
end
その後、最初のスクリプトを実行してジョブをキューに入れることができます。次に、heroku 管理パネルでワーカーをオンにして、すべてのバッチを処理します。私は1週間ほどかかりましたが、1回のインポートの速度にすべて依存しています(私の場合は、インデックスを作成していたため、追加の行のインポートが非常に遅くなりました)
注: ワーカーのコストは 0.05 USD/時間です。つまり、1 人の労働者の 1 日 = $1.20 のようになります。
それをローカルの PostgreSQL インストールにロードしてから、ダンプを作成し、結果を圧縮して heroku にアップロードすることができます。私は Heroku を使用していないので、CLI PostgreSQL ツールを使用しているかどうかはわかりません。使用している場合は、同様の方法でダンプと復元を行う必要があります。
バックアップと復元の詳細については、 PostgreSQLのドキュメントを確認してください。