将数据库从开发导出到生产

Posted

技术标签:

【中文标题】将数据库从开发导出到生产【英文标题】:Exporting database from development to production 【发布时间】:2016-05-21 13:33:20 【问题描述】:

我正在使用 gem yaml_db 将我的 Postgres 开发数据库导出到生产环境,该数据库位于我的 Ruby on Rails 应用程序所在的虚拟机上。

我使用rake db:data:dump RAILS_ENV=development 创建data.yml 和rake db:data:load RAILS_ENV=production 导入数据,但我在导入时出错了。

rake aborted!
ActiveRecord::StatementInvalid: PG::InFailedSqlTransaction: ERROR:  current transaction is aborted, commands ignored until end of transaction block
: DELETE FROM "improvement_actions"

PG::FeatureNotSupported: ERROR:  cannot truncate a table referenced in a foreign key constraint
DETAIL:  Table "comments" references "improvement_actions".

有谁知道如何解决这个问题?还是有其他方法可以导出我的数据库?

【问题讨论】:

【参考方案1】:

错误是因为你的数据库有外键,yaml_db 不支持。

我认为最简单的解决方案是使用带有--disable-triggers 标志的pg_dump 导出您的开发数据库,​​然后使用pg_restore 将其导入您的生产数据库。

但是,如果您真的想使用 yaml_db,请使用 rather complicated solution has been documented。该解决方案的核心是

如果还没有外键,请将它们设为deferrable initially immediate。记录在案的解决方案使用 schema_plus gem,或者您可以在 Postgres 中进行。 monkey-patch yaml_db 的SerializationHelper::Base#load 在每次加载事务期间使用set constraints all deferred; 推迟所有约束 monkey-patch yaml_db 的 SerializationHelper::Base#truncate_table 可以通过尝试照常截断表来截断表(这在具有延迟触发器的表上是不允许的)并在截断失败时删除。

【讨论】:

我刚刚尝试使用 yaml,因为我在一些教程中看到了它。使用 pg_dump 和 pg_restore,我怎样才能在我的本地主机和我的虚拟机之间做到这一点? 当然,具体细节取决于主机,但通常你会使用 scp 将转储复制到你的虚拟机,使用 ssh 登录虚拟机,然后在那里运行 pg_restore。 如果您的虚拟机使用的数据库可以直接从您的开发机器访问,您可以在笔记本电脑上运行 pg_restore 并将其指向虚拟机的数据库。但是,出于安全原因,该数据库可能无法从外部访问。

以上是关于将数据库从开发导出到生产的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何选项可以导出所有云套件数据?

MySql,如何将开发数据库中的索引导出到生产数据库?

CloudKit:将容器环境从开发切换到生产

如何将所有事件数据从 Firebase 导出到 BigQuery?

如何安全地将所有 IIS 设置从一台服务器导出到另一台服务器?

利用SHELL脚本实现将Oracle数据库的每日EXPDP导出文件复制到远程服务器