我试图读取postgresql的WAL文件可以告诉我如何在WAL二进制文件中使用什么类型的二进制编码
答案 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
答案 2 :(得分:3)
其他答案意味着格式复杂而且水平低。
但是,如果您有时间学习和理解存储的数据,并知道如何从源代码构建二进制文件,那么有一个已发布的版本8.3
到9.2
的阅读器:{{ 3}}
构建它的常用方法是作为 contrib (Postgres附加组件):
./configure
和make
这个,但无需安装make
- 它应该找到父postgres结构并构建二进制文件您可以将二进制文件复制到路径中,或者在原位使用它。请注意,在了解您所看到的内容之前,仍然需要了解Postgres的许多内部知识。如果您有可用的数据库,则 可能会尝试从日志中撤消SQL语句。
要在Java中执行此操作,您可以包装可执行文件,将C库链接为混合,或者弄清楚如何从源代码进行解析。任何这些选项都可能涉及大量详细的工作。
答案 3 :(得分:0)
WAL文件的格式与实际数据库文件本身的格式相同,具体取决于您使用的PostgreSQL的确切版本。您可能需要检查特定版本的源代码以确定确切的格式。