数据库异常关闭时,数据库关闭时来不及或者没机会做checkpoint,则需要从上一个一致性检查的开始恢复。

PostgreSQL备机checkpoint是不能产生checkpoint WAL的,因为如果写这样类型的checkpoint的话,就会将接收的WAL打乱,那么日志将混乱,回放会出问题。

那么问题来了,备机支持checkpoint吗?他的checkpoint怎么做的?

PostgreSQL为了缩短恢复时间,备机上也支持checkpoint,即CreateRestartPoint。但是其pg_control文件的checkpoint记录的位点是从主机传过来WAL里面的checkpoint记录位置。

调用流程:

StartupXLOGdo{...RmgrTable[record->xl_rmid].rm_redo(xlogreader);|--   RecoveryRestartPoint(&checkPoint);|--   XLogCtl->lastCheckPointRecPtr = ReadRecPtr;...record = ReadRecord(xlogreader, InvalidXLogRecPtr, LOG, false);|--   record = XLogReadRecord(xlogreader, RecPtr, &errormsg);|-- ReadRecPtr = xlogreader->ReadRecPtr;} while (record != NULL);ShutdownXLOG->CreateRestartPoint:lastCheckPointRecPtr = XLogCtl->lastCheckPointRecPtr;ControlFile->checkPoint = lastCheckPointRecPtr;

1、备机回放

StartupXLOGdo{...RmgrTable[record->xl_rmid].rm_redo(xlogreader);//回放...record = ReadRecord(xlogreader, InvalidXLogRecPtr, LOG, false);//读取一个xlog} while (record != NULL);

2、回放函数

void
xlog_redo(XLogReaderState *record)
{...else if (info == XLOG_CHECKPOINT_SHUTDOWN){...memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint));...RecoveryRestartPoint(&checkPoint);}else if (info == XLOG_CHECKPOINT_ONLINE){...memcpy(&checkPoint, XLogRecGetData(record), sizeof(CheckPoint));...RecoveryRestartPoint(&checkPoint);}...
}

3、RecoveryRestartPoint

static void
RecoveryRestartPoint(const CheckPoint *checkPoint)
{...SpinLockAcquire(&XLogCtl->info_lck);XLogCtl->lastCheckPointRecPtr = ReadRecPtr;//ReadRecPtr为读取checkpoint记录后的位置XLogCtl->lastCheckPointEndPtr = EndRecPtr;XLogCtl->lastCheckPoint = *checkPoint;SpinLockRelease(&XLogCtl->info_lck);
}

4、ReadRecPtr赋值

ReadRecordfor (;;){char     *errormsg;record = XLogReadRecord(xlogreader, RecPtr, &errormsg);ReadRecPtr = xlogreader->ReadRecPtr;EndRecPtr = xlogreader->EndRecPtr;...}

5、备机createcheckpoint

bool
CreateRestartPoint(int flags)
{LWLockAcquire(CheckpointLock, LW_EXCLUSIVE);/* Get a local copy of the last safe checkpoint record. */SpinLockAcquire(&XLogCtl->info_lck);lastCheckPointRecPtr = XLogCtl->lastCheckPointRecPtr;//checkpoint的位置来自XLogCtl->lastCheckPointRecPtrlastCheckPointEndPtr = XLogCtl->lastCheckPointEndPtr;lastCheckPoint = XLogCtl->lastCheckPoint;SpinLockRelease(&XLogCtl->info_lck);...if (XLogRecPtrIsInvalid(lastCheckPointRecPtr) || lastCheckPoint.redo <= ControlFile->checkPointCopy.redo){//回放了最后一个checkpoint记录后,备机再次手动执行checkpoint命令UpdateMinRecoveryPoint(InvalidXLogRecPtr, true);if (flags & CHECKPOINT_IS_SHUTDOWN){LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY;ControlFile->time = (pg_time_t) time(NULL);UpdateControlFile();LWLockRelease(ControlFileLock);}LWLockRelease(CheckpointLock);return false;}...LWLockAcquire(ControlFileLock, LW_EXCLUSIVE);if (ControlFile->state == DB_IN_ARCHIVE_RECOVERY && ControlFile->checkPointCopy.redo < lastCheckPoint.redo){ControlFile->prevCheckPoint = ControlFile->checkPoint;ControlFile->checkPoint = lastCheckPointRecPtr;//checkpoint的位置ControlFile->checkPointCopy = lastCheckPoint;ControlFile->time = (pg_time_t) time(NULL);...if (flags & CHECKPOINT_IS_SHUTDOWN)ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY;UpdateControlFile();}...return true;
}

6、备机shutdown

void
ShutdownXLOG(int code, Datum arg)
{/** Signal walsenders to move to stopping state.*/WalSndInitStopping();/** Wait for WAL senders to be in stopping state.  This prevents commands* from writing new WAL.*/WalSndWaitStopping();if (RecoveryInProgress())//备机写checkpointCreateRestartPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);else{/** If archiving is enabled, rotate the last XLOG file so that all the* remaining records are archived (postmaster wakes up the archiver* process one more time at the end of shutdown). The checkpoint* record will go to the next XLOG file and won't be archived (yet).*/if (XLogArchivingActive() && XLogArchiveCommandSet())RequestXLogSwitch(false);CreateCheckPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);}ShutdownCLOG();ShutdownCommitTs();ShutdownSUBTRANS();ShutdownMultiXact();
}

7、总结

PostgreSQL备库也可以写检查点,目的是避免每次重启备库都需要从上一个检查点(由主库产生,在WAL中回放出来的)APPLY后面所有的WAL。但是他记录的checkpoint位点是从主库传过来的。这样的话就有问题了,如果主机很长时间都没有做checkpoint了,备机即使正常关闭,重启时,也会从上一个checkpoint开始恢复,这样也会恢复很长时间;并且多次重启也需要从上一次checkpoint开始重复恢复。

PostgreSQL备机checkpoint相关推荐

  1. PostgreSQL数据库WAL——备机回放checkpoint WAL

    从PostgreSQL数据库WAL--资源管理器RMGR文章中,我们知道XLog日志被划分为多个类型的资源管理器,每个资源管理器只需要负责与自己相关的日志处理(抽象出操作函数,不同的日志实现不同的操作 ...

  2. Mysql备机复制到主机_mysql主从复制的实现

    唱宇 2010-10-13 北京 最近测试了mysql主从复制的实现,现在记录一下:因为网上有些文章的mysql版本较老,有些参数已经不适合了. 确保 Master 与 Slave 之间的数据一致 [ ...

  3. oracle控制文件全备失败,Oracle数据库案例整理-恢复数据库失败-主备机控制文件所在目录不同...

    1.1       现象描述 使用主机节点的控制文件在备机节点上进行恢复时失败. ·         主节点控制文件目录为:"/opt/HUAWEI/cgp/workshop/omu/dat ...

  4. BESR备机恢复主机

    最近实施了一个桌面安全管理系统的项目其中使用的恢复备份软件为SYMANTEC BESR这款产品,主机不停机备份,通过远程恢复备机,非常方便,记录一下重点应当注意的几个地方. 首先恢复时候应当使用sym ...

  5. 数仓备机DN重建:快速修复你的数仓DN单点故障

    摘要:大规模分布式系统中的故障无法避免.当DN发生单点故障时,恢复手段有哪些,又是如何恢复的,本节重点介绍操作gs_ctl build是如何修复DN单点故障的. 本文分享自华为云社区<华为云数仓 ...

  6. PostgreSQL 备库apply延迟原理分析与诊断

    标签 PostgreSQL , 物理流复制 , IO不对称 背景 开车的同学都喜欢一马平川,最好是车道很多,车很少,开起来爽. 大家想象一下,同样的车速,6车道每秒可以通过6辆车,而1车道每秒就只能通 ...

  7. 集成平台Ensemble环境搭建(HealthShare) 及MIRROR镜像(主备机)的配置

    一. 准备阶段 三台服务器:主机.备机.仲裁机,分别分配三个IP,然后再准备一个IP作为虚拟IP 二. 安装配置Ensemble 1. IIS的配置.确保IIS配置在Ensemble之前. 2.双击运 ...

  8. DATAGUARD备机报ORA-01555错误的问题

    近期,某用户的DATAGUARD备机,在只读查询模式,隔一段时间就出现ORA-01555错误.在ADG备机中,ORA-01555错误有几个相关的BUG,本次为典型的SQL执行Query Duratio ...

  9. Oracle DataGuard备机出现ORA-00600 [2619]错误的处理思路

    晚上接到用户电话,DG备机报错无法正常同步.ORA-00600: internal error code, arguments: [2619], [84747],了解到之前出现磁盘空间满,已经人为删除 ...

最新文章

  1. [泰然翻译] cocos2d programming guide 场景和菜单
  2. 6万广州人坐过无人出租车,过半月薪一万以上 | 中国首份Robotaxi乘客调研报告...
  3. BZOJ3836 : [Poi2014]Tourism
  4. maven 常用插件3
  5. Cannot open the disk 'E:/vmware/Ubuntu.vmdk' or one of the snapshot disks it depends on. 解决方法
  6. uC/OS-II源码分析(总体思路 三)
  7. oracle锁mode,【案例】Oracle dml操作产生TM锁 lmode=6 分析原因和解决办法
  8. 寒武纪“动荡”的 6 周年:CTO 梁军离职,市值蒸发 59 亿,核心技术人才仅剩 3 人
  9. jquery判断自己是父节点的第几个子节点
  10. Linux下PhpMyAdmin程序目录的安全管理
  11. Pr 音频效果参考:特殊效果
  12. 音频基础之Smaart7声卡测试
  13. GoLang之取地址符、指针
  14. 网络前沿技术期末考题盘点
  15. 【Android Camera2】玩转图像数据 -- NV21图像旋转,镜像,转rgba代码分析,性能优化
  16. 锂电池充电的同时也能放电吗?
  17. iphone 弹出键盘,文本框自动向上移动。
  18. 软件开发平台之争:NET VS Java,谁是更好的选择?
  19. python3 zlib 实现压缩与解压字符串与文件数据流
  20. 运筹帷幄的“懒蚂蚁”

热门文章

  1. HMM-前向后向算法
  2. 亚像素级精确度的角点
  3. ​Python:PyTorch 汽车计数示例
  4. 开发一款app软件需要什么样的服务器
  5. 小米离「高富帅」还有多远?
  6. Ajax实现跨域请求
  7. 计算机在机械智能制造中的应用,数控技术在智能制造中的应用及发展
  8. 网络设备配置与管理,校园网规划
  9. 四旋翼飞行器13——欧拉中的俯仰、横滚、偏航角
  10. 雷军手机使用时长曝光!一天刷抖音、微博、微信,办公仅34分钟