获取当前时间线
PostgreSQL 9.6 及更高版本
从 PostgreSQL 9.6 开始,可以使用函数 pg_control_checkpoint()
获取当前时间线。
postgres=# SELECT timeline_id FROM pg_control_checkpoint(); timeline_id ------------- 1 (1 row)
(注意:在备机上,如果刚刚发生了时间线切换,pg_control_checkpoint()
返回的值可能是之前的时间线,直到下一个检查点才会更新。)
或者,在备机上,视图 pg_stat_wal_receiver
也提供了当前时间线。
postgres=# SELECT pid, status, received_lsn, received_tli FROM pg_stat_wal_receiver; pid | status | received_lsn | received_tli -------+-----------+--------------+-------------- 11969 | streaming | 0/30015B0 | 1 (1 row)
PostgreSQL 9.5 及更早版本
在 9.6 之前,没有简单的方法可以显式地检索当前时间线作为独立值,必须使用以下解决方法之一。
在数据库级别,可以通过执行以下命令间接获取:
SELECT pg_xlogfile_name(pg_current_xlog_insert_location());
这将返回当前WAL 文件名,前 8 位数字包含时间线(这只能在主节点上执行)。
上述方法的一个变体,它将时间线提取为整数:
SELECT SUBSTR(pg_xlogfile_name(pg_current_xlog_insert_location()), 1, 8)::INT AS timeline;
使用 pg_controldata
pg_controldata 返回当前时间线信息。
$ pg_controldata /path/to/postgres/data/ | grep -i timeline Latest checkpoint's TimeLineID: 1 Latest checkpoint's PrevTimeLineID: 1 Min recovery ending loc's timeline: 0
使用复制连接
还可以通过启动与服务器的复制连接并发出 IDENTIFY_SYSTEM
来获取当前时间线。
$ psql "dbname=postgres host=localhost user=repl_user replication=1" psql (9.5.3) Type "help" for help. postgres=# IDENTIFY_SYSTEM; systemid | timeline | xlogpos | dbname ---------------------+----------+-----------+-------- 6301592708518993068 | 1 | 0/5002168 | (1 row)