PostgreSQL 数据库归档最近被问及的问题问题 与 4 毋 处世学

9c2eb50c91e2d3aba4064337e38168b2.png

开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内,可以解决你的问题。加群请联系 liuaustin3 ,(共1790人左右 1 + 2 + 3 + 4 +5) 4群(300+ 到350将关闭自由申请),另欢迎 OpenGauss 的技术人员加入。

在开始文章前,本人应邀参加12月28日的一场分享活动,这里做做广告。

0c631832641a9a9dd60077f92729d854.png

还是老规矩,技术加生活,先说技术,后说生活的感悟和人生的学习。

在PostgreSQL 中很少被提及的一个问题,归档,而这里经常有人问这个问题,所以需要写一期来说说关于ARCHIVE 的问题。

首先我们需要提出几个问题,

1 为什么要归档,PG中归档了什么

2  什么时间进行归档,归档的原理与频率

3  要怎么在PG中进行归档,归档的方式

在开始研究我们的archive 的问题时我们需要先把archive的知识拉平

首先在pg_wal目录中的日志本身,至少会维护一个当前正在写入的文件,日志中记录了操作中对于数据库的全部更改项,这里需要注意在 archive关闭的状态下,他会将不再使用WAL文件重命名来和重新利用数据库

问题1 ,在PG中WAL日志作为数据库中最核心的日志与保障数据库数据安全的方法,在运行中会产生大量的WAL日志,这里其中包含FULLPAGE  导致的WAL 过大的问题,一般来讲我们认为日志本身的内容占据WAL的数据的内容的30%,而FULL PAGE 的部分占据70%左右的数据,所以PG的WAL归档是一个必须的操作,即时的解决你的磁盘空间重复利用的问题。

在归档中,有一个问题,关于如何触发 archive,这里主要有几点

1   当前的 wal 被写满,并且产生了新的wal文件

2  手动通过pg_switch_wal 来进行数据库的产生新的PG_WAL 文件并且在产生新的PG_WAL 文件后,会对老的WAL 文件产生归档的触发条件。

3  自动设置超时时间archive_timeout 参数并reload 后,到时间会强行进行产生 pg_wal的工作,并且对数据的wal 进行归档。

所有产生数据归档的触发点很多,总结一点产生wal  文件的时候就会触发归档命令。

这里还有一些细节

1 归档如果失败,则归档会持续的被触发,错误日志中会记录归档失败的信息。

2  归档中因为某些原因可以设置, wal_keep_size来解决一些关于日志被归档后,但日志在物理复制中还未被应用而导致的复制中断的问题。

postgres=# show wal_keep_size;

 wal_keep_size 

---------------

 0

(1 row)

3 基于归档的的方式方法,postgresql给出的是一个开放性的方案,在这样的方案中,数据库并没有设定具体怎么去归档,这里比如有传统的方案,S3方案,或者脚本的方案等等,所以归档这个事情是需要自行进行设计和根据自己的情况来进行安排的。

86cbdbbeec4656d6b51675f5a854cb8b.png

4  在归档中,会出现一些问题,比如数据库恢复后,在进行归档发现归档文件中已经有这个文件了,那么归档必然失败,所以需要手动处理一下,将重复的文件进行清理,然后就可以正常归档了。

5  archive timeout 不要设置的太短,太短会强制产生PG-WAL 文件这些文件都会被填充值,造成PG_WAL膨胀的厉害。

通过命令可以查看当前正在使用的日志文件

SELECT pg_walfile_name(pg_current_wal_lsn());

test=# SELECT pg_walfile_name(pg_current_wal_lsn());
     pg_walfile_name      
--------------------------
 000000010000000000000003
(1 row)

这里PG通过pg_wal/archive_status 来进行数据的归档判断,并且归档进程每60秒进行一次尝试工作,调用pgarch_archivercopyloop() 来处理每个等待处理的WAL 段,通过archive_command 来进行数据的归档的处理

但归档的问题主要出在一个部分,就是归档中如何判断要进行下一个文件的归档,这里是通过archive_status 来进行判断的,但这里的问题是,每次需要对文件夹里面的文件进行一个遍历如果这里面的文件很多的情况下,会阻碍归档文件流程中的性能。

这里PG15对这个问题进行了梳理和解决,他们根据将文件名保存到数组的放方式来进行判断下一个需要进行归档的文件是那个。

其中的流程是

扫描 archive_status 目录,然后将需要进行归档的日志放到一个数组中,并且将信息提供给archive_command命令或模块,这样减少在目录中扫描的的数量,但仍会发生目录扫描,并存在相关的O(n^2)复杂度。

 通过这项改进,在社区的测试报告中,提到在这项上面提高了20多倍的性能。

写到这里并没有完,实际上我们在数据归档后还需要对归档后的文件进行清理,大多数的情况下,清理归档文件是通过手动,通过归档文件的日期来进行清理,利用磁盘空间和存储有效的数据归档文件。

在一些场合下,比如你没有使用一些高级的备份软件的情况下,你的数据归档最后的清理和留存可能会需要 pg_archivecleanup 命令来进行清理,pg_archivecleanup 本身没是一个非常小的,独立的单个文件,不需要利用postgresql 服务器,源代码400行,他的功能主要有以下函数来完成

initialize , TrimExtension, CleanupPriorWALFile, 

SetWALFileNameForCleanup

初始化是在数据库中调用函数并检测程序初始化中的对象是否是一个文件夹,如果不是则直接报错,同时TrimExtension是将该函数目录的每个文件的后缀都去掉,方便进行以主名来进行数据的清理, CleanupPriorWalFile 函数通过获得对应的wal 的文件名来将进行比较,比当前文件在早的文件都会被清理,这里通过setWalFileNameForCleanup 来进行数据的名的获取。

如果希望pg_archivecleanup 独立工作,可以通过如下的命令来设置,但这里首先需要获得正确的archivelocation的目录。

archive_cleanup_command = 'pg_archivecleanup archivelocation %r'

参考文章:

https://www.percona.com/blog/speed-up-of-the-wal-archiving-in-postgresql-15/

————————————————————————————

最近一直在除了持续学习数据库技术外,提高自己的认知的维度,4毋是最近和冯老师学到的,毋意,毋必,毋固, 毋我

1 毋意: 不要臆想,不要你认为,你觉得,你习惯,你不是事情的核心,庄子:且夫水之积也不厚,则其负大舟也无力,如果你做事,看书,经历不够广,那么你做的事情不能保证大概率在当时当下是对的。

2 毋必:  没有什么是绝对的,包含名人名言,要时刻保持清晰的思考,判断,认知是有局限的。

3 毋固: 没有什么事情是不能进行转换变通的,不要故步自封,不要过早的下结论,对事情在一开始就存在固有的开发和定义,不与时俱进,并同步最新的知识。

4 毋我: 做事不要以自己为中心,要以事情为中心,如何将事情完成好,是关键,而不是把自己摆到事情的前面,为了脸面,为了所谓的自尊

6ac9af48cfaaddea7e01a8591d62e57e.png

97a5d51d367c3f58ff7f60759491eda4.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/277651.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 通过鼠标框选绘制矩形区域

鼠标拖动的同时绘制一块同等大小的区域:如下 using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 通过鼠标框选绘制矩形区域 /// </summary> /// public enum MouseType {left = 0,right = 1,middle = 2 } publi…

关于<取消对 NULL 指针“r”的引用><从 “a“ 读取无效数据>两个问题的解决办法

【取消对 NULL 指针“r”的引用】 修改&#xff1a; 必须要检查malloc的返回值&#xff0c;避免空间不够 &#xff08;nullptr只能用于指针类型&#xff0c;不能用于整数类型&#xff09; 【从 "a" 读取无效数据】 修改&#xff1a; 用指针法来表示&#xff0c;…

三张表看懂POE POE+ POE++ 三个协议的相关参数

Hqst华强盛&#xff08;盈盛电子&#xff09;导读&#xff1a;三张表看懂POE POE POE 三个协议的相关参数。 一 ̖ POE协议区分&#xff1a; 802.3af&#xff08;PoE) 百兆网络变压器H81621S 二 ̖ POE协议与受电设备&#xff08;PD&#xff09;工作功率分级 802.3at&#xf…

Yapi接口管理平台Centos7部署

文章目录 1.环境准备1.1 关闭透明大页THP1.2 设置最大文件打开数最大进程数 2.Nodejs安装3.安装Mongodb3.1 下载安装3.2 配置3.3 配置环境变量3.4 启动3.5 关闭 4.安装YAPI4.1 离线安装4.2 页面安装&#xff08;本次采用&#xff09;4.3 访问 1.环境准备 1.1 关闭透明大页THP …

小米SU7正式亮相,媒介盒子多家媒体报道

哈喽大家好啊&#xff0c;今天 媒介盒子来和大家分享媒体推广的干货知识&#xff0c;本篇分享的主要内容是新车上市&#xff0c;小米SU7的营销逻辑 在12月28日下午的发布会上&#xff0c;小米C级轿车SU7正式亮相&#xff0c;SU7的发布&#xff0c;也意味着小米智能科技“人车家…

【Shell编程练习】通过位置变量创建 Linux 系统账户及密码

系列文章目录 输出Hello World 系列文章目录位置变量代码实现运行结果 位置变量 位置变量将以数字方式对变量进行命名&#xff0c;可将命令行参数的值存储到脚本中。要从命令行、函数或脚本执行等处传递参数时&#xff0c;就需要在 Shell 脚本中使用位置参数变量。下表为常用…

2020年认证杯SPSSPRO杯数学建模A题(第一阶段)听音辨位全过程文档及程序

2020年认证杯SPSSPRO杯数学建模 A题 听音辨位 原题再现&#xff1a; 把若干 (⩾ 1) 支同样型号的麦克风固定安装在一个刚性的枝形架子上 (架子下面带万向轮&#xff0c;在平地上可以被水平推动或旋转&#xff0c;但不会歪斜)&#xff0c;这样的设备称为一个麦克风树。不同的麦…

LaTeX 符合 GB/T 7714-2015 标准的 biblatex 参考文献样式

需求&#xff1a;用LaTeX写学位论文&#xff0c;想得到符合 GB/T 7714-2015 标准的 biblatex 参考文献样式&#xff08;按照GB/T7714-2015的格式要求&#xff0c;英文作者名的字母全部大写&#xff09;。 命令&#xff1a; %在导言区加载宏包和文献文件&#xff0c;注意gb7714…

一文详解Cookie以及Selenium自动获取Cookie

前言 以后数据获取途径以及数据资产绝对会是未来核心要素生产工具和资源之一&#xff0c;每个大模型都离不开更加精细化数据的二次喂养训练。不过现在来看收集大量数据的方法还是有很多途径的&#xff0c;有些垂直领域的专业数据是很难获取得到的&#xff0c;靠人力去搜寻相当…

深眸科技创新工业AI视觉系统,与机械臂协同工作实现视觉引导功能

工业AI视觉系统&#xff1a;工业AI视觉系统能够在工业环境中进行缺陷检测、视觉分拣、物流供包、拆码垛、工业上料等应用。 随着国内工业企业不断进步和发展&#xff0c;传统机器视觉无法满足企业对复杂操作流程的需求&#xff0c;多数制造企业对于机器视觉系统的需求增长。而…

在SpringBoot中自定义指标并使用Prometheus监控报警

公众号「架构成长指南」&#xff0c;专注于生产实践、云原生、分布式系统、大数据技术分享 在10 分钟教你使用Prometheus监控Spring Boot工程中介绍了如何使用Prometheus监控Spring Boot提供的默认指标&#xff0c;这篇介绍如何自定义业务指标&#xff0c;并使用Prometheus进行…

Fedora操作系统有哪些优势

Fedora是一种基于Linux内核的开源操作系统&#xff0c;被广泛的认为是一款先进的、功能丰富的操作系统。它有许多的优势&#xff0c;从最新的软件版本到社区驱动的开发&#xff0c;以及安全性和稳定性等方面。下面我简单的介绍有哪些优势。 最新的软件版本 Fedora以当前最新的…

内网渗透之Vulnstack4靶场的全方位打法

靶场考察点 MS14-068漏洞 MS14-068是一个著名的Windows Kerberos安全漏洞&#xff0c;允许攻击者篡改Kerberos票据&#xff0c;从而获取非法提权。这个漏洞特别影响Windows域控制器&#xff0c;能让攻击者伪造Kerberos票据&#xff0c;获取域内几乎任意账户的权限&#xff0c…

鸿蒙系列--组件介绍之容器组件

一、Badge 描述&#xff1a;给其他组件添加标记 子组件&#xff1a;支持单个子组件 1.创建数字标记 Badge(value: {count: number, position?: BadgePosition, maxCount?: number, style: BadgeStyle}) 2.创建字符串标记 Badge(value: {value: string, position?: Badge…

关于Python里xlwings库对Excel表格的操作(二十三)

这篇小笔记主要记录如何【用“.number_format ”函数设置单元格的文本各种属性】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff0…

批量抠图软件哪个好用?推荐这三款抠图工具给你

在数字图像处理的世界里&#xff0c;抠图是个不可或缺的环节。对于那些经常需要从复杂背景中提取主体的设计师和摄影师来说&#xff0c;抠图技巧无疑是一项宝贵的职业技能。然而&#xff0c;当面对大量的抠图需求时&#xff0c;手动处理不仅耗时&#xff0c;而且效率低下。因此…

Junit在多线程测试时的坑

Junit单元测试主线程退出&#xff0c;子线程也会退出 Testpublic void test() throws InterruptedException {Thread t1 new Thread(() -> {try {TimeUnit.SECONDS.sleep(5);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.…

PowerShell Instal 一键部署gitea

gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…

在Java中使用选择排序将数组中的一列元素排列出来

思想 选择排序&#xff1a;特点有简单直观、从大到小、每趟从待选择的元素中选出最小或最大的一个元素&#xff0c;顺序放在已经排好的序列的最后&#xff0c;直到全部待排序数据元素排完。 代码 public class SelectSort {public static int[] orderby(int[] nums,String …

C++标准模板库(STL)

标准模板库&#xff08;STL&#xff09;是一组C模板类&#xff0c;提供常见的编程数据结构和函数&#xff0c;如列表、堆栈、数组等。它是一个容器类、算法和迭代器的库。它是一个通用库&#xff0c;因此&#xff0c;它的组件是参数化的。模板类的相关知识是使用STL的先决条件。…