4

我有一个来自 MSSQL 2008 的 csv 文件,其中包含 400 万条记录,我想在 heroku 上的 postgresql 中导入该文件。我准备了一个脚本来迁移数据,但加载时间太长,我试图将其拆分为多个文件,但又花费了太长时间。

我正在尝试在我的本地电脑上进行导入,然后将数据推送到 heroku,但我又没那么快。

有什么想法、建议吗?

谢谢

4

3 回答 3

4

我们最近进行了一次大型导入,包含 30+ 百万条记录。

这就是我们所做的。

我们已经设置了 postgres 的本地副本。我们正在运行一个 Rails 应用程序,因此我们将其连接为我们的开发数据库并运行所有迁移以获取我们正在寻找的正确表结构和索引。

在那之后,我们从我们的 MSSQL 和 MySQL 环境中导入我们的数据,然后我们将把它们推送到 Heroku。

我们运行了我们的测试脚本并测试了我们的应用程序以确保所有数据都是有效的(检查日期、布尔字段和集合等列)

设置完所有数据后,我们对数据运行了本地 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

之后,我们将它放在一个私有的 amazon s3 存储桶上,这样 heroku 就可以轻松找到它。

如果您在 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'

在那之后,你应该准备好了。随意问的问题。我们花了一点时间才弄清楚,因为我们的数据转储的大小超过 50gigs。

于 2012-05-29T20:50:09.160 回答
1

当我有一个像这样的巨大导入时(我的是 1 百万),我使用了两个脚本来完成它。

一个将导入分成 100 行的部分并将其导入排队到 DelayedJob 任务中。

第二个是 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 个导入的速度(我的正在构建索引,这使得每个额外的行导入要慢得多)

注意:工人的成本为 0.05 美元/小时。所以就像一个工人的一天 = 1.20 美元。

于 2012-05-25T14:36:18.990 回答
0

您可以尝试将其加载到本地 PostgreSQL 安装,然后进行转储并压缩结果以上传到 heroku。由于我不使用 Heroku,我不知道您是否有 CLI PostgreSQL 工具,如果您使用过它们,否则它们应该提供类似的方式来进行转储和恢复。

查看PostgreSQL文档以获取有关备份和恢复的更多信息。

于 2012-05-25T14:28:50.427 回答