获取当前时间线
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)