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