帮您理解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

相关文章

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.