PostgreSQL 常见配置参数
max_wal_size :
两个检查点(checkpoint)之间,WAL可增长的最大大小,即:自动WAL checkpoint允许WAL增长的最大值。
该值缺省是1GB。如果提高该参数值会提升性能,但也是会消耗更多空间、同时会延长崩溃恢复所需要的时间。
注意:这个参数是个软限制,不是硬限制,因此实际WAL可能会超过这个值(如:较大的 wal_keep_segments 设置)。
min_wal_size :
检查点(checkpoint)后用来保留的,用于未来循环使用的WAL文件。可以被用来确保有足够的WAL空间被保留来应付WAL使用的高峰,以供将来的检查点使用。这可以用来确保预留足够的WAL空间处理WAL使用中的峰值,比如当运行大批量工作时。
如果PG空闲时,会逐渐将WAL量减少到 min_wal_size。
该值缺省是80MB。请不要将该值设置的太小。
查看数据库 min_wal_size & max_wal_size 参数配置:
testdb01=> select name, setting, unit, short_desc from pg_settings where name like '%wal_size%';
max_wal_size | 1024 | MB | Sets the WAL size that triggers a checkpoint.
min_wal_size | 80 | MB | Sets the minimum size to shrink the WAL to.
也可以执行:
testdb01=> show max_wal_size;
1GB
testdb01=> show min_wal_size;
80MB
testdb01=>
WAL空间使用情况:
如果日志量大于 max_wal_size,则WAL日志空间尽量保持在 max_wal_size 。因为会触发检查点,不需要的段文件将被移除直到系统回到这个限制以下。
如果日志量小于 max_wal_size,则WAL日志空间至少保持 min_wal_size。可以被用来确保有足够的WAL空间被保留来应付WAL使用的高峰,以供将来的检查点使用。
通常情况下,WAL日志空间大小在 min_wal_size ~ max_wal_size 之间动态评估。该估计基于在以前的检查点周期中使用的WAL文件数的动态平均值。如果实际使用量超过估计值,动态平均数会立即增加。
-bash-4.2$ cd $PGDATA
-bash-4.2$ du -sh pg_wal && ls -lh pg_wal/
1.2G pg_wal
total 1.2G
-rw-------. 1 postgres postgres 16M Feb 6 09:20 000000010000000000000001
-rw-------. 1 postgres postgres 16M Feb 14 19:04 000000010000000000000002
-rw-------. 1 postgres postgres 16M Feb 14 19:04 000000010000000000000003
-rw-------. 1 postgres postgres 16M Feb 14 19:04 000000010000000000000004
-rw-------. 1 postgres postgres 16M Feb 14 19:04 000000010000000000000005
......
-rw-------. 1 postgres postgres 16M Feb 14 19:11 00000001000000000000003E
-rw-------. 1 postgres postgres 16M Feb 14 19:11 00000001000000000000003F
-rw-------. 1 postgres postgres 16M Feb 14 19:11 000000010000000000000040
-rw-------. 1 postgres postgres 16M Feb 14 19:12 000000010000000000000041
-rw-------. 1 postgres postgres 16M Feb 14 19:12 000000010000000000000042
-rw-------. 1 postgres postgres 16M Feb 14 19:12 000000010000000000000043
-rw-------. 1 postgres postgres 16M Feb 14 19:12 000000010000000000000044
-rw-------. 1 postgres postgres 16M Feb 14 19:12 000000010000000000000045
-rw-------. 1 postgres postgres 16M Feb 14 19:12 000000010000000000000046
-rw-------. 1 postgres postgres 16M Feb 14 19:12 000000010000000000000047
drwx------. 2 postgres postgres 6 Dec 6 2021 archive_status
-bash-4.2$
pg_wal大小至少保留 80MB 的文件,也就是 000000010000000000000001~47 所有文件至少保留 80MB
执行checkpoint以后,pg_wal大小可能会降低到 max_wal_size 以内,多次执行checkpoint不一定会降低到 min_wal_size,这还处决于很多其他配置和因素。
关于checkpoint
checkpoint:
A checkpoint is a point in the write-ahead log sequence at which all data files have been updated to reflect the information in the log. All data files will be flushed to disk.
checkpoint是WAL(write-ahead log)日志中的一个位点,在这个点位之前数据库中的所有数据都和WAL日志中反映的信息相同,也就是说该位点之前所有 Shared Buffer 中的脏页均已被刷入到存储磁盘。
checkpoint 是一个名词,同时也是一个动词,执行一个 checkpoint 操作,会往 WAL 日志里写 checkpoint 位点。
PostgreSQL 写数据的过程:
INSERT INTO test01 VALUES(1);
流程如下:
step1:将 INSERT 1 这个操作写入 WAL 日志中。 WAL 日志是物理日志,记录的是对某个文件某个块的修改。
step2:修改 Shared Buffer 中该页的信息(如果该页不在 Buffer 中,则从磁盘去取),test01表中写入1。此时如果有表的读取则直接读取Shared Buffer返回数据。
step3:background writer 写磁盘(disk)。background 进程会在某个时刻将 Shared Buffer 中的数据刷到磁盘。但是这并不是立刻发生的,而是一个异步操作。
PostgreSQL数据库故障恢复:
如果上面step3过程中出现故障、background wirter 写磁盘失败了,那么PostgreSQL重启会进入恢复模式,会基于上次 checkpoint点位和 WAL(Redo) 日志进行重放,从而将数据刷到磁盘。
checkpoint 操作会往 WAL 日志里写 checkpoint 位点。例如:
WAL: | ... | INSERT 1 | INSERT 2 | ... | INSERT 3 | checkpoint |
|
-> 这里(INSERT 1之后)执行一个checkpoint操作,产生一个 redo point(重做位点),从这里开始到checkpoint写入时一个完整的checkpoint过程
checkpoint整个流程过程如下:
step1:checkpoint 操作首先记录下 checkpoint 的开始位置(INSERT 2之后),记录为 redo point(重做位点);
step2:checkpoint 将 Shared Buffer 中的数据刷到磁盘里面去;
step3:这时候数据库又来了一条 SQL:INSERT 3;
step4:checkpoint 刷脏结束,redo point 之前的数据均已被刷到磁盘存储(数据1和2);
step5:这时候在 WAL 日志里面记录 checkpoint 位点(INSERT 3后),表明 checkpoint 操作结束。checkpoint 位点会记录相关信息,比如 redo point 的值(从哪开始重做);
step6:将最新的 checkpoint 位点记录在 pg_control 文件中。
从上面的流程可以看出,checkpoint 操作已经能保证将 redo point 位点之前的数据落盘了,那 redo point 之前的所有 WAL 日志都已经没有用了(即使下次故障,这部分数据已经被持久化落盘了,也不需要恢复),就可以请理了。不过有些特殊情况,即使WAL日志已经没有用了,也可能导致不被自动清理,例如创建了流复制插槽但未使用/消费。
数据库数据目录下pg_wal的WAL文件在开启归档的模式下,会将已归档WAL文件自动清理。
如果开启了归档,在pg_wal/archive_status目录下会有一些文件,以ready结尾的,表示可以归档但还没有归档,以done结尾的表示已经归档。
WAL文件的自动清理流程如下:
转储WAL段文件到disk,写满或者使用 pg_switch_wal() 后,会生成000000xxxx.ready文件,调用archive_command 命令且成功执行后,将ready文件更名为.done文件。而数据库会在执行checkpoint后计算出最旧的需保留的WAL文件,比该值更早的WAL文件均会被清理。
shared_buffers:
shared_buffers 是缓存。在数据库系统中,我们主要关注磁盘IO,而且其大多是随机IO,因此从磁盘的读取比较慢,为了解决这个问题,postgresql将数据缓存在内存中,牺牲内存来换取随机读取的性能。
shared_buffers 参数用来设置数据库服务器将使用的共享内存缓冲区量。默认通常是 12MB,但是如果你的内核设置不支持(在initdb时决定),那么可以会更少,但不能小于 128kB。
不过为了更好的性能,通常会使用明显高于最小值的设置。 如果指定值时没有单位(MB等),则以块为单位,即BLCKSZ字节,通常为8kB。此参数只能在服务器启动时设置。
如果服务器内存被数据库专用、服务器内存 >= 1GB,合理的shared_buffers初始值是设置为系统内存的25%。shared_buffers并非越大越好,shared_buffers增大,也会造成一些工作负载。超过内存 40% 反而会不好。
shared_buffers更大的设置通常要求对max_wal_size也做相应增加。生产系统可以根据实际业务需求适当调整该参数。
相关文章:
PostgreSQL 常见配置参数
max_wal_size : 两个检查点(checkpoint)之间,WAL可增长的最大大小,即:自动WAL checkpoint允许WAL增长的最大值。该值缺省是1GB。如果提高该参数值会提升性能,但也是会消耗更多空间、同时会延长崩溃恢复所需…...
JAVA 常用类型之String结构
String在java中我们是用来操作字符串的,但它的底层结构确是一个char[]数组,通过数组的方式将每个字符进行保存。 使用时:String str"ABCD",内部存value确是:value[A,B,C,D]; 如下图: 参考String源…...
二三层网络设备封装与解封装原理
1、寻址转发(寻址指的是寻找IP地址) 路由表放在一个公共的地方,比如主控板上,由主控板 的CPU运行路由协议,计算路由,生成和维护路由表。 转发表与路由表: 转发表是根据路由表生成的。路由表中…...
9、MyBatis框架——使用注解开发实现数据库增删改查操作、一级缓存、二级缓存、MyBatis实现分页
目录 一、使用注解开发实现数据库增删改查操作 1、搭建项目 2、使用注解开发操作数据库 二、一级缓存 1、一级缓存失效的情况 三、二级缓存 1、手动开启二级缓存cacheEnabled 2、二级缓存机制 四、MyBatis实现分页 1、配置环境 2、startPage()开启分页 3、PageInfo…...
C++STL剖析(六)—— set和multiset的概念和使用
文章目录🌟 前言🍑 树型结构和哈希结构🍑 键值对1. set的介绍和使用🍑 set的模板参数列表🍑 set的构造🍑 set的使用🍅 insert🍅 find🍅 erase🍅 swap…...
SpringColud第四讲 Nacos的Windows安装方式和Linux的安装方式
在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码: 目录 1.Windows安装Nacos 1.1.下载 1.2.解压 1.3.修改相关配置: 1.4.启动: 1.5.登录: 2.Linux的安装方式Nacos 2.1.…...
微服务项目【网关服务限流熔断降级分布式事务】
网关服务限流熔断降级 第1步:启动sentinel-dashboard控制台和Nacos注册中心服务 第2步:在网关服务中引入sentinel依赖 <!-- sentinel --> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-…...
【情人节用Compose给女神写个爱心动画APP】
情人节用Compose给女神写个爱心动画APP前言涉及知识点实现思路实现过程绘制爱心创建动画效果Preview预览效果完整源码彩蛋前言 前一阵子看电视里的学霸用代码写了个炫酷的爱心,网上有很多js和python的源码,复制粘贴就能拥有,但是Android的好…...
GUI swing和awt
GUI(Graphical User Interface,简称 GUI,图形用户界面)是指采用图形方式显示的计算机操作用户界面,与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受。Java GUI主要有两个核心库&…...
速通Spring
尚硅谷2023最新版Spring6课程_bilibili 1 Spring 【强制】Spring是什么? 1) Spring是一款主流的Java EE轻量级开源框架。 轻量级:体积很小,且不需要依赖于其他组件。 2) 狭义的Spring。 Spring Framework。 3) 广义的Spring。 以Spring F…...
【C++】C++入门
一、 C关键字(C98) C有63个关键字(C语言有32个),如下: asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutabl…...
Linux网络技术学习(五)—— 网络设备初始化(I)
文章目录什么时候进行的设备初始化?设备注册和初始化NIC(网卡 Network Interface Card)初始化的基本目标设备与内核之间的交互硬件中断中断类型传送节流方式为了改善效率中断共享IRQ处理函数映射的组织irqaction结构体存储方式什么时候进行的…...
[技术选型] ClickHouse和StarRocks的介绍
文章目录1.ClickHouse介绍2.StarRocks介绍1.ClickHouse介绍 ClickHouse是面向联机分析处理(OLAP)的开源分析引擎。最初由俄罗斯第一搜索引擎Yandex开发,于2016年开源,开发语言为C。由于其优良的查询性能,PB级的数据规…...
算法刷题打卡第90天:表现良好的最长时间段
表现良好的最长时间段 难度:中等 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」,意味在这…...
Python语言零基础入门教程(十七)
Python 文件I/O 本章只讲述所有基本的 I/O 函数,更多函数请参考Python标准文档。 #### 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式。此函数把你传递的表达式转换成一个字符串表达式,并将结果写…...
C语言中大小端问题
目录 一、什么是大小端 二、 举个例子 三、大小端演示 四、解释"二"中举例的问题 五、怎么判断是大端还是小端 六、一个题目 一、什么是大小端 大端模式(大端字节序存储):就是高位字节数据存放在内存的低地址端ÿ…...
vue2+微前端qiankun从搭建到部署的实践(主子应用切换;集成vue3+vite3子应用)
一、最终效果 二、微前端(qiankun)介绍及为什么选择用微前端,可以看官网 三、目录结构如下 四、具体配置 一、主应用配置 1、主应用技术栈 Vue-cli4搭建项目Vue2Element-Uiqiankun;Vue2Element-Uiqiankun 2、搭建好主项目&…...
怎么代理微信小程序创业?
随着微信的兴起,小程序已经成为了人们生活中不可或缺的一部分。如果你想要创业的话,那么代理微信小程序是一个不错的选择。本文将为大家介绍怎么代理微信小程序创业。 一、什么是微信小程序 微信小程序是一款专为移动设备使用者而设计的应用。它通过扫…...
今天是情人节呐,我利用Python制作了好多表白的东西,快来吧~
今天是情人节那,有没有现在没有对象的宝子,评论里扣个111哈哈 目录 玫瑰 爱心树 丘比特 多彩气球 阿玥的小课堂 一、情人节的由来 二、情人节的来历和意义 玫瑰 局部代码实现如下: # 花瓣1 turtle.left(150) turtle.circle(-90, 70) …...
【Linux】-- 进程信号(处理、内核)
上篇:【Linux】-- 进程信号(认识、应用)_川入的博客-CSDN博客 目录 信号其他相关常见概念 pending handler block 信号处理的过程 sigset_t sigset_t使用 系统接口 sigpending sigprocmask 捕捉方法 sigaction struct sigactio …...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
