gpt4 book ai didi

postgresql - 如何在 RDS 实例中复制 PostgreSQL RDS 数据库

转载 作者:行者123 更新时间:2023-11-29 11:37:50 24 4
gpt4 key购买 nike

我在做这件事时遇到了很多麻烦 - 我想我会在 StackOverflow 上做一个问答来解释这个过程。

问题是关于复制 RDS postgres 数据库以供开发使用 - 特别是用于测试数据库迁移脚本等。这就是为什么要关注“单一数据库”中的“单一模式”。

在我的例子中,我想创建一个尽可能独立的测试数据库,同时保留在单个 RDS 实例中(因为旋转整个 RDS 实例需要 5 到 15 分钟,而且我很便宜)。

最佳答案

这是仅使用命令行的答案。

先决条件:

  • 您必须安装 Postgres 客户端工具(不需要实际的服务器)
    • 客户端版本必须与您的 postgres 服务器版本相同或更高
  • 对 RDS 实例的网络访问
  • 访问相关数据库帐户的凭据

示例上下文:

  • 我在 rds.example.com 有一个 RDS 实例,它有一个名为 rds_master 的主用户.
  • 我有一个名为 db_dev_user 的“应用程序用户”,一个名为 dev_db 的数据库,其中包含架构 app_schema
  • 注意 postgres 中的“用户”和“角色”是同义词

注意:本指南编写于 2017 年,适用于 postgres 9.6 版。如果您发现某些步骤不再适用于最新版本的 postgres - 请将任何修复作为评论或替代答案发布到此帖子。


pg_dump 打印出原始数据库的模式和数据,并且即使存在与数据库的事件连接,也会工作。当然,这些连接的性能可能会受到影响,但数据库的结果副本 transactional .

pg_dump --host=rds.example.com --port=5432 \
--format=custom \
--username=db_dev_user --dbname=dev_db \
> pgdumped

createuser 命令创建您的测试应用程序/进程应该连接的用户(为了更好的隔离),注意创建的用户不是 super 用户,它不能创建数据库或角色。

createuser --host=rds.example.com --port=5432 \
--username=rds_master \
--no-createdb --no-createrole --no-superuser \
--login --pwprompt \
db_test_user

如果没有下一个 grant 命令,以下 createdb 将失败:

psql --host=rds.example.com --port=5432 \
--username=rds_master --dbname=postgres \
--command="grant db_test_user TO rds_master"

createdb 做它在锡 jar 上所说的;请注意,db_test_user 角色“拥有”数据库。

createdb --host=rds.example.com --port=5432 \
--username=rds_master --owner=db_test_user test_db

接下来是创建模式 命令。 db_test_user 无法创建模式,但它必须获得模式授权,否则 pg_restore 会失败,因为它最终会尝试恢复到 pg_catalog 架构(因此请注意 user=rds_master,但 dbname=test_db)。

psql --host=rds.example.com --port=5432 \
--username=rds_master --dbname=test_db \
--command="create schema app_schema authorization db_test_user"

最后,我们发出 pg_restore 命令,实际创建模式对象(表等)并将数据加载到其中:

pg_restore --host=rds.example.com --port=5432 \
--verbose --exit-on-error --single-transaction \
--username=db_test_user --schema=app_schema \
--dbname=test_db --no-owner \
./pgdumped
  • exit-on-error - 因为如果不这样做的话,找出问题所在需要过多的滚动和扫描(这也是 single-transaction 所隐含的)
  • 单事务 - 避免在事情变得糟糕时不得不删除或重新创建数据库
  • schema - 只执行我们关心的模式(也可以将其提供给原始的 pg_dump 命令)
  • dbname - 确保使用我们创建的数据库
  • no-owner - 我们以 db_test_user 身份连接,所以一切都应该归正确的用户所有

关于postgresql - 如何在 RDS 实例中复制 PostgreSQL RDS 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45667358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com