我们使用PostgreSQL作为数据库.对于备份部分,我们存储完整的集群备份和WAL文件,以允许恢复数据库的时间点.
与完整备份相比,我们的WAL文件占用了相当多的空间,因此我们想要判断WAL文件的内容,更准确地说,能够看到哪些表对我们的WAL文件的容量贡献最大.
Question个
有没有办法判断存储在特定WAL文件中的操作针对的是哪些表/关系?有多少行或记录受到影响?
我们使用PostgreSQL作为数据库.对于备份部分,我们存储完整的集群备份和WAL文件,以允许恢复数据库的时间点.
与完整备份相比,我们的WAL文件占用了相当多的空间,因此我们想要判断WAL文件的内容,更准确地说,能够看到哪些表对我们的WAL文件的容量贡献最大.
Question个
有没有办法判断存储在特定WAL文件中的操作针对的是哪些表/关系?有多少行或记录受到影响?
pg_waldump
是您想要用来判断WAL文件内容的工具.基本上,您可以查看哪些DML和DDL语句(以及其他事件)被捕获到WAL文件中.
下面是一个例子:
-bash-4.2$ pgbench -i
dropping old tables...
creating tables...
generating data (client-side)...
100000 of 100000 tuples (100%) done (elapsed 0.27 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 0.77 s (drop tables 0.03 s, create tables 0.04 s, client-side generate 0.34 s, vacuum 0.21 s, primary keys 0.15 s).
-bash-4.2$ psql -c "select * from pg_class where relname= 'pgbench_accounts'"
oid | relname | relnamespace | reltype | reloftype | relowner | relam | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | relhasindex | relisshared | relpersistence | relkind | relnatts | relch
ecks | relhasrules | relhastriggers | relhassubclass | relrowsecurity | relforcerowsecurity | relispopulated | relreplident | relispartition | relrewrite | relfrozenxid | relminmxid | relacl | reloptions | relpartbound
-------+------------------+--------------+---------+-----------+----------+-------+-------------+---------------+----------+-----------+---------------+---------------+-------------+-------------+----------------+---------+----------+------
-----+-------------+----------------+----------------+----------------+---------------------+----------------+--------------+----------------+------------+--------------+------------+--------+------------------+--------------
16434 | pgbench_accounts | 2200 | 16436 | 0 | 10 | 2 | 16440 | 0 | 1640 | 100000 | 1640 | 0 | t | f | p | r | 4 |
0 | f | f | f | f | f | t | d | f | 0 | 514 | 1 | | {fillfactor=100} |
(1 row)
-bash-4.2$ pg_waldump 00000001000000000000000* | grep 16440
rmgr: Storage len (rec/tot): 42/ 42, tx: 514, lsn: 0/02EC03B0, prev 0/02EC0380, desc: CREATE base/13255/16440
rmgr: Heap2 len (rec/tot): 6515/ 6515, tx: 514, lsn: 0/02EC0CC0, prev 0/02EC0C78, desc: MULTI_INSERT+INIT 61 tuples flags 0x00, blkref #0: rel 1663/13255/16440 blk 0
rmgr: Heap2 len (rec/tot): 6515/ 6515, tx: 514, lsn: 0/02EC2650, prev 0/02EC0CC0, desc: MULTI_INSERT+INIT 61 tuples flags 0x00, blkref #0: rel 1663/13255/16440 blk 1
rmgr: Heap2 len (rec/tot): 6515/ 6515, tx: 514, lsn: 0/02EC3FC8, prev 0/02EC2650, desc: MULTI_INSERT+INIT 61 tuples flags 0x00, blkref #0: rel 1663/13255/16440 blk 2
rmgr: Heap2 len (rec/tot): 6515/ 6515, tx: 514, lsn: 0/02EC5958, prev 0/02EC3FC8, desc: MULTI_INSERT+INIT 61 tuples flags 0x00, blkref #0: rel 1663/13255/16440 blk 3
rmgr: Heap2 len (rec/tot): 6515/ 6515, tx: 514, lsn: 0/02EC72E8, prev 0/02EC5958, desc: MULTI_INSERT+INIT 61 tuples flags 0x00, blkref #0: rel 1663/13255/16440 blk 4
rmgr: Heap2 len (rec/tot): 6515/ 6515, tx: 514, lsn: 0/02EC8C78, prev 0/02EC72E8, desc: MULTI_INSERT+INIT 61 tuples flags 0x00, blkref #0: rel 1663/13255/16440 blk 5
rmgr: Heap2 len (rec/tot): 6515/ 6515, tx: 514, lsn: 0/02ECA608, prev 0/02EC8C78, desc: MULTI_INSERT+INIT 61 tuples flags 0x00, blkref #0: rel 1663/13255/16440 blk 6
rmgr: Heap2 len (rec/tot): 6515/ 6515, tx: 514, lsn: 0/02ECBF80, prev 0/02ECA608, desc: MULTI_INSERT+INIT 61 tuples flags 0x00, blkref #0: rel 1663/13255/16440 blk 7
rmgr: Heap2 len (rec/tot): 6515/ 6515, tx: 514, lsn: 0/02ECD910, prev 0/02ECBF80, desc: MULTI_INSERT+INIT 61 tuples flags 0x00, blkref #0: rel 1663/13255/16440 blk 8
rmgr: Heap2 len (rec/tot): 6515/ 6515, tx: 514, lsn: 0/02ECF2A0, prev 0/02ECD910, desc: MULTI_INSERT+INIT 61 tuples flags 0x00, blkref #0: rel 1663/13255/16440 blk 9
rmgr: Heap2 len (rec/tot): 6515/ 6515, tx: 514, lsn: 0/02ED0C30, prev 0/02ECF2A0, desc: MULTI_INSERT+INIT 61 tuples flags 0x00, blkref #0: rel 1663/13255/16440 blk 10
<snip>
请记住,在WAL中,表是通过它们的relfilenode
而不是oid
来引用的(在示例中查找16440
)
有关pg_waldump
的更多信息,请访问