如何通过java读取pg_xlog目录中的WAL文件

时间:2012-12-27 08:58:16

标签: java postgresql postgresql-9.1

我试图读取postgresql的WAL文件可以告诉我如何在WAL二进制文件中使用什么类型的二进制编码

4 个答案:

答案 0 :(得分:5)

你真的不能这样做。从WAL存档中读取字节很容易,但听起来你想理解它们。你会为此而挣扎。

WAL存档是一个二进制日志,显示数据库中已更改的块。它们不是SQL级别或行级别更改日志,因此您不能只检查它们以获取已更改行的列表。

您可能希望调查基于触发器的复制或审核触发器。

答案 1 :(得分:5)

使用pg_xlogdump读取WAL文件(此贡献程序添加到PG 9.3版本 - PG 9.3 released doc

  

此实用程序只能由安装服务器的用户运行,   因为它需要对数据目录的只读访问权。

pg_xlogdump --help
pg_xlogdump decodes and displays PostgreSQL transaction logs for debugging.

Usage:
  pg_xlogdump [OPTION]... [STARTSEG [ENDSEG]]

Options:
  -b, --bkp-details      output detailed information about backup blocks
  -e, --end=RECPTR       stop reading at log position RECPTR
  -f, --follow           keep retrying after reaching end of WAL
  -n, --limit=N          number of records to display
  -p, --path=PATH        directory in which to find log segment files
                         (default: ./pg_xlog)
  -r, --rmgr=RMGR        only show records generated by resource manager RMGR
                         use --rmgr=list to list valid resource manager names
  -s, --start=RECPTR     start reading at log position RECPTR
  -t, --timeline=TLI     timeline from which to read log records
                         (default: 1 or the value used in STARTSEG)
  -V, --version          output version information, then exit
  -x, --xid=XID          only show records with TransactionId XID
  -z, --stats[=record]   show statistics instead of records
                         (optionally, show per-record statistics)
  -?, --help             show this help, then exit

例如:pg_xlogdump 000000010000005A00000096

PostgreSQL Documentthis blog

答案 2 :(得分:3)

其他答案意味着格式复杂而且水平低。

但是,如果您有时间学习和理解存储的数据,并知道如何从源代码构建二进制文件,那么有一个已发布的版本8.39.2的阅读器:{{ 3}}

构建它的常用方法是作为 contrib (Postgres附加组件):

  • 首先获取您希望查看WAL数据的Postgres版本的源代码。
    • ./configuremake这个,但无需安装
  • 然后将xlogdump文件夹复制到 contrib 文件夹(该文件夹中的git克隆正常工作)
  • 为xlogdump运行make - 它应该找到父postgres结构并构建二进制文件

您可以将二进制文件复制到路径中,或者在原位使用它。请注意,在了解您所看到的内容之前,仍然需要了解Postgres的许多内部知识。如果您有可用的数据库,则 可能会尝试从日志中撤消SQL语句。

要在Java中执行此操作,您可以包装可执行文件,将C库链接为混合,或者弄清楚如何从源代码进行解析。任何这些选项都可能涉及大量详细的工作。

答案 3 :(得分:0)

WAL文件的格式与实际数据库文件本身的格式相同,具体取决于您使用的PostgreSQL的确切版本。您可能需要检查特定版本的源代码以确定确切的格式。