g_stat_wal_receiver显示wal发送进程的详细信息
主要字段信息
pid:WAL接收进程的进程号。
status:WAL接收进程的状态。
Receive_start_lsn:WAL接收进程启动后使用的第一个WAL日志位置。
Received_lsn:最近接收井写人WAL日志文件的WAL位置。
last_msg_send_time:备库接收到发送进程最后一个消息后,向主库发回确认消息的发送时间。
last_msg_receipt_time:备库接收到发送进程最后一个消息的接收时间。
conninfo:WAL接收进程使用的连接串,连接信息由备库$PGDATA目录的recovery.conf配置文件的primary_conninfo参数配置。
三、流复制主备切换
3.1判断主备角色
方式一:ps -ef|grep wal 查看wal进程描述信息,判断主备
方式二: 主库查询SELECT * from pg_stat_replication,备库查此视图是无记录的; 备库查询select * from pg_stat_wal_receiver,同主库查此视图无记录。
方式三:SELECT pg_is_in_recovery(); 返回t说明为备库,返回f为主库。
方式四:通过pg_controldata查看数据库控制信息;通过Database cluster state信息判断;结果显示 in production 为主库;结果显示 in archive recovery为备库。
方式五:通过recover.conf配置文件查看。
3.2 判断主备是否正常
(1) 查看主备库的进程
主库发送进程:
[pgsql@pgsql ~]$ ps -ef|grep wal
pgsql 35001 34996 0 22:27 ? 00:00:00 postgres: wal writer process
pgsql 35006 34996 0 22:27 ? 00:00:00 postgres: wal sender process repuser 192.168.231.132(55152) streaming 0/7000098
pgsql 35008 34790 0 22:27 pts/1 00:00:00 grep --color=auto wal
备库为接收进程:
[pgsql@pgstandby ~]$ ps -ef|grep wal
pgsql 59336 59310 1 22:27 ? 00:00:00 postgres: wal receiver process streaming 0/70000D0
pgsql 59347 58742 0 22:27 pts/3 00:00:00 grep --color=auto wal
(2) 主库插入数据,观察备库是否能收到数据。
(3) 主库查询复制状态参数,是否正常。
[pgsql@pgsql pg_root]$ psql postgres
psql (10.9)
Type "help" for help.
postgres=# select usename,application_name ,client_addr ,sync_state from pg_stat_replication;
usename | application_name | client_addr | sync_state
---------+------------------+-----------------+------------
repuser | node2 | 192.168.231.132 | sync
(1 row)
3.3切换方式
通过触发器文件方式触发主备切换和通过pg_ctl promot命令触发主备切换
一、 文件触发方式
1) 配置备库recovery.conf 文件的tigger_file参数,设置激活备库的触发文件路径和名称。添加tigger_file参数。
trigger_file = ‘/database/pg10/pg_root/.postgresql.trigger.5432’
2) 关闭主库,使用 -m fast 模式关闭。(数据库关闭时首先做一次checkpoint,wal进程会将截止此次checkpoint的wal日志流发送给备库,备库在应用wal。)
3) 在备库创建触发文件激活备库,当recovery.conf变为recovery.done表示备库已切换为主库。
[pgsql@pgstandby ~]$ cat /database/pg10/pg_root/recovery.conf |grep ^[^#]
recovery_target_timeline = 'latest'
standby_mode = on
primary_conninfo='host=192.168.231.131 port=5432 user=repuser application_name=node2'
trigger_file='/database/pg10/pg_root/.postgresql.trigger.5432'
[pgsql@pgstandby ~]$ touch /database/pg10/pg_root/.postgresql.trigger.5432 --创建触发文件,检测不到主库后会自动切换为主库。
4) 在老主库下创建recovery.conf文件,并配置相应参数,跟备库的参数一样。在根目录下配置.pgpass免密文件。
[pgsql@pgstandby ~]$ vi /database/pg10/pg_root/recovery.conf --主要依据原来备库的recovery.conf参数来进行设置。
recovery_target_timeline = 'latest' &