我正在尝试读取 postgresql 的 WAL 文件,任何人都可以告诉我如何做到这一点 n WAL 二进制文件中使用了哪种类型的二进制编码
4 回答
用于读取WALpg_xlogdump
文件(此 contrib 程序添加到 PG 9.3 版本 - PG 9.3 发布的文档)
此实用程序只能由安装服务器的用户运行,因为它需要对数据目录的只读访问权限。
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
你真的不能那样做。从 WAL 存档中读取字节很容易,但听起来你想理解它们。你会为此挣扎。
WAL 档案是一个二进制日志,显示数据库中哪些块发生了变化。它们不是 SQL 级别或行级别的更改日志,因此您不能只检查它们以获取更改行的列表。
您可能希望改为调查基于触发器的复制或审计触发器。
正如其他答案所暗示的那样,格式复杂且低级。
但是,如果您有时间学习和理解存储的数据,并且知道如何从源代码构建二进制文件,则有一个已发布的阅读器8.3
版本9.2
:xlogdump
构建它的常用方法是作为一个contrib(Postgres 附加组件):
- 首先获取您希望查看 WAL 数据的 Postgres 版本的源代码。
./configure
还有make
这个,但不需要安装
- 然后将 xlogdump 文件夹复制到contrib文件夹(该文件夹中的 git clone 工作正常)
- 运行
make
xlogdump - 它应该找到父 postgres 结构并构建二进制文件
您可以将二进制文件复制到您的路径,或在原位使用它。请注意,在您了解您所看到的内容之前,仍然需要大量 Postgres 的内部知识。如果您有可用的数据库,则可以尝试从日志中反转 SQL 语句。
要在 Java 中执行此操作,您可以包装可执行文件、将 C 库链接为混合库,或者找出如何从源代码进行所需的解析。这些选项中的任何一个都可能涉及大量详细的工作。
WAL 文件与实际数据库文件本身的格式相同,并且取决于您使用的 PostgreSQL 的确切版本。您可能需要检查特定版本的源代码以确定确切的格式。