PostgreSQL 逻辑复制在 CREATE SUBSCRIPTION 上挂起

2023-12-06

我在 PostgreSQL 逻辑复制版本 15 上遇到问题。(我也在 v10 和 v12 上进行了测试,但遇到了同样的问题)。 它需要复制来进行测试,因此源数据库和目标数据库位于同一服务器上。

在我设置的配置文件中:

postgresql.conf:

wal_level = logical  # if I have "replica", I can't subscribe

pg_hba.conf:

local replication all
host replication all 127.0.0.1/32 trust
host replication all ::1/128               trust

在源数据库中我这样做:

CREATE PUBLICATION repl_name
   FOR TABLE table1, table2, table3, ...;

在这个阶段的 pgAdmin 中我有:

CREATE PUBLICATION
Query returned successfully in 59 msec.

但是,在日志中我为每个表都有一条消息:

2023-05-17 17:02:07.537 CEST [25356] ERROR: role "backup_user" does not exist
2023-05-17 17:02:07.537 CEST [25356] STATEMENT:  GRANT SELECT ON SEQUENCE public.table1 TO backup_user;

这可能与以下事实有关:在我的计算机上,它正在从进行此复制的客户端恢复备份。

但我不知道这是否打扰你,因为输入后:

select * from pg_catalog.pg_publication;

我可以看到我的出版物:

"20438"   "stack_repl"    "10"   false   true    true   true   true   false

但我在这里没有看到它:

select * from pg_stat_replication;

我认为这可能与尚未订阅有关。

当我想要订阅时,真正的问题出现了。 首先,它使用如下表恢复数据库table1, table2, table3自然,桌子是空的。

我输入命令:

CREATE SUBSCRIPTION sub_test
   CONNECTION 'dbname=dbname host=localhost port=5432 user=postgres password=12345'
   PUBLICATION repl_name;

而 pgAdmin 则无休止地旋转。即使我周末离开电脑,它也无法完成。

它显示在日志中:

2023-05-17 17:22:24.178 CEST [25376] LOG:  logical decoding found initial starting point at 0/A0D6F338
2023-05-17 17:22:24.178 CEST [25376] DETAIL:  Waiting for transactions (approximately 1) older than 3712 to end.
2023-05-17 17:22:24.178 CEST [25376] STATEMENT:  CREATE_REPLICATION_SLOT "sub_test" LOGICAL pgoutput (SNAPSHOT 'nothing')

我向您保证,我长期以来一直在努力解决这个问题,并且我需要支持/提示来了解我可以采取哪些措施来使数据开始复制。


您可能正在同一数据库集群中的两个数据库之间设置逻辑复制。这使得CREATE SUBSCRIPTION永远悬挂,如文档描述:

仅当复制槽不是作为同一命令的一部分创建时,创建连接到同一数据库集群的订阅(例如,在同一集群中的数据库之间进行复制或在同一数据库内进行复制)才会成功。否则,CREATE SUBSCRIPTION呼叫将挂起。要实现此目的,请单独创建复制槽(使用函数pg_create_logical_replication_slot与插件名称pgoutput) 并使用参数创建订阅create_slot = false。这是一个实施限制,可能会在未来版本中取消。

所以这就是成功之路:

  • 连接到主数据库并创建槽:

    SELECT pg_create_logical_replication_slot('sub_test', 'pgoutput');
    
  • 然后连接到备用数据库并运行:

    CREATE SUBSCRIPTION sub_test
       CONNECTION 'dbname=dbname host=localhost port=5432 user=postgres password=12345'
       PUBLICATION repl_name
       WITH (create_slot = false);
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL 逻辑复制在 CREATE SUBSCRIPTION 上挂起 的相关文章

  • 如何从 postgresql 函数或触发器发送一些 http 请求

    我需要通过 http 协议 GET 或 POST 请求 从函数或触发器发送数据 是否可以 您可以尝试用 PL Python 编写触发器并使用 urllib2 进行 POST
  • 无法删除数据库 mysql:错误 3664 (HY000)

    我的应用程序中有一个名为X Files 我想要drop它 但每当我运行命令时drop database X Files我收到以下错误 mysql gt drop database X Files ERROR 3664 HY000 Faile
  • 我可以以编程方式配置 PostgreSQL 以不消除全文搜索中的停用词吗?

    我正在使用 PostgreSQL 全文搜索来进行项目 其中传统停用词 a the if 等 应该被索引和可搜索 这不是默认行为 例如 我可能希望我的用户找到查询 to be or not to be 的结果 The 文档 http www
  • 随机数据库与 AWS 中的 Django 和 Postgresql 断开连接

    我试图找出 Django 和数据库连接错误问题的根源 此时 我正在调试提示 因为我认为症状太不具体 一些背景 我一直在使用这个堆栈 在 AWS 中部署了很多年 没有出现任何问题 Ubuntu 在本例中为 20 04 LTS Nginx Uw
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T
  • Ubuntu 12.04 上的 DeepDive 安装指南

    在拥有以后很多问题 https stackoverflow com questions 22469188 deepdive installation postgresql error安装深潜项目 http deepdive stanford
  • Postgresql 的 SQL_NO_CACHE?

    MySQL 关键字是否有等效的 postgresqlSQL NO CACHE 或 SQL Serverdbcc drop clean buffers 即您可以简单地将其包含在 SQL 语句中或作为脚本的一部分吗 UPDATE 这个问题 查看
  • 拉拉维尔; “SQLSTATE[HY000] [2002] 连接被拒绝”

    我在 OSX 主机上设置了 homestead 2 0 并使用 Sequel Pro 我可以进行迁移并确认数据已在Sequel Pro中迁移 因此看起来数据库连接没有问题 但是 一旦我尝试从 Laravel 4 2 应用程序获取数据 它就无
  • PostgreSql“运行安装后步骤...数据库集群初始化失败”

    我是一名 Windows 用户 我花了几个小时不断地安装和卸载 然后才使其正常工作 前 10 次左右才看到标题中的错误消息 我将其作为一个自我回答的问题放在这里 以防止其他人在安装时可能遇到同样的问题 并为像我这样第一次使用 Postgre
  • 如何使用表内的 JSONB 数据类型和 PostgreSQL JDBC 驱动程序将 JSON 对象存储到 PostgreSQL 中

    我想将以下 json 对象保存到 PostgreSQL 数据库表中as jsonb fname john lname doe 我当前使用 PGObject 创建对象并将类型设置为 jsonb 并将值作为 json 字符串传递 寻找更好的 m
  • Postgres < 9.0 的 DO 块相当于什么

    Postgres 8 4 8 相当于什么 DO BEGIN IF NOT EXISTS THEN EXECUTE END IF END create function f returns void as BEGIN IF NOT EXIST
  • Hibernate saveOrUpdate 与更新与保存/持久

    我正在努力理解休眠方法之间的细微差别 saveOrUpdate update save persist 我知道网站上有一些类似的问题 Hibernate中不同的保存方式有什么区别 https stackoverflow com questi
  • 唯一约束与唯一索引?

    之间有区别吗 CREATE TABLE p product no integer name text UNIQUE price numeric and CREATE TABLE p product no integer name text
  • VBScript:从 Scripting.Dictionary 中对项目进行排序

    我有下面的代码 它获取这样的数据 姓名 1 姓名 4 姓名 2 姓名 3 并像这样列出 是一个复选框 姓名 1 姓名 4 姓名 2 姓名 3
  • 我可以根据多列删除数据库重复项吗?

    I 不久前问过这个问题 https stackoverflow com questions 4952250 how to delete duplicates from a database table based on a certain
  • django AuditTrail 与还原

    我正在开发一个新的网络应用程序 我需要将数据库中的任何更改存储到审核表中 此类审计表的目的是 稍后在真正的物理审计中 我们可以确定在某种情况下发生了什么 谁编辑了什么以及数据库当时的状态是什么 复杂的计算 所以大多数审计表将被写入而不是读取
  • 自动删除主键序列中的间隙

    我正在创建一个网页 该网页根据用户操作将数据存储到 MySQL 数据库中 数据库有很多行 行的主键是列 rowID 它只是按顺序对行进行编号 例如 1 2 3 4 用户可以选择删除行 问题是当用户删除最后一行以外的行时 rowID 中有一个
  • 计算 mysql 数据库行数的最佳方法

    在遇到 mysql 查询加载时间慢的问题后 我现在正在寻找计算行数的最佳方法 我曾经愚蠢地使用过mysql num rows 函数来做到这一点 现在意识到这是最糟糕的方法 我实际上正在制作一个分页来用 PHP 制作页面 我找到了几种计算行数
  • 本地 Postgres 实例和 Azure Cloud Postgres 实例之间的实时同步

    我需要在本地 postgresql 实例与云 postgresql 实例之间设置实时同步过程 请让我知道我可以通过哪些选项来实现它 我是否必须使用任何特定工具或者可以通过复制进行管理 请指教 使用 PgPool http www pgpoo
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执

随机推荐