目录

什么是pg_rewind?

pg_rewind的使用

常见问题


​​​​​​​

什么是pg_rewind?

pg_rewind是pg提供的工具,当2个pg实例时间线(timeline)出现分叉时,pg_rewind可以做实例间的同步。(比如主库运行的情况下,备库failover后运行了一段时间,此时主备的时间线就出现了分叉)
pg_rewind会对比两者的大小,然后把大小不一样的文件从源拷贝到目标,包括配置文件。但是它不会对比没有发生改变的文件,所以pg_rewind在比较大的库,更改少量数据时,运行效率较高。
pg_rewind可以运用在备库failover后,备库即时运行一段时间,也可以把备库拉到和主库一样的状态,重新成为standby。
pg_rewind运行过程中,会对比主(源)备(目标)的差异点,并把主库的差异点后的WAL日志传递给备库。所以,如果主库在差异点之后的WAL也丢失了,那么rewind是不会拷贝不存在的WAL日志的,所以此时备库仍然不会被成功做成standby。解决该问题需要用restore。

!!!在使用pg_rewind时,应备份目标实例。pg_rewind会直接覆盖目标库的文件,如果rewind失败,那么可能目标库无法启动。

pg_rewind的使用

主备切换后,老主库仍然运行,导致主备时间线不一致,老主库无法当做新主库的备库启动

拉起备库时,报时间线错误如下

LOG:  entering standby mode
FATAL:  requested timeline 2 is not a child of this server's history
DETAIL:  Latest checkpoint is at 0/6000028 on timeline 1, but in the history of the requested timeline, the server forked off from that timeline at 0/4000098.
LOG:  startup process (PID 22321) exited with exit code 1
LOG:  aborting startup due to startup process failure
LOG:  database system is shut down

此时需要用rewind重新拉齐一次主备

1.配置当前主库的pg_hba
配置pg_rewind的登陆用户登陆源库许可,hba生效需要重启数据库

vi $source/pg_hba.conf
host    all       pg         172.17.100.150/32          trust

pg_rewind需要使用高权限用户,pg新版本可以授权,pg老版本最好用超级用户。
我当前环境的版本为pg9.6,直接使用OS超级用户

2.wal_log_hints = on参数配置
将wal_log_hints = on追加到目标库postgres.conf,重新启动并关闭一次目标库(此时主库是启动状态,备库是关闭状态)

vi $dest/postgres.confwal_log_hints = on

3.pg_rewind命令执行
[pg@lzl pg96data_sla]$ /pg/pg96/bin/pg_rewind --target-pgdata /pg/pg96data_pri --source-server='host=172.17.100.150 port=5433 user=pg password=oracle  dbname=postgres'
servers diverged at WAL position 0/4000098 on timeline 1
rewinding from last common checkpoint at 0/4000028 on timeline 1
Done!

4.配置备库参数
更改postgres.conf和recovery.conf中的IP、端口、目录等配置,pg_rewind会把配置文件也cp过来
[pg@lzl pg96data_pri]$ mv recovery.done recovery.conf
[pg@lzl pg96data_pri]$ vi recovery.conf
[pg@lzl pg96data_pri]$ vi postgres.conf

5.启动备库

[pg@lzl pg96data_pri]$  /pg/pg96/bin/pg_ctl -D /pg/pg96data_sla -l /pg/pg96data_sla/server.log start
server starting
[pg@lzl pg96data_sla]$ psql -p5433 postgres
psql (9.6.17)
postgres=# \x
Expanded display is on.
postgres=# select * from  pg_stat_replication ;
-[ RECORD 1 ]----+------------------------------
pid              | 24766
usesysid         | 16384
usename          | lzl
application_name | walreceiver
client_addr      | 172.17.100.150
client_hostname  |
client_port      | 47345
backend_start    | 2021-07-30 07:44:05.582546+00
backend_xmin     |
state            | streaming
sent_location    | 0/4033790
write_location   | 0/4033790
flush_location   | 0/4033790
replay_location  | 0/4033790
sync_priority    | 0
sync_state       | async

常见问题

pg_rewind命令报错一

could not fetch remote file "global/pg_control": ERROR:  must be superuser to read files
Failure, exiting

解决办法:
使用高权限用户

postgres=# \duList of rolesRole name  |                         Attributes                         | Member of
-------------+------------------------------------------------------------+-----------lzl         | Replication                                                | {}pg          | Superuser, Create role, Create DB, Replication, Bypass RLS | {}rewind_user |                                                            | {}

pg用户是pg server自带的超级用户,跟pg安装用户相同。os的安装用户肯定有修改pg_control的权限

/pg/pg96/bin/pg_rewind --target-pgdata /pg/pg96data_pri --source-server='host=172.17.100.150 port=5433 user=pg password=oracle  dbname=postgres'

pg_rewind命令报错二

could not connect to server: FATAL:  no pg_hba.conf entry for host "172.17.100.150", user "rewind_user", database "postgres"
Failure, exiting

没有配置pg_hba.conf连接
解决办法:配置用户的pg_hba,例如

host    all       pg         172.17.100.150/32          trust

pg_rewind命令报错三

[pg@lzl pg96data_sla]$   /pg/pg96/bin/pg_rewind --target-pgdata /pg/pg96data_pri --source-server='host=172.17.100.150 port=5433 user=pg password=oracle  dbname=postgres'target server needs to use either data checksums or "wal_log_hints = on"

问题原因:
1. full_page_writes (默认开启)
2. wal_log_hints 设置成 on 或者 PG 在初始化时开启 checksums 功能 
解决办法:将wal_log_hints = on配置到目标库postgres.conf,启动再关闭一次目标库(目标库本来就是关闭的,必须启动再关闭一次,不然参数不会生效)
vi postgres.conf 加入目标库配置

wal_log_hints = on

重启目标库以生效

[pg@lzl pg96data_sla]$  /pg/pg96/bin/pg_ctl -D /pg/pg96data_pri -l /pg/pg96data_pri/server.log start
server starting
[pg@lzl pg96data_sla]$  /pg/pg96/bin/pg_ctl -D /pg/pg96data_pri -l /pg/pg96data_pri/server.log stop
waiting for server to shut down.... done

参考文档:
https://www.postgresql.org/docs/9.6/app-pgrewind.html

pg_rewind详解相关推荐

  1. oracle control file文件 详解

    1 定义当前物理数据库状态信息的二进制文件 (1)控制文件丢失的话要求恢复 (2)它是在MOUNT状态被读取的(可以在NOMOUNT状态用CREATE CONFILE重建) (3)它是数据库操作必须的 ...

  2. postgres预写式日志的内核实现详解-wal记录读取

    2019独角兽企业重金招聘Python工程师标准>>> 导读: postgres预写式日志的内核实现详解-概述 之前已经写了关于wal记录的结构.wal记录的写入的博客,流复制.PI ...

  3. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  4. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  5. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  6. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

  7. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  8. CUDA之nvidia-smi命令详解---gpu

    nvidia-smi是用来查看GPU使用情况的.我常用这个命令判断哪几块GPU空闲,但是最近的GPU使用状态让我很困惑,于是把nvidia-smi命令显示的GPU使用表中各个内容的具体含义解释一下. ...

  9. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

最新文章

  1. OBS源代码阅读笔记
  2. Java短连接生成工具-思路
  3. UE4全景插件Nvidia Ansel Photography
  4. valid, satisfiable, unsatisfiable的例子
  5. linux git gui使用教程,跨平台最好用的Git GUI工具gitkraken
  6. 大数据WEB阶段(十二)会话技术、Cookie、Session及两者的区别
  7. keil debug如何在watch直接修改变量值_零基础学VBA:什么是VBA?如何编写和运行VBA代码?...
  8. win 2016 ssh_多台WIN10之间的SSH免密登录
  9. serv-u无法自动启动:无法开始服务器!服务器执行缺少
  10. Taro+react开发(66):注意定义margin的位置
  11. mysql 5.6的gtid_mode_[MySQL 5.6] GTID实现、运维变化及存在的bug
  12. JavaScript + CSS3 实现的海报画廊特效
  13. 四大经典大数据应用案例解析
  14. Python 办公自动化之 PDF 的详细操作(全)
  15. AutoCAD打印样式中缺少.ctb只有.stb怎么办?
  16. FISCO-BCOS平台,搭建第一个区块链应用
  17. java名片_JavaWeb练习-网上名片管理系统
  18. 最新自用pdf免费在线去水印全套方案
  19. Java十年 十大组织 写在2005
  20. 从苦寻ADSL拨号王想到的 -- 需到用时方恨知道的少啊

热门文章

  1. Linux如何查找域名IP地址
  2. rust guessing game
  3. 反斜杠,让您的csv文档字符不撞车;让“借”您csv数据的人叫苦不迭。
  4. Ecshop 2.7.1 B2B2C 小京东 商城网站 商品详情页二维码显示出错
  5. 百度网盘中直接双击编辑的PPT关闭后,找不到了。
  6. 数独的生成以及解答--回溯算法c++附详细代码
  7. 场景文本检测算法 可微分二值化DBNet原理与代码解析
  8. 《2015互联网安全年报》,移动端成重灾区,黑灰产日益成熟
  9. IDEA启动报错Plugin Error Problems found loading plugins: Plugin “GlassFish Integration“ was not...
  10. 真正的端到端超像素网络——Superpixel Segmentation with Fully Convolutional Networks(CVPR2020)