流复制的主库和备库的角色不是静态存在的,在维护过程当中能够对两者进行角色切换。例如当主库硬件故障或主库须要调整参数须要重启系统时,一般要进行流复制的主备切换。web
在一般的主备架构下(一主多备,级联除外)有如下五种方法判断主备角色sql
1 操做系统上查看wal发送进程或wal接收线程数据库
2 数据库中查看pg_stat_replication表架构
3 经过系统函数查看
f说明是主库,t说明是备库svg
postgres=# select pg_is_in_recovery(); pg_is_in_recovery ------------------- f (1 row)
Database cluster state: in production
在备库启动时在 recovery.conf 文件中加入一个触发文件的路径(新加则须要重启备库)函数
trigger_file='/pgdata/.postgresql.trigger.2019'
关闭主库post
[postgres@GuangFa_PG9 pgdata]$ pg_ctl stop -m fast waiting for server to shut down.... done server stopped
在备库上建立那个刚刚新加的文件this
[postgres@localhost pgdata]$ touch /pgdata/.postgresql.trigger.2019
能够看到备库上的recovery文件已经成为done了操作系统
-rw-rw-r--. 1 postgres postgres 239 Dec 25 21:50 recovery.done
此时备库已经被激活为主库,能够直接作读写操做了线程
[postgres@localhost pgdata]$ pg_controldata |grep cluster Database cluster state: in production
如今咱们把原来的主库当作备库从新开始搭建主备,方法和以前同样
准备recovery.conf文件
指向原来的备库,再重启数据库便可
在文件触发方式下,须要配置参数和建立文件,比较繁琐。自PG9.1版本之后有了一个命令支持主备切换,就是pg_ctl promote命令
切换步骤以下:
1)关闭主库,建议使用-m fast 模式关闭
2)在备库上使用pg_ctl promote命令,直接将备库切为主库
3)在老主库上配置recovery.conf 文件,启动
4)查看主备状态并查看进程
以下:
[postgres@GuangFa_PG9 pgdata]$ pg_ctl promote server promoting [postgres@GuangFa_PG9 pgdata]$ pg_controldata |grep cluster Database cluster state: in production
首先咱们先确认一下,使用这个命令的前提条件之一:
咱们再来看一下这个命令的应用场景,在上述的两种方式的切换中,第二步都是关闭原主库,并且是强制关闭,由于关闭会有一个checkpoint的点。备库同步完成后,两边的数据是一样的一致性状态。这样原来的主很容易就能作新主的备库
可是若是在执行的过程当中忘记了关闭主库,主库一直处于运行状态,那么这个旧主和新主在数据时间线上就不是一致的了。就会致使后续搭建备库失败
这个命令就是经过新主去同步旧主,使这两个库处于一致性的状态。相似于PG旧主的一次向前回滚。
是为了防止库级别太大,重搭建库过于麻烦。而出的一个命令
[postgres@GuangFa_PG9 pgdata]$ pg_rewind --help pg_rewind resynchronizes a PostgreSQL cluster with another copy of the cluster. Usage: pg_rewind [OPTION]... Options: -D, --target-pgdata=DIRECTORY existing data directory to modify --source-pgdata=DIRECTORY source data directory to synchronize with --source-server=CONNSTR source server to synchronize with -n, --dry-run stop before modifying anything -P, --progress write progress messages --debug write a lot of debug messages -V, --version output version information, then exit -?, --help show this help, then exit