获取当前时间线

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)