我的目标是在JVM上运行的系统中流式传输Postgres WAL。我使用Aurora RDS Postgres。
如果我尝试运行以下命令:
PGReplicationStream stream =
pgConnection.getReplicationAPI()
.replicationStream()
.logical()
.withSlotName("test_slot")
.withStartPosition(lsn)
.start();
我得到错误:
; (err) ERROR: syntax error at or near "START_REPLICATION"
; (err) Position: 1
Postgres记录以下命令:
:ERROR: syntax error at or near "START_REPLICATION" at character 1
:STATEMENT: START_REPLICATION SLOT test_slot LOGICAL 0/40DCC70;
这看起来确实像JDBC驱动程序试图编写的命令。(如此处所示)
START_REPLICATION似乎是Postgres支持的命令。Aurora RDS是否不支持此命令?如果是,是否有替代方法?
为了完整起见,这里是我目前为止构建的代码。我使用Clojure,但大部分都是直接调用java函数。
; pool is HikariCP
(def pg-conn (-> pool
(.getConnection)
(.unwrap org.postgresql.PGConnection)))
;; create slot
(sql/execute! pool ["SELECT pg_create_logical_replication_slot('instant_server_stopa', 'wal2json');"])
;; log sequence number
(def lsn (org.postgresql.replication.LogSequenceNumber/valueOf
(:pg_current_wal_lsn (sql/select-one pg-conn
["SELECT pg_current_wal_lsn()"]))))
(def s (-> pg-conn
(.getReplicationAPI)
(.replicationStream)
(.logical)
(.withSlotName "instant_server_stopa")
(.withStartPosition lsn)
(.start)))
2条答案
按热度按时间xwbd5t1u1#
问题是我使用了错误的
connection
。我有一个HikariCP,并认为我可以只从它的一个连接。但你需要做的是创建一个特定的“复制”连接。类似于:
mi7gmzs62#
PostgreSQL服务器似乎无法识别START_REPLICATION命令。
一个可能的原因是,数据库中没有启用提供逻辑解码功能的pgoutput扩展。您可以在PostgreSQL控制台中运行以下命令来尝试启用它:
CREATE EXTENSION pgoutput;我希望这对你有帮助