单机流复制搭建 异步
1.创建流复制用户
postgres=# create user lfz_u01;
CREATE ROLE
2.授权流复制用户
postgres=# alter user lfz_u01 Replication;
ALTER ROLE
3.生成基础备份(备库) pgdata_standby
pg_basebackup [option ...]
-D :指定备份的目标目录,即备份到哪儿
-F :指定输出的格式
-Fp:原样输出,即把主数据库中的各个数据文件、配置文件、目录结构都完全一样地写到备份目录中,这种情况下"format"指定为"p"或"plain";
-Ft:tar格式输出,相当于把输出的备份文件打包到一个tar文件中,这种情况下"format"指定为"t"或"tar";
-R :--write-recovery-conf: 是否生成 recovery.conf 文件;
-P :允许在备份过程中实时地打印备份进度;打印的进度不是百分之百准确的,因为在备份的过程中,数据库的数据还在发生变化,还会不断的产生WAL日志;
-v : 或 --verbose 详细模式;当使用了 -P 参数时,还会打印出正在备份哪个具体文件的详细信息;
-h : 或 --host 指定连接的服务器主机名或IP地址;
-p : 或 --port 指定连接的端口;
-U :或 --username 指定连接的用户名
注:其他一般不常用的参数,不在此列出。有 -r -X -z -Z -c -l -V -w -W;
pg_basebackup -D /pgccc/pgdata_standby -Fp -R -P -v -U lfz_u01
4.修改备份(备库)的配置
--这里只修改了port
[postgres@pgccc pgdata_standby]$ pwd
/pgccc/pgdata_standby
[postgres@pgccc pgdata_standby]$ vim postgresql.conf
port = 5433
5.启动备库
pg_ctl -D /pgccc/pgdata_standby start
6.测试
--查看主库和备库的相关进程
[postgres@pgccc ~]$ ps -axjf | grep postgres
1790 1890 1890 1790 pts/0 2043 S 0 0:00 | \_ su - postgres
1891 2044 2043 1790 pts/0 2043 S+ 1001 0:00 | \_ grep --color=auto postgres
1855 1988 1988 1855 pts/1 2027 S 0 0:00 | \_ su - postgres
1 1941 1941 1941 ? -1 Ss 1001 0:00 /pgccc/app/15.2/bin/postgres -D /pgccc/pgdata.new
1941 1942 1942 1942 ? -1 Ss 1001 0:00 \_ postgres: logger
1941 1943 1943 1943 ? -1 Ss 1001 0:00 \_ postgres: checkpointer
1941 1944 1944 1944 ? -1 Ss 1001 0:00 \_ postgres: background writer
1941 1946 1946 1946 ? -1 Ss 1001 0:00 \_ postgres: walwriter
1941 1947 1947 1947 ? -1 Ss 1001 0:00 \_ postgres: autovacuum launcher
1941 1948 1948 1948 ? -1 Ss 1001 0:00 \_ postgres: archiver
1941 1949 1949 1949 ? -1 Ss 1001 0:00 \_ postgres: logical replication launcher
1941 1986 1986 1986 ? -1 Ss 1001 0:00 \_ postgres: walsender lfz_u01 [local] streaming 7/40000D8
1 1980 1980 1980 ? -1 Ss 1001 0:00 /pgccc/app/15.2/bin/postgres -D pgdata_standby
1980 1981 1981 1981 ? -1 Ss 1001 0:00 \_ postgres: logger
1980 1982 1982 1982 ? -1 Ss 1001 0:00 \_ postgres: checkpointer
1980 1983 1983 1983 ? -1 Ss 1001 0:00 \_ postgres: background writer
1980 1984 1984 1984 ? -1 Ss 1001 0:00 \_ postgres: startup recovering 000000010000000700000004
1980 1985 1985 1985 ? -1 Ss 1001 0:00 \_ postgres: walreceiver streaming 7/40000D8
1980 2028 2028 2028 ? -1 Ss 1001 0:00 \_ postgres: postgres postgres [local] idle
[postgres@pgccc ~]$
--主库建表 插入数据
[postgres@pgccc pgdata_standby]$ psql
psql (14.7)
Type "help" for help.
postgres=#
postgres=# create table t_baoyw (id int,name varchar(20));
CREATE TABLE
postgres=# insert into t_baoyw values(1,'小宝大人');
INSERT 0 1
postgres=# select * from t_baoyw;
id | name
----+--------
1 | 小宝大人
(1 row)
postgres=#
--备库直接查询
[postgres@pgccc pgdata_standby]$ psql -p 5433
psql (14.7)
Type "help" for help.
postgres=# \dt
List of relations
Schema | Name | Type | Owner
--------+---------------------+-------------------+----------
public | t_baoyw | table | postgres
(1 rows)
postgres=# select * from t_baoyw;
id | name
----+-----------
1 | 小宝大人
(1 row)
postgres=#
7.相关视图
pg_stat_replication
--在主库上,通过查看视图 pg_stat_replication ,获得备库的流复制状态;
postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------ -+---------------------------------------------------------------
pid | 1986 # 数据库中WAL walsender 进程的进程ID
usesysid | 25994 # 登录主库的流复制用户OID
usename | lfz_u01 # 登录主库的流复制用户的名称
application_name | walreceiver # 流复制连接中连接参数 "application_name" 中指定的字符串
client_addr | # Standby 的IP地址
client_hostname | # Standby 的主机地址.注意:只有在配置文件中打开 log_hostname 配置项和同时使用了IP连接时,这列才会显示主机名,否则显示为空
client_port | -1 # 流复制连接中 Standby 端的 socket 端口
backend_start | 2023-08-01 15:01:11.506636+08 # WAL Sender 进程启动的时间。实际也是 Standby 连接过来的时间,因为只有 Standby 连接后,才会启动一个 walsender 进程。连接中断后 walsender 进程也会中断。
backend_xmin | # Standby 的 xmin 范围
state | streaming # WAL Sender 进程的状态
sent_lsn | 7/40000D8 # 流复制连接上WAL时的发送位置
write_lsn | 7/40000D8 # Standby 端写WAL日志的位置
flush_lsn | 7/40000D8 # Standby 端写WAL日志刷新到磁盘的位置
replay_lsn | 7/40000D8 # Standby 端重放WAL日志的位置
write_lag | # 写的延迟间隔
flush_lag | # 刷新的磁盘的延迟间隔
replay_lag | # 应用的延迟间隔
sync_priority | 0 # 同步复制时,不同 Standby 的优先级。对于异步复制,此字段的值总是"0"
sync_state | async # 同步的状态,可以为"sync(同步)" ,"async(异步)","potential(潜在的)"
reply_time | 2023-08-01 15:02:22.526653+08 # 最新一次同步时间
----+------------------------------ -+-------------------------------------------------------------
--查看同步状态
--##异步
postgres=# select client_addr,state,sync_state from pg_stat_replication;
-[ RECORD 1 ]----------
client_addr |
state | streaming
sync_state | async
postgres=#
pg_stat_wal_receiver
--在备库,通过查看视图 pg_stat_wal_receiver ,查看流复制状态
--显示备库上,walreceiver 接收进程的状态
postgres=# \x
postgres=# select * from pg_stat_wal_receiver;
-[ RECORD 1 ]---------+-------------------------------------------------
pid | 1985 # WAL接收进程的PID
status | streaming # 状态。只有"streaming"是正常状态;
receive_start_lsn | 7/3000000 # 接收进程启动时,使用的第一个WAL日志的位置;
receive_start_tli | 1 # 接收进程启动时,使用的第一个时间线的编号;
written_lsn | 7/40000D8 # 已经接收到并写入磁盘的最后一个WAL日志的位置;
flushed_lsn | 7/40000D8 # 已经接收到并写入磁盘的最后一个WAL日志刷新到磁盘的位置;
received_tli | 1 # 已经接收到并写入磁盘的最后一个WAL日志的时间线;
last_msg_send_time | 2023-08-01 15:03:42.530803+08 # 接收到最后一条WAL日志消息后,向主库发送回确认消息的发送时间
last_msg_receipt_time | 2023-08-01 15:03:42.530824+08 # 备库接收最一条WAL日志的接收时间
latest_end_lsn | 7/40000D8 # 报告给主库最后一个WAL日志的位置
latest_end_time | 2023-08-01 15:01:12.321381+08 # 报告给主库最后一个WAL日志的时间
slot_name | # 使用的复制槽的名称
sender_host | /tmp
sender_port | 5555
conninfo | user=lfz_u01 passfile=/home/postgres/.pgpass channel_binding=disable dbname=replication port=5555 fallback_application_name=walreceiver sslmode=disable sslcompression=0 sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres target_session_attrs=any # 连接主库的连接串。
postgres=#
8.其他
--如果判断数据库处于"备库"的状态 函数返回的值是 "f"表示主库; “t”表示备库
--如果在主库上 函数返回的值是 "f"
[postgres@pgccc ~]$ psql
psql (14.7)
Type "help" for help.
postgres=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
f
(1 row)
postgres=#
--如果在主库上,函数返回的值是"t"
[postgres@pgccc ~]$ psql -p 5433
psql (14.7)
Type "help" for help.
postgres=# select pg_is_in_recovery();
pg_is_in_recovery
-------------------
t
(1 row)
postgres=#
--流复制用户查看
postgres=#
postgres=# select * from pg_user;
usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig
----------+----------+-------------+----------+---------+--------------+----------+----------+-----------
postgres | 10 | t | t | t | t | ******** | |
lfz_u01 | 32768 | f | f | t | f | ******** | |
(2 rows)
postgres=#
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
lfz_u01 | Replication | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
postgres=#
--判断主备库的状态
[postgres@pgccc ~]$ pg_controldata -D pgdata | grep state
Database cluster state: in production
[postgres@pgccc ~]$ pg_controldata -D pgdata_standby | grep state
Database cluster state: in archive recovery
--同步:等待WAL日志先落盘
--异步:会有主从延迟