正确的方法来终止postgres复制模式连接

时间:2017-11-21 12:43:44

标签: postgresql postgresql-9.4

我有以下代码在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:错误。终止此连接的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

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,但是任何不错的平台/语言都可以使用工具来实现。 缩短了,所以可能有一个错误:)