pg入门12—pg中的subscriptions是什么

在 PostgreSQL(PG)中,Subscription(订阅) 是逻辑复制中的一个概念,用于从 Publication(发布) 中接收数据变更。Subscription 允许一个数据库实例(订阅者)连接到另一个数据库实例(发布者)并接收表数据的增量更改。订阅者可以应用发布者的 INSERTUPDATEDELETE 以及 TRUNCATE 操作,从而保持两者数据的同步。

逻辑复制中的角色

  • Publication(发布):由发布者数据库创建,定义哪些表或操作应该被发送给订阅者。
  • Subscription(订阅):由订阅者数据库创建,用于连接到发布者并接收数据变更。

工作原理

  • 在发布者数据库上创建一个 Publication,定义要发布的表和操作。
  • 在订阅者数据库上创建一个 Subscription,连接到发布者并订阅所定义的 Publication。
  • PostgreSQL 会先把发布者中指定表的现有数据同步到订阅者,然后继续将增量的数据变更实时传输到订阅者。

创建和管理 Subscriptions

1. 创建 Subscription

使用 CREATE SUBSCRIPTION 命令在订阅者数据库中创建一个订阅。订阅者通过连接字符串连接到发布者,指定要订阅的发布。

  • 创建订阅,并且同步数据:

    复制代码
    CREATE SUBSCRIPTION my_subscription CONNECTION 'host=remote_host dbname=remote_db user=remote_user password=remote_password' PUBLICATION my_publication;
    • CONNECTION:用于连接发布者数据库的连接字符串。
    • PUBLICATION:指定要订阅的 Publication 名称。
2. 查看 Subscription

可以使用 \dRs+ 命令或查询系统表 pg_subscription 来查看现有的订阅信息:

复制代码
SELECT * FROM pg_subscription;
3. 删除 Subscription

使用 DROP SUBSCRIPTION 命令删除订阅。

复制代码
DROP SUBSCRIPTION my_subscription;
4. 暂停或恢复 Subscription

使用 ALTER SUBSCRIPTION 命令可以暂停或恢复订阅,以控制是否接收发布者的数据变更。

  • 暂停订阅:

    复制代码
    ALTER SUBSCRIPTION my_subscription DISABLE;
  • 恢复订阅:

    复制代码
    ALTER SUBSCRIPTION my_subscription ENABLE;

Subscription 的选项

CREATE SUBSCRIPTION 语句中可以配置多种选项来控制如何同步数据:

  • copy_data :默认情况下,订阅会在创建时同步表中的现有数据。可以通过 WITH (copy_data = false) 来禁用这个行为,从而只接收增量变更。
  • refresh:当发布的结构发生变化时,订阅者可以刷新订阅,以确保表结构与发布者一致。
  • synchronous_commit:控制订阅的同步提交模式,用于调节复制过程中性能与数据一致性的平衡。

Subscription 应用场景

  1. 读写分离:通过订阅,主数据库发布数据变更,多个只读副本数据库订阅这些变更,以实现读写分离架构。主库承担写入操作,从库处理查询,减轻主库负载。
  2. 高可用性和灾难恢复:逻辑复制可以在不同的数据库实例之间同步数据,这对于实现高可用性和灾难恢复非常有帮助。
  3. 数据分发:通过逻辑复制,可以将数据从一个数据库发布到多个订阅者中,从而实现数据分发。
  4. 在线数据迁移:通过创建订阅,可以将一个数据库的数据迁移到另一个数据库,同时保持数据的增量同步,避免停机时间。

示例:主从同步

假设有一个发布者数据库和一个订阅者数据库,通过逻辑复制同步 my_table 表的数据。

  1. 在发布者数据库上创建 Publication:

    复制代码
    CREATE PUBLICATION my_publication FOR TABLE my_table;
  2. 在订阅者数据库上创建 Subscription:

    复制代码
    CREATE SUBSCRIPTION my_subscription CONNECTION 'host=publisher_host dbname=publisher_db user=publisher_user password=publisher_password' PUBLICATION my_publication;
  3. 订阅者会首先同步 my_table 中的数据,然后继续接收发布者的增量变更。

Subscription 与物理复制的区别

  1. 数据范围:逻辑复制通过 Publication 和 Subscription 可以选择性地复制某些表的数据,而物理复制则需要同步整个数据库实例的所有数据。
  2. 表结构灵活性:在逻辑复制中,发布者和订阅者的表结构可以不同,只要复制的列是相互兼容的;物理复制则要求主从库的结构完全一致。
  3. 数据库版本兼容性:逻辑复制可以跨不同版本的 PostgreSQL 实例复制数据,而物理复制要求主从库使用相同的 PostgreSQL 版本。

Subscription 的限制和注意事项

  • 主键要求:为了确保增量数据变更能够在订阅者数据库上正确应用,逻辑复制的表通常需要有主键或唯一约束。
  • 数据一致性:逻辑复制是异步的,因此订阅者数据库上的数据可能会稍微滞后于发布者,特别是在网络延迟或负载较高的情况下。
  • 网络连接:订阅者需要持续连接到发布者以接收数据变更,因此网络稳定性会影响同步效率。

小结

Subscription 是 PostgreSQL 逻辑复制体系中的关键部分,通过订阅发布的数据变更,能够实现数据库之间的实时数据同步。结合 Publication,Subscription 提供了灵活的数据复制机制,适用于多种场景如读写分离、分布式数据管理和数据迁移等。

相关推荐
怣501 天前
MySQL多表连接完全指南:内连接与外连接超详细讲解
数据库·sql·mysql
专注VB编程开发20年1 天前
python图片验证码识别selenium爬虫--超级鹰实现自动登录,滑块,点击
数据库·python·mysql
智商偏低1 天前
Postgresql导入几何数据(shp,geojson)的几种方式
数据库·postgresql
海心焱1 天前
从零开始构建 AI 插件生态:深挖 MCP 如何打破 LLM 与本地数据的连接壁垒
jvm·人工智能·oracle
我是Superman丶1 天前
在 PostgreSQL 中使用 JSONB 类型并结合 MyBatis-Plus 实现自动注入,主要有以下几种方案
数据库·postgresql·mybatis
五度易链-区域产业数字化管理平台1 天前
「五度易链」行业标准信息数据库简介
大数据·数据库
霖霖总总1 天前
[小技巧65]深入 InnoDB 页的逻辑存储结构:16KB 页的逻辑全景解析
数据库·mysql
数研小生1 天前
关键词搜索京东列表API技术对接指南
大数据·数据库·爬虫
野犬寒鸦1 天前
从零起步学习并发编程 || 第五章:悲观锁与乐观锁的思想与实现及实战应用与问题
java·服务器·数据库·学习·语言模型
VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue云租车平台系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计