PostgreSQL vacuum freeze

devtools/2024/12/22 3:00:59/

一、简介

  数据库使用 32 位事务号,最大容纳 42 亿左右的事务号,事务号是循环使用的。当前事务号过去的 21 亿事务属于过去的事务号,当前事务号往前的 21亿 属于未来的事务号,未来的事务号对当前事务是不可见的。当事务号处于未来事务时,就会导致该事务不可见(事务 ID 回卷),为了预防此类情况发生,数据库事务号在达到阈值时 autovacuum 会自动冻结(freeze)重置事务 ID 为 2(冻结的事务id,比任何普通的事务 ID 都旧),来防止事务 ID 回卷。出于各种原因,数据库无法自动从一个表中清除旧的事务 ID,当数据库的最旧事务 ID 和回卷点之间达到一千一百万个事务时,数据库将开始发出这样的警告消息:

WARNING:  database "mydb" must be vacuumed within 10985967 transactions
HINT:  To avoid a database shutdown, execute a database-wide VACUUM in that database.

  如提示信息所建议,一次手动的 VACUUM 应该会修复该问题;但是注意 VACUUM 必须由一个超级用户来执行,否则它将无法处理系统目录并且不能推进数据库的 datfrozenxid。如果这些警告被忽略,一旦距离回卷点只剩下一百万个事务时,数据库将会关闭并且拒绝开始任何新的事务:

ERROR:  database is not accepting commands to avoid wraparound data loss in database "mydb"
HINT:  Stop the postmaster and vacuum that database in single-user mode.

  这一百万个事务的富余是为了让管理员能通过手动执行所要求的 VACUUM 命令进行恢复而不丢失数据。但一旦数据库进入到安全关闭模式,唯一方法是停止数据库,以单一用户启动数据库来执行 VACUUM。

二、清理年龄操作示例

数据库正常运行时:

--查询所有数据库的年龄,定位年龄超限的数据库
SELECT datname, age(datfrozenxid) FROM pg_database;--对年龄超限的数据库,查询库下所有表的年龄,找到年龄超限的对象
SELECT oid, relname, relfrozenxid, age(relfrozenxid) FROM pg_class where relfrozenxid != 0 order by age(relfrozenxid) desc limit 20; --对年龄超限的对象执行清理操作
VACUUM objectname;
或
VACUUM FREEZE objectname;

VACUUM 为懒惰模式清理对象年龄,只会扫描包含死元组的页面。VACUUM FREEZE 为激进模式清理对象年龄,会扫描所有页面。

数据库进入到安全关闭模式时:

--停止数据库
pg_ctl stop--单用户模式连入对应数据库
postgres --single -D $PGDATA databasename--执行清理操作
VACUUM FREEZE VERBOSE;

三、注意事项

  • 执行 vacuum freeze 操作前,确保有可用的数据库备份。
  • 对数据量大的对象进行 vacuum freeze 操作,会占用大量 IO,数据库在运行间执行此操作,需避开业务时间段。
  • 对数据量大的对象进行 vacuum freeze 操作,据库集簇的 pg_xact 、pg_commit_ts、pg_wal 子目录可能占据更多空间,确保磁盘有可用空间。

http://www.ppmy.cn/devtools/97643.html

相关文章

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(一)---UnrealCV获取深度+分割图像

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程使用的环境: ubuntu 22.04 ros2 humblewindows11 UE5.4.3python8 本系列教程将涉及以…

基于深度学习的环境感知系统

基于深度学习的环境感知系统是一类能够理解、感知和解读周围环境的智能系统。通过使用深度学习算法,这些系统可以分析多模态数据(如图像、音频、激光雷达数据等),实时感知环境的动态变化,为自动驾驶、机器人、智能家居…

Zookeeper详解以及常见的高可用关联组件

一、ZooKeeper 详解 Apache ZooKeeper 是一个开源的分布式协调服务,用于分布式应用程序之间的协调和管理。ZooKeeper 提供了一个高效、可靠的服务来帮助管理分布式系统中的共享配置信息、命名、同步和组服务等。 二、主要特性 1. 高可用性 ZooKeeper 集群通过选…

Spring Boot 打成的 jar 和普通的 jar

Spring Boot 打包的 JAR 文件与普通的 JAR 文件有几个关键区别。Spring Boot 的 JAR 文件是“可执行 JAR 文件”(也称为 fat JAR 或 uber JAR),它包含了应用运行所需的所有依赖、资源以及内嵌的服务器(如 Tomcat 或 Jetty&#xf…

6、JUC并发同步工具类应用与实战

JUC并发同步工具类应用与实战 常用并发同步工具类应用场景ReentrantLockReentrantLock常用APILock接口基本语法工作原理 ReentrantLock使用独占锁:模拟抢票场景公平锁和非公平锁可重入锁Condition详解结合Condition实现生产者消费者模式 ReentrantLock应用场景总结 …

【数据结构】队列

一、介绍 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端…

【STM32 Blue Pill编程】-定时器与中断

定时器与中断 文章目录 定时器与中断1、硬件准备及接线2、GPIO配置3、代码实现STM32F103C8 配有四个定时器,分别为 TIM1、TIM2、TIM3 和 TIM4。 它们充当时钟并用于跟踪基于时间的事件。 我们将展示如何使用 HAL 库在 STM32Cube IDE 中对这些定时器进行编程。 本文将涉及如下内…

C++:模拟实现string

前言&#xff1a; 为了更好的理解string底层的原理&#xff0c;我们将模拟实现string类中常用的函数接口。为了与std里的string进行区分&#xff0c;所以用命名空间来封装一个自己的strin类。 string.h #pragma once #define _CRT_SECURE_NO_WARNINGS 1#include<iostream&…