PostgreSQL9.3Beta1:新增 pg_xlogdump 模块

PostgreSQL 9.3 新增 pg_xlogdump 模块,这个模块的的功能是将 WAL 日志展现成易读的格式,大家知道 WAL 日志是二进制文件,是了解数据库内部机制的重要文件,新版本的这个模块主要是从 debugging 或 educational 角度出发,下面简单演示下:

手册上的解释

1
2
3
4
5
6
7
8
9
10
11
12
13
Name
pg_xlogdump -- Display a human-readable rendering of the write-ahead log of a PostgreSQL
database cluster

Synopsis
pg_xlogdump [option...] [startseg [endseg] ]

Description
pg_xlogdump displays the write-ahead log (WAL) and is mainly useful for debugging or
educational purposes.

This utility can only be run by the user who installed the server, because it requires read-only
access to the data directory.

pg_xlogdump 测试

2.1 展现 startseg 到 startseg 的 WAL 的事务日志

1
2
3
4
5
6
7
8
9
10
[pg93@redhatB pg_xlog]$ ll
total 65M
-rw-------. 1 pg93 pg93 16M May 15 12:04 000000010000000000000001
-rw-------. 1 pg93 pg93 16M May 18 15:25 000000010000000000000002
-rw-------. 1 pg93 pg93 16M May 24 13:46 000000010000000000000003
-rw-------. 1 pg93 pg93 16M May 27 13:18 000000010000000000000004
drwx------. 2 pg93 pg93 4.0K May 24 13:47 archive_status

[pg93@redhatB pg_xlog]$pg_xlogdump -b -n1 000000010000000000000001 000000010000000000000004
rmgr: XLOG len (rec/tot): 68/ 96, tx: 0, lsn: 0/01000024, prev 0/00000000, bkp: 0000, desc: checkpoint: redo 0/1000024; tli 1; prev tli 1; fpw true; xid 0/3; oid 10000; multi 1; offset 0; oldest xid 3 in DB 1; oldest multi 1 in DB 1; oldest

备注:这里展现的是 000000010000000000000001 到 000000010000000000000004 之间的 WAL 日志,-n 表示显示的行数。

2.2 展现 WAL 中所有的 resource manager 名称

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[pg93@redhatB pg_xlog]$pg_xlogdump --rmgr=list
XLOG
Transaction
Storage
CLOG
Database
Tablespace
MultiXact
RelMap
Standby
Heap2
Heap
Btree
Hash
Gin
Gist
Sequence
SPGist

备注:pg_xlogdump 展现的所有资源信息为以上。

2.3 仅展现 WAL 中资源名称 Sequence 的日志

1
2
[pg93@redhatB pg_xlog]$ pg_xlogdump -rSequence-n1 000000010000000000000001 000000010000000000000004
rmgr: Sequence len (rec/tot): 158/ 186, tx: 1852, lsn: 0/024DCD7C, prev 0/024DCCC8, bkp: 0000, desc: log: rel 16385/16386/16438

备注:上面指定的 resource manager 为 Sequence,字段信息解释如下:

- rmgr: 资源名称
- len: rmgr记录长度
- tx:  事务ID (transaction ID)
- lsn: log sequence numbe,包括之前的 LSN
- bkp: backup blocks (具体意思还没弄懂)
- desc: 一些描述信息,包括 relation 的相关页信息(重要信息)

2.3.1 关于 desc 信息
再来看上面的 des 信息,有条“rel 16385/16386/16438” 记录,这是指什么?很容易猜到表示: {reltablespace}/{databaseid}/{relfilenode}*, 接着验证:

tabespace

1
2
3
4
5
francs=> select oid,spcname from pg_tablespace where oid=16385;
oid | spcname
-------+------------
16385 | tbs_francs
(1 row)

database

1
2
3
4
5
francs=> select oid,datname from pg_database where oid=16386;
oid | datname
-------+---------
16386 | francs
(1 row)

relation

1
2
3
4
francs=> select oid,relkind,relname from pg_class where oid=16438;
oid | relkind | relname
-------+---------+-------------------
16438 | S | test_json1_id_seq

备注:可见,最终是个序列。

2.4 仅展现 WAL 中资源名称 Database 的日志

1
2
3
4
5
6
[pg93@redhatB pg_xlog]$ pg_xlogdump -r Database -b 000000010000000000000001 000000010000000000000004
rmgr: Database len (rec/tot): 16/ 44, tx: 1797, lsn: 0/0176C9D4, prev 0/0176C974, bkp: 0000, desc: create db: copy dir 1/1663 to 12890/1663
rmgr: Database len (rec/tot): 16/ 44, tx: 1804, lsn: 0/0178332C, prev 0/017832CC, bkp: 0000, desc: create db: copy dir 1/1663 to 12895/1663
rmgr: Database len (rec/tot): 16/ 44, tx: 1808, lsn: 0/0178441C, prev 0/017843BC, bkp: 0000, desc: create db: copy dir 12890/1663 to 16386/16385
rmgr: Database len (rec/tot): 16/ 44, tx: 1814, lsn: 0/0178619C, prev 0/0178613C, bkp: 0000, desc: create db: copy dir 12890/1663 to 16390/16389
pg_xlogdump: FATAL: error in WAL record at 0/40019F8: record with zero length at 0/4001A58

备注:上面指定的 resource manager 为 Database,也可以指定LSN,如下。

2.5 指定 LSN

1
2
3
4
5
[pg93@redhatB pg_xlog]$ pg_xlogdump -r Databasestart 0/0178332C000000010000000000000001 000000010000000000000004
rmgr: Database len (rec/tot): 16/ 44, tx: 1804, lsn: 0/0178332C, prev 0/017832CC, bkp: 0000, desc: create db: copy dir 1/1663 to 12895/1663
rmgr: Database len (rec/tot): 16/ 44, tx: 1808, lsn: 0/0178441C, prev 0/017843BC, bkp: 0000, desc: create db: copy dir 12890/1663 to 16386/16385
rmgr: Database len (rec/tot): 16/ 44, tx: 1814, lsn: 0/0178619C, prev 0/0178613C, bkp: 0000, desc: create db: copy dir 12890/1663 to 16390/16389
pg_xlogdump: FATAL: error in WAL record at 0/40019F8: record with zero length at 0/4001A58

2.6 关于 LSN
2.6.1 查看当前 LSN

1
2
3
4
5
postgres=# select pg_current_xlog_location();
pg_current_xlog_location
--------------------------
0/4001A58
(1 row)

2.6.2 查看 LSN 位于哪个 WAL 文件

1
2
3
4
5
postgres=# select pg_xlogfile_name('0/4001A58');
pg_xlogfile_name
--------------------------
000000010000000000000004
(1 row)

总结

  1. 从上来看, pg_xlogdump 有点像 Oracle 的 LogMiner,但目前 pg_xlogdump 还不能生成历史 SQL 信息。
  2. 目前 pg_xlogdump 主要是出于从 debugging 或 educational 角度使用,生产上使用需谨慎。
  3. pg_xlogdump 展现的信息有限,希望在之后版本加强。

参考

原创文章,作者:745907710,如若转载,请注明出处:https://blog.ytso.com/237973.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论