【问题标题】:Correct way to terminate a postgres replication mode connection终止 postgres 复制模式连接的正确方法
【发布时间】:2017-11-21 12:43:44
【问题描述】:

我有以下代码可以在 PostgreSQL 9.4 中启用逻辑解码:

pg_recvlogical -h localhost --slot test_slot --create-slot
pg_recvlogical -h localhost --slot test_slot --start -f -

我生成了一个 node.js 子进程来运行此代码并监听更改,但是我不确定终止连接的正确程序是什么。我通常只是从命令行CNTRL+C 或在代码中终止子进程,但我总是收到pg_recvlogical: unexpected termination of replication stream: 错误。终止此连接的正确方法是什么?

【问题讨论】:

  • 你不想pg_recvlogical -h localhost --slot test_slot --drop-slot?..
  • 这会杀死插槽 - 我只想终止与它的连接。
  • 如果你不能用--start -f 发送SIGINT 来处理,你可能不得不杀死它ny pid?..
  • 在代码中,我使用 'SIGINT' 信号来终止进程,但我仍然收到相同的错误。
  • 啊-抱歉。我现在明白了 - 你想取消通知

标签: postgresql postgresql-9.4


【解决方案1】:

PostgreSQL documentation says

--开始
从 --slot 指定的逻辑复制槽开始流式传输更改,一直持续到被信号终止。如果服务器端更改流以服务器关闭或断开连接结束,则循环重试,除非指定 --no-loop。

所以我假设标准的 Linux 信号含义适用。因此,SIGINTSIGQUIT 应该是可以接受的,给应用程序完成时间。

我要做的是发送SIGINT,然后进入一个循环,检查/proc/$PID_/stat是否存在,自定义超时后,我发送SIGKILLwait $PID_

kill -2 $PID_
for i in `seq 1 8`; do
    if [ ! -f /proc/$PID_/stat ] ; then
        RETURN_CODE=`wait $PID_`;
        break;
    fi
    sleep 1;
done
if [ -f /proc/$PID_/stat ] ; then
    kill -9 $PID_;
    RETURN_CODE=`wait $PID_`;
fi

这就是 Bash,但任何体面的平台/语言都会有工具来做这件事。 缩短了,所以可能有错误:)

【讨论】:

    【解决方案2】:

    我执行以下操作来杀死一个僵尸活动复制槽。

    1. 使用带有 ssh 的 CLI 连接到安装了 postgres 的服务器。
    ssh -i <generated_security_key_name/path>.pem <username>@<hostIp>
    
    1. 一旦连接到服务器中的虚拟机。键入以下命令以连接到 postgres sql。
    sudo -i -u <postgres-username>
    
    1. 您可以使用 psql,它是一个基于终端的 PostgreSQL 前端
    psql
    
    1. 根据您的复制槽检查 pid。
    select * from pg_replication_slots;
    

    输入以下内容将其杀死。

    sudo kill <pid>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-20
      • 2018-04-09
      • 2017-04-22
      • 2018-09-16
      • 1970-01-01
      • 2022-12-14
      • 2020-09-30
      • 2016-10-28
      相关资源
      最近更新 更多