【问题标题】:Rails : Fastest way to copy large (jsonb) database from production to developmentRails:将大型(jsonb)数据库从生产复制到开发的最快方法
【发布时间】:2022-01-06 22:48:46
【问题描述】:

我经常需要将我的生产数据库复制到我的开发环境中。为此,我有一个 rake 任务,它从我的生产服务器中提取数据库,创建一个 .dump 文件,然后我从头开始重新创建我的开发数据库。

这是我的 rake 任务:

namespace :db do
    desc 'Pull production db to development'
    task :pull => [:dump, :restore]
  
    task :dump do
      dumpfile = "#{Rails.root}/tmp/latest.dump"
      puts 'PG_DUMP on production database...'
      production = Rails.application.config.database_configuration['production']
      system "ssh root@my_prod_server 'postgres:export prod-db' > #{dumpfile}"
      puts 'Done!'
    end
  
    task :restore do
      dev = Rails.application.config.database_configuration['development']
      dumpfile = "#{Rails.root}/tmp/latest.dump"
      puts 'PG_RESTORE on development database...'
      system "pg_restore --verbose --clean --no-acl --no-owner -h 127.0.0.1 -U #{dev['username']} -d #{dev['database']} #{dumpfile}"
      puts 'Done!'
    end
  end

效果很好。

问题是,它开始变得越来越大,对于每一行我都有大量的jsonb 数据。目前我的 latest.dump 文件大约 700MB,需要大约 5 分钟才能执行。

是否有任何其他解决方案可以加快这个过程。这是否可以一次复制/粘贴整个数据库,而不是每次都从头开始重新创建每一行?

谢谢!

【问题讨论】:

  • 为了更好地回答,我想知道你在用这个副本做什么。你能提供一些情况吗?
  • 感谢@Schwern 的详细回答。当我需要重现错误或使用真实数据进行一些测试时,我会复制我的生产数据库。不适用于统计或报告。因此,正如您和 jjanes 所建议的,只读的追随者数据库对我来说非常有趣!不知道如何实现它,有任何参考吗?将来我也会考虑将我的 jsonb 数据转换为适当的列,但稍后。
  • 是的,谢谢,我想我会在我的服务器上创建一个“副本”数据库,我可以在测试需要时连接到该数据库:)

标签: ruby-on-rails database postgresql database-backups


【解决方案1】:

正如您所发现的,将生产数据库复制到开发中并不能扩展。除了庞大的规模之外,还有安全问题和PII 担心开发人员能够访问生产数据库,更不用说拥有root 访问权限和复制生产数据库了。

无论您对数据做什么,复制生产数据库都不应成为开发过程的常规部分。如果您经常这样做,请质疑您的流程。它应该是缓慢而困难的,因此开发人员避免这样做。

根据你在做什么,更好的选择是......

使用关注者数据库

建立一个持续跟踪生产的数据库。将您的开发环境连接到它。让开发人员连接到关注者仍然存在 PII 问题,但数据库是只读的,因此开发人员不会意外损坏数据。

这对于实际性能测试或调查需要调查生产数据的严重错误很有用。

并且,作为jjanes answered,它可以被分离并提升为读写数据库。

追随者也可用于生产。可以在关注者上完成不需要最新准确性的昂贵的只读查询,例如报告、统计和摘要。

使用 FactoryBot 和 Faker

如果您只需要真实的测试数据,请使用FactoryBotFaker 等工具轻松创建复杂的互连数据。


您还可以减小生产数据库的大小。

使用数据仓库

通常只需要生产数据库中的一小部分数据用于生产。其余的是对审计、统计和分析有用的旧数据。

您可以通过将历史数据移动到data warehouse(例如Google BigQuery)来减小生产数据库的大小。然后对数据仓库进行审计、统计和分析;这样做会更好。

把jsonb变成实列

jsonb 适用于您不确定要存储什么的非结构化数据。它不能替代适当的模式。考虑一下您要放入 jsonb 的内容,并考虑是否由真实的专栏更好地服务。这可以减小数据库的大小。

【讨论】:

    【解决方案2】:

    您可以设置热备用,使其紧随生产之后。然后,当您需要它时,只需将其提升为可读写,它已成为您的新开发者。升级应该只需要几分之一秒(假设它存在并且开始时不会落后太远)。然后立即启动下一个热备用,以便在您需要时随时准备就绪。

    【讨论】:

    • 感谢有道理!关于如何实现“关注者数据库”这个过程以及如何按需连接它的任何参考?
    猜你喜欢
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多