PostgreSQL vacuum freeze

2024-08-21 05:44
文章标签 postgresql freeze vacuum

本文主要是介绍PostgreSQL vacuum freeze,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、简介

  数据库使用 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 子目录可能占据更多空间,确保磁盘有可用空间。

这篇关于PostgreSQL vacuum freeze的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092289

相关文章

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

PostgreSQL中MVCC 机制的实现

《PostgreSQL中MVCC机制的实现》本文主要介绍了PostgreSQL中MVCC机制的实现,通过多版本数据存储、快照隔离和事务ID管理实现高并发读写,具有一定的参考价值,感兴趣的可以了解一下... 目录一 MVCC 基本原理python1.1 MVCC 核心概念1.2 与传统锁机制对比二 Postg

一文详解PostgreSQL复制参数

《一文详解PostgreSQL复制参数》PostgreSQL作为一款功能强大的开源关系型数据库,其复制功能对于构建高可用性系统至关重要,本文给大家详细介绍了PostgreSQL的复制参数,需要的朋友可... 目录一、复制参数基础概念二、核心复制参数深度解析1. max_wal_seChina编程nders:WAL

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

最详细安装 PostgreSQL方法及常见问题解决

《最详细安装PostgreSQL方法及常见问题解决》:本文主要介绍最详细安装PostgreSQL方法及常见问题解决,介绍了在Windows系统上安装PostgreSQL及Linux系统上安装Po... 目录一、在 Windows 系统上安装 PostgreSQL1. 下载 PostgreSQL 安装包2.

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

Ubuntu 22.04 服务器安装部署(nginx+postgresql)

《Ubuntu22.04服务器安装部署(nginx+postgresql)》Ubuntu22.04LTS是迄今为止最好的Ubuntu版本之一,很多linux的应用服务器都是选择的这个版本... 目录是什么让 Ubuntu 22.04 LTS 变得安全?更新了安全包linux 内核改进一、部署环境二、安装系统

对postgresql日期和时间的比较

《对postgresql日期和时间的比较》文章介绍了在数据库中处理日期和时间类型时的一些注意事项,包括如何将字符串转换为日期或时间类型,以及在比较时自动转换的情况,作者建议在使用数据库时,根据具体情况... 目录PostgreSQL日期和时间比较DB里保存到时分秒,需要和年月日比较db里存储date或者ti

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

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

PostgreSQL如何用psql运行SQL文件

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