返回顶部
首页 > 资讯 > 数据库 >PostgreSQL备机checkpoint
  • 338
分享到

PostgreSQL备机checkpoint

2024-04-02 19:04:59 338人浏览 泡泡鱼
摘要

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

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

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

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

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

1、备机回放

StartupXLOG
    do{
        ...
        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赋值

ReadRecord
    for (;;)
    {
        char       *errORMsg;

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

5、备机createcheckpoint

bool
CreateRestartPoint(int flags)
{

    LWLockAcquire(CheckpointLock, LW_EXCLUSIVE);

    
    SpinLockAcquire(&XLogCtl->info_lck);
    lastCheckPointRecPtr = XLogCtl->lastCheckPointRecPtr;//checkpoint的位置来自XLogCtl->lastCheckPointRecPtr
    lastCheckPointEndPtr = 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)
{
    
    WalSndInitStopping();

    
    WalSndWaitStopping();

    if (RecoveryInProgress())//备机写checkpoint
        CreateRestartPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
    else
    {
        
        if (XLogArchivingActive() && XLogArchiveCommandSet())
            RequestXLogSwitch(false);

        CreateCheckPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
    }
    ShutdownCLOG();
    ShutdownCommitTs();
    ShutdownSUBTRANS();
    ShutdownMultiXact();
}

7、总结

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

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL备机checkpoint

本文链接: https://lsjlt.com/news/34638.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PostgreSQL备机checkpoint
      数据库异常关闭时,数据库关闭时来不及或者没机会做checkpoint,则需要从上一个一致性检查的开始恢复。     PostgreSQL备机checkpoint是不能产生checkpoint WAL的,...
    99+
    2024-04-02
  • PostgreSQL checkpoint--shutdown
    PostgreSQL在shutdown时会进行checkpoint。其流程如下。 1、在主进程中,会首先注册一个信号处理函数reaper,用于向checkpoint等子进程发送信号。向checkpoint进...
    99+
    2024-04-02
  • PostgreSQL xlog格式之checkpoint
    PostgreSQL xlog记录格式分为2大部分,第一部分是XLogRecord作为通用xlog头,第二部分是数据部分:又分为XLogRecordDataHeaderShort作为记录checkpoint...
    99+
    2024-04-02
  • 怎么使用Postgresql的Checkpoint
    这篇文章主要讲解了“怎么使用Postgresql的Checkpoint”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用Postgresql的Check...
    99+
    2024-04-02
  • postgresql如何检查点调整checkpoint
    小编给大家分享一下postgresql如何检查点调整checkpoint,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!postg...
    99+
    2024-04-02
  • PostgreSQL启动恢复通过checkpoint open wal文件
    StartupLOG:: ->record = ReadCheckpointRecord(xlogreader, ControlFile->checkPoint, 1, true) -...
    99+
    2024-04-02
  • Checkpoint与state的关系以及Checkpoint的执行机制
    这篇文章主要讲解了“Checkpoint与state的关系以及Checkpoint的执行机制”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Checkpoint与state的关系以及Check...
    99+
    2023-06-02
  • checkpoint机制如何实现
    这篇文章主要讲解了“checkpoint机制如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“checkpoint机制如何实现”吧!checkpoint 机制的具体实现我们都知道为了优化...
    99+
    2023-07-05
  • PostgreSQL启动恢复读取checkpoint记录失败的条件
    1、首先读取ControlFile->checkPoint指向的checkpoint 2、如果读取失败,slave直接abort退出,master再次读取ControlFile->prevChe...
    99+
    2024-04-02
  • PostgreSQL中checkpoint_completion_target参数对checkpoint调度的影响是什么
    这篇文章主要介绍“PostgreSQL中checkpoint_completion_target参数对checkpoint调度的影响是什么”,在日常操作中,相信很多人在PostgreSQL中checkpoi...
    99+
    2024-04-02
  • PostgreSQL checkpoint中用于刷一个脏page的函数是什么
    这篇文章主要讲解了“PostgreSQL checkpoint中用于刷一个脏page的函数是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Postgre...
    99+
    2024-04-02
  • checkpoint机制具体实现示例详解
    目录checkpoint 机制的具体实现BackNode 节点冷备份checkpoint 的实现checkpoint 机制的具体实现 我们都知道为了优化分布式存储系统中 NameN...
    99+
    2023-02-07
    checkpoint 机制实现 checkpoint 机制
  • postgresql数据备份迁移
    前提背景: 项目开发的时候,我们一般都会分为测试环境和正式环境,当本地调试基本完成之后,项目向正式环境迁移的时候,数据相应的也要全量迁移到正式环境,因为我们使用的pgsql数据库,这里就为大家介...
    99+
    2023-09-16
    postgresql 数据库 服务器
  • PostgreSQL VFD机制
    1、结构体VFD机制中由结构体struct vfd来维护。其中各个成员变量的意义如下表所示:fdvfd实际对应的物理文件文件描述符fdstateFD_DELETE_AT_CLOSE:表示文件在关闭时需删除F...
    99+
    2024-04-02
  • PostgreSQL 数据库备份脚本
    PostgreSQL 数据库备份脚本 #!/bin/bash # PG家目录(/opt/postgresql/pg96/) PG_HOME=${PGHOME} # pg数据库连接信息 PG_HOST="127.0.0.1" PG_P...
    99+
    2014-07-22
    PostgreSQL 数据库备份脚本
  • postgresql使用pg_rman备份恢复
    os:centos 7.5 postgresql: 10.01.软件下载:https://github.com/ossc-db/pg_rman/releases/pg_rman-1.3.7-1.pg10.r...
    99+
    2024-04-02
  • postgresql怎么备份数据库
    在 PostgreSQL 中,可以使用 pg_dump 工具来备份数据库。以下是备份数据库的步骤: 打开终端或命令行窗口,并登录...
    99+
    2024-04-17
    postgresql
  • postgresql如何备份数据库
    在 PostgreSQL 中备份数据库有多种方法,以下是其中一种常用的方法: 使用 pg_dump 命令进行备份: 在命令行中输...
    99+
    2024-04-22
    postgresql
  • 【Postgresql】postgresql9.3.9版本基于流复制方式双机热备方案
    系统环境:centos6.5数据库版本: postgres9.3.9虚拟机2台:Master:10.0.2.160Slave:10.0.2.69数据存储位置:/usr/local/pgsql/data/ ...
    99+
    2024-04-02
  • PostgreSQL 数据库备份与还原
    PostgreSQL 数据库备份与还原 目录 备份 还原 栗子 备份 PostgreSQL提供的一个工具pg_dump,逻辑导出数据,生成sql文件或其他格式文件,pg_dump是一个客户端工具,可以远程或本地导出逻辑数据,恢复...
    99+
    2015-11-20
    PostgreSQL 数据库备份与还原
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作