规划
192.168.31.211 主库
192.168.31.210 备库
创建流复制角色用户
#create role repuser login encrypted password 'repuser' replication;
postgres=# create role repl login encrypted password 'repl' replication;
CREATE ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
repl | Replication | {}
vi pg_hba.conf 加一行:
host all all 0.0.0.0/0 md5
host replication repl 0.0.0.0/0 md5
pg_ctl reload #做完了之后重新加载一下,参数才生效。
主从参数配置:
主库:
listen_addresses = '*'
wal_level=replica #启动所有的归档日志
archive_mode=on #归档模式打开
archive_command='test ! -f /postgresql/backup/archive_wals/%f && cp %p /postgresql/backup/archive_wals/%f'
logging_collector = on
log_directory = 'log'
log_truncate_on_rotation = on
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
max_wal_senders=10 #最大发送进程多少个,至少10个
wal_sender_timeout=5000s #60s还没发过去就断开了
hot_standby=on #说明这台机器不仅仅用于数据归档也用于数据查询
wal_receiver_status_interval = 10s #多久向主机报告一次从的状态,从每次数据复制都会向主报告状态,这里只是设置最长的时间间隔
hot_standby_feedback = on #如果有错误的数据复制,是否向主进行反馈
pg_ctl stop
pg_ctl start
使用流复制创建备库
pg_basebackup -D /postgresql/pgdata -F p -P -R -h 192.168.31.211 -p 5432 -U repuser -l backup20211106 --waldir=/postgresql/pgxlog
#从库请求去主库托数据到从库/postgresql/pgdata, -F 是格式, p是原样输出。-P运行在备份中实时打印进度
#-h 192.168.0.180 -p 5432 -U repuser 链接到主库,用什么地址、端口和用户去拖备份。
#--waldir=/postgresql/pgxlog5432 事物日志,主库初始化指定了什么,这里就指定什么,也可以不指定,默认也可以。
# -l 打标签 -l backup20211106
#-R 备份完了自动生成相应的配置文件recovery.conf文件。pg12 和 pg12之前还不一样。
#-R备份结束之后会自动生成recovery.conf文件,PG12之前做流复制来判断主从同步的信息。在PG12开始,这个文件已经不需要了。
#在pg12之后是写到配置文件里:
备库还需要修改 postgresql.conf:
primary_conninfo='host=192.168.31.211 port=5432 user=repuser passowrd=repuser123'
命令执行结果:
[pgsql@orcl:/postgresql]$pg_basebackup -D /postgresql/pgdata/ -F p -Pv -R -h192.168.31.211 -p5432 -Urepl -l backup202305
Password:
23250/23250 kB (100%), 1/1 tablespace
--pg_basebackup -D /postgresql/pgdata/ -X stream -F p -Pv -R -h192.168.31.211 -p5432 -Urepl -l backup202304
错误记录:
pg_basebackup: error: could not send replication command "TIMELINE_HISTORY": ERROR: could not open file "pg_wal/00000005.history": No such file or directory
[pgsql@orcl pg_wal]$ touch 00000005.history
[pgsql@orcl:/postgresql/pgdata]$ll standby.signal --对应这个生成的文件标志当前为备库
-rw------- 1 pgsql pgsql 0 May 4 16:07 standby.signal
##复制归档到备库归档目录:
##[pgsql@orcl archive_wals]$ scp * 192.168.31.210:/postgresql/backup/archive_wals
修改备库参数文件:
vi postgresql.conf
primary_conninfo = 'host=192.168.31.211 port=5432 user=repl password=repl'
restore_command = 'cp /postgresql/backup/archive_wals/%f %p' #从该目录拷贝到工作目录进行恢复
recovery_target_timeline = 'latest' #指定在哪个时间线上进行恢复操作,默认选项。表示使用最新的时间线来进行 PITR 操作
--其它参数和主库一样
启动备库:
[pgsql@orcl:/postgresql/pgdata]$pg_ctl start
waiting for server to start....2023-05-04 16:12:59.145 CST [3323] FATAL: data directory "/postgresql/pgdata" has invalid permissions
2023-05-04 16:12:59.145 CST [3323] DETAIL: Permissions should be u=rwx (0700) or u=rwx,g=rx (0750).
stopped waiting
pg_ctl: could not start server
Examine the log output.
[pgsql@orcl:/postgresql]$chmod -R 700 pgdata --创建目录的时候用pgsql用户创建的遗留问题
[pgsql@orcl:/postgresql/pgdata/pg_log]$pg_ctl start
waiting for server to start....2023-05-04 16:51:30.576 CST [4182] LOG: redirecting log output to logging collector process
2023-05-04 16:51:30.576 CST [4182] HINT: Future log output will appear in directory "/postgresql/pgdata/pg_log".
........................................................... stopped waiting
pg_ctl: server did not start in time
主库查询复制状态:
postgres=# \x --竖行的方式显示结果集
Expanded display is on.
postgres=# select * from pg_stat_replication;
(0 rows)
postgres=# select pg_switch_wal();
-[ RECORD 1 ]-+-----------
pg_switch_wal | 0/2B000078
postgres=# select * from pg_stat_replication;
-[ RECORD 1 ]----+------------------------------
pid | 5965
usesysid | 32786
usename | repuser
application_name | walreceiver
client_addr | 192.168.31.210
client_hostname |
client_port | 13806
backend_start | 2023-05-04 16:51:30.429466+08
backend_xmin |
state | streaming
sent_lsn | 0/2E000060
write_lsn | 0/2E000060
flush_lsn | 0/2E000060
replay_lsn |
write_lag | 00:00:00.066545
flush_lag | 00:00:00.066843
replay_lag | 00:02:20.378879
sync_priority | 0
sync_state | async
reply_time | 2023-05-04 16:53:51.326934+08
同步测试
切换到postgres数据库:
postgres=# \c postgres
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




