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

相关文章

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

python多进程实现数据共享的示例代码

《python多进程实现数据共享的示例代码》本文介绍了Python中多进程实现数据共享的方法,包括使用multiprocessing模块和manager模块这两种方法,具有一定的参考价值,感兴趣的可以... 目录背景进程、进程创建进程间通信 进程间共享数据共享list实践背景 安卓ui自动化框架,使用的是

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

C#如何优雅地取消进程的执行之Cancellation详解

《C#如何优雅地取消进程的执行之Cancellation详解》本文介绍了.NET框架中的取消协作模型,包括CancellationToken的使用、取消请求的发送和接收、以及如何处理取消事件... 目录概述与取消线程相关的类型代码举例操作取消vs对象取消监听并响应取消请求轮询监听通过回调注册进行监听使用Wa

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

PostgreSQL如何用psql运行SQL文件

《PostgreSQL如何用psql运行SQL文件》文章介绍了两种运行预写好的SQL文件的方式:首先连接数据库后执行,或者直接通过psql命令执行,需要注意的是,文件路径在Linux系统中应使用斜杠/... 目录PostgreSQ编程L用psql运行SQL文件方式一方式二总结PostgreSQL用psql运

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言