postgresql Java中Aurora Postgres的逻辑复制

mum43rcc  于 2023-04-20  发布在  PostgreSQL
关注(0)|答案(2)|浏览(170)

我的目标是在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)))
xwbd5t1u

xwbd5t1u1#

问题是我使用了错误的connection。我有一个HikariCP,并认为我可以只从它的一个连接。
但你需要做的是创建一个特定的“复制”连接。类似于:

Properties props = new Properties();
    PGProperty.USER.set(props, "user");
    PGProperty.PASSWORD.set(props, "pass");
    PGProperty.ASSUME_MIN_SERVER_VERSION.set(props, "9.4");
    PGProperty.REPLICATION.set(props, "database");
    PGProperty.PREFER_QUERY_MODE.set(props, "simple");

    Connection con = DriverManager.getConnection(url, props);
mi7gmzs6

mi7gmzs62#

PostgreSQL服务器似乎无法识别START_REPLICATION命令。
一个可能的原因是,数据库中没有启用提供逻辑解码功能的pgoutput扩展。您可以在PostgreSQL控制台中运行以下命令来尝试启用它:
CREATE EXTENSION pgoutput;我希望这对你有帮助

相关问题