postgresql 如何处理物理复制JDBC API中的PGReplicationStream?

bmp9r5qi  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(1)|浏览(158)

我正在尝试使用JDBC的ReplicationAPIphysical复制槽读取数据
我正在使用Postgres 13
下面是示例代码

LogSequenceNumber lsn = getCurrentLSN(sqlConnection);

        PGReplicationStream stream =
                pgConnection
                        .getReplicationAPI()
                        .replicationStream()
                        .physical()
                        .withStartPosition(lsn)
                        .start();

        ByteBuffer buffer = stream.read();

        int offset = buffer.arrayOffset();
        byte[] source = buffer.array();
        int length = source.length - offset;
        System.out.println(new String(source, offset, length));

我的代码输出乱码字符串,是否有正确的方法读取从PGReplicationStream返回的bytes我没有找到任何文档说明如何处理从PGReplicationStream返回的字节
插入DB的DML:insert into t2(id,name) values(1,'Jane Doe');
乱码字符串输出:D�3h �L� �4@�Jane Doe.�3h�A$���9��'���4
字节数组的十六进制字符串:7700000000016833c00000000001683438000298be27a1a28f440000000e0200008833680100000000000a0000f24ce4b1002013007f060000843400001f40000000000000ff0302000208180001000000134a616e6520446f65030008000000002e0000000e020000c03368010000000080010000412497e4ff14399ea127be98020001000000843400007f0600000000

plicqrtu

plicqrtu1#

使用(物理)流式复制时,事务日志(WAL)按原样传输,这是非常低级别的二进制信息。可以将其视为“在文件X中,将从偏移量123开始的42个字节替换为以下内容:......"。这是在数据库本身之外(或在流式复制备用服务器之外,即物理副本之外)没有任何意义的信息。
您无法从WAL中可靠地提取有用的信息。如果需要,您必须使用 * 逻辑解码 *,主服务器上的 * 逻辑解码插件 * 将WAL信息逆向工程为有用的逻辑信息。
流物理信息的用例非常有限,我可以想象的一个用例是,如果您想用Java编写一个WAL归档程序,类似于内置的pg_receivewal

相关问题