使用pg_recvlogical逻辑解码时管道处理后无输出的问题排查
PostgreSQL pg_recvlogical 管道awk输出为空的解决办法
问题原因
问题出在awk的默认缓冲机制:awk处理管道输入时默认使用块缓冲,只有当缓冲区填满或者程序退出时才会输出内容。而pg_recvlogical是持续输出逻辑解码事件的,插入数据后awk不会立刻刷新缓冲区,直到你终止命令时,缓冲区可能还没存满,导致数据丢失。而cat工具默认使用行缓冲,每收到一行就立刻输出,所以能正常捕获到事件。
解决办法
方法1:强制awk实时刷新缓冲区
修改awk命令,在每次输出后手动刷新stdout缓冲区:
pg_recvlogical -d postgres --slot test --start -f - | awk '{print; fflush(stdout);}' > sample.txt
如果是要将输出传递给psql,同样适用:
pg_recvlogical -d postgres --slot test --start -f - | awk '{print; fflush(stdout);}' | psql
方法2:启用GNU awk交互模式
GNU awk支持-W interactive选项,自动启用行缓冲:
pg_recvlogical -d postgres --slot test --start -f - | awk -W interactive '{print}' > sample.txt
方法3:用stdbuf强制行缓冲
借助stdbuf工具强制awk的stdout使用行缓冲,无需修改awk代码:
pg_recvlogical -d postgres --slot test --start -f - | stdbuf -oL awk '{print}' > sample.txt
内容的提问来源于stack exchange,提问作者David Ventimiglia
相关产品推荐
相关产品推荐

