如何将大量记录(4m+)迁移到Heroku/Postgresql?

4
我有一个来自MSSQL 2008的CSV文件,其中包含400万条记录,我想将该文件导入到Heroku上的PostgreSQL中。我已经准备好了迁移数据的脚本,但是加载时间太长了,我尝试将其拆分为多个文件,但时间再次过长。
我正在尝试在本地计算机上进行导入,然后将数据推送到Heroku,但速度还是不够快。
有什么想法、建议吗?
谢谢。
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上有多个数据库或使用了专用的PostgreSQL实例,请确保从命令行设置您的数据库:
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'

之后你应该准备就绪了。如有问题,请随时提问。这花费我们一些时间来弄清楚,因为我们的数据转储大小超过50GB。


1

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

一个将导入拆分为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。


0
你可以尝试将其加载到本地的PostgreSQL安装中,然后制作一个转储并压缩结果上传到Heroku。 由于我不使用Heroku,不知道你是否拥有CLI PostgreSQL工具,如果有,请使用它们,否则应该提供类似的方法来进行导出和还原。
请查看PostgreSQL文档以获取有关备份和还原的更多信息。

谢谢,这正是我现在正在做的事情......但是花费的时间太长了。 - RRG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接