帮您理解PostgreSQL(WAL、XLOG、CheckPoint进程、LSN、PITR、SR)

2024-06-17 18:12

本文主要是介绍帮您理解PostgreSQL(WAL、XLOG、CheckPoint进程、LSN、PITR、SR),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、WAL、XLOG、LSN
  • 二、检查点进程与pg_control文件-负责脏页刷盘、数据库恢复
  • 三、基础备份与时间点恢复PITR
  • 四、原生复制功能与流复制(SR Streaming Replication)

一、WAL、XLOG、LSN

在计算机领域,WAL是Write Ahead Logging的缩写,指将变更、行为先写入事务日志的协议和规则。
在PostgreSQL中,WAL是Write Ahead Log的缩写,它就是事务日志。PostgreSQL将所有修改作为历史数据写入持久化存储中,这份数据被称为XLOG记录或WAL数据。
当插入、删除、提交等变更动作发生时,pg会将xlog记录写入内存的WAL缓冲区(几乎所有的DBMS都实现了共享缓冲区,为了高效访问),一般当事务提交或中止时,它们会被立即写入持久化存储的WAL段文件中,XLOG记录的日志序列化(Log Sequence Number,LSN)标识了该记录在事务日志中的位置,LSN被用作XLOG的唯一标识符
XLOG是一种重做日志

二、检查点进程与pg_control文件-负责脏页刷盘、数据库恢复

插入数据时(脏页刷盘)

  1. 检查点进程是一个后台程序,定期执行检查点(某些条件下,如间隔300s或wal段文件的数量或大小超过参数值),检查点进程启动时,它会向当前WAL日志写入一条XLOG记录,包含最新的重做点位置。
  2. 当发起第一条INSERT语句时,PostgreSQL从数据库集簇文件(磁盘上)中加载表A的页面到内存的共享缓冲池,向页面中插入一条元组,在LSN_1的位置创建并写入XLOG记录,再讲表LSN_0更新为LSN_1。
  3. 当该事务提交时,PostgreSQL向WAL缓冲区创建并写入一条关于该提交行为的XLOG记录,再将WAL缓冲区中的所有XLOG记录写入WAL段文件(磁盘上)
  4. 当发起第二条INSERT语句时,PG向页面中插入一条新元组,然后再LSN_2位置创建并写入一条XLOG记录,最后将表A的LSN从LSN_1更新到LSN2。
  5. 当第二条语句的事务提交时,重复步骤3.
  6. 即使操作系统故障,共享缓存区所有数据度丢失额,但是所有页面的修改已经写入WAL段文件(磁盘上)
    数据库恢复时
    重启pg数据库会自动进入恢复模式,pg会从重做点开始,依序读取正确的WAL段文件并重放XLOG记录。
    1.PG从WAL段文件读取第一条INSERT语句的XLOG记录,并从硬盘上的数据库集簇加载表A到内存中的共享缓存区。
    2.PG比较XLOG记录的LSN和相应页面的LSN
    a.如果XLOG记录的LSN比页面的LSN大,则重放XLOG记录的数据插入到页面中,并更新页面的LSN为XLOG的LSN。
    b.如果XLOG记录的LSN比页面的LSN小,则什么都不做,直接读取后续WAL数据
    3.PG按照以上方式重放其余XLOG记录
    pg_control:pg_control文件包含了检查点的基本信息,如果此文件被破坏或不可读,系统就会不知道从哪里恢复,恢复过程就无法启动

三、基础备份与时间点恢复PITR

WAL是基于时间点恢复(PITR:Point-in-Time Recovery)和流复制(SR:Streaming Replication)的基础
在这里插入图片描述基础备份:全量物理备份,整个数据库集簇的运行时快照备称作基础备份
持续归档与归档日志:持续归档是当WAL段文件发生切换时自动将其复制至归档区域的功能,复制的文件被称为归档日志。
PITR:可以将数据库恢复至任意时间点,基于基础备份和持续归档生成的归档日志实现。PITR模式下的pg数据库会在基础备份的基础上重放归档日志的wal数据,从pg_start_bakup创建的重做点开始,恢复到你想要的位置为止。

四、原生复制功能与流复制(SR Streaming Replication)

原生复制功能:主库不断发送WAL数据,备库接受WAL数据,并立即重放日志
流复制:流复制包含日志传输和数据库同步两个方面。pg9.0版本后可实现同步流复制
基于流复制协议通信协议实现,具体可查看:https://www.postgresql.org/docs/11/protocol-replication.html
流复制的启动
1、启动主库服务器、备库服务器
2、备库服务器启动一个启动进程
3、备库服务器启动一个WAL接收器进程
4、WAL接收器向主库接收器发送链接请求,如果主库尚未启动,那么WAL接收器会定期重发该请求
5、当主库服务器收到链接请求,启动WAL发送器进程,并建立WAL发送器和WAL接收器之间的TCP连接。
6、WAL接收器发送备库数据库集簇上最新的LSN,握手
7、如果备库最新的LSN小于主库最新的LSN,那么WAL发送器会将钱一个LSN到后一个LSN之间的WAL数据发送到WAL接收器,这些WAL数据存储在主库的pg_xlog子目录的WAL段提供,最终备库重放接受到的WAL数据,在这个阶段,备库在追赶主库,被称为追赶阶段。
同步流复制:事务等到备库日志同步成功后才成功commit
当备库出于同步复制模式,主库提交了一个简单的INSERT事务
1、主库进程通过执行函数XlogInsert()和XLogFlush(),将WAL数据写到WAL的段文件中,
2、主库WAL发送器进程将WAL数据发送到备库的WAL接收器进程
3、主库后端进程等待来自备库的ACK响应,准确说,后端进程通过执行内部函数SyncRepWaitForLSN()来获取锁存器,并等待它被释放。
4、备库上的WAL接收器通过write()系统调用,将接受到的WAL数据写入WAL段,并想WAL发送器返回ACK响应。
5、备库WAL接收器通知备库启动进程WAL数据已更新
6、备库启动进程重放已写入WAL段的WAL数据
7、主库WAL发送器在收到来自WAL接收器的ACK响应后,释放后端进程的锁存起,然后后端进程完成commit,。
在这里插入图片描述在这里插入图片描述

这篇关于帮您理解PostgreSQL(WAL、XLOG、CheckPoint进程、LSN、PITR、SR)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070177

相关文章

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

一文详解PostgreSQL复制参数

《一文详解PostgreSQL复制参数》PostgreSQL作为一款功能强大的开源关系型数据库,其复制功能对于构建高可用性系统至关重要,本文给大家详细介绍了PostgreSQL的复制参数,需要的朋友可... 目录一、复制参数基础概念二、核心复制参数深度解析1. max_wal_seChina编程nders:WAL

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序