postgresql - AWS postgres RDS 读取复制如何处理架构切换?
问题描述
我想知道 AWS postgres RDS 如何在我重命名模式以在数据库的读/写实例中“交换”它们的地方进行复制。
它是否通过发送我给读/写实例的“更改模式”重命名命令将此操作复制到只读副本?或者在我重命名之后,它是否会在模式中看到完全不同的数据集并将每个数据的全新副本复制到只读副本?
例如...
在我的 RDS 实例中,我有一个“my_mega_database”的读/写实例,我想为我的应用程序创建读取副本以连接到该实例。
通常,在“my_mega_database”中有两个模式“my_data”和“my_data_old”,其中“my_data”包含昨晚交付的数据,“my_data_old”包含前一天晚上的数据。每个都包含许多表和大量数据。
如果我要执行以下操作...
ALTER SCHEMA my_data_old RENAME TO my_data_tmp;
ALTER SCHEMA my_data RENAME TO my_data_old;
ALTER SCHEMA my_data_tmp RENAME TO my_data;
...我已经有效地交换了这些。
我的期望是通过 postgres WAL 复制这些操作(即:它将重命名命令发送到副本)并且 AWS RDS 复制不会尝试浪费时间在整个地方复制大量数据。
这个对吗?
解决方案
(这里说的是 PostgreSQL,但 RDS 可能类似。)
重命名模式(或任何其他对象)是目录表中的一个小更新,不会移动任何数据。在内部,PostgreSQL 只使用数字对象 ID,它保持不变。
您可以将这三个语句包装在一个事务中,以使整个魔法原子化。
在备用数据库上也是如此,这是一个微不足道的(元)数据修改。
唯一可能成为问题的是持有锁的并发会话。
推荐阅读
- mongodb - MongoDB 聚合 $lookup 管道从对象数组转换为平面数组
- javascript - Javascript 数字猜测器以“0”值表现奇怪
- php - 如何反转字符串的两个字符?
- python - 如何将具有总人口列和总成功数列的一行转换为多行成功和失败?
- c# - 可能的 HttpClient 死锁
- virtual-machine - 无法通过 Secure Shell 客户端远程连接 ESXi 主机
- java - 如何在 Jetty 9.4 中使用 Spring WebApplicationInitializer?
- python - PyPI 包的可选依赖项
- docusignapi - 使用 eSign SDK 将用户签名上传到 DocuSign?
- php - 查看多个表中的所有数据(html / php)