PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums
PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums
PostgreSQL 提供了两种重要的数据完整性检查机制:amcheck
扩展和 pg_checksums
工具。它们在功能定位、检查层次和使用场景上有显著区别。
核心对比概览
特性 | amcheck | pg_checksums |
---|---|---|
检查对象 | 逻辑数据结构完整性 | 物理数据文件完整性 |
检查层次 | 索引/表关系层面 | 数据块层面 |
使用方式 | SQL 扩展 | 独立命令行工具 |
运行环境 | 在线检查(生产环境可用) | 离线检查(需停止实例) |
主要用途 | 检测索引损坏、逻辑不一致 | 检测磁盘损坏、页面校验和 |
PostgreSQL版本 | 9.6+(功能随版本增强) | 11+ |
amcheck 深度解析
功能特性
- 索引一致性检查:验证B-tree索引的内部结构
- 父子关系验证:检查分区表父子关系一致性
- 堆表与索引匹配:验证索引条目是否指向有效的堆元组
典型使用场景
-- 基本索引检查
SELECT bt_index_check(index => 'idx_order_date', heapallindexed => true);-- 分区表检查(PG12+)
SELECT bt_index_parent_check('parent_idx') FROM pg_partition_tree('parent_table');
技术实现
- 遍历索引结构:检查每个页面的左右指针一致性
- 交叉验证:索引项与堆表数据的对应关系
- 可配置深度:支持不同程度的检查强度
优势与限制
优势:
- 在线检查不影响业务
- 可定位到具体损坏的索引
- 支持多种索引类型(B-tree为主)
限制:
- 不检测物理存储损坏
- 对大型索引可能消耗较多资源
- 需要超级用户权限执行
pg_checksums 深度解析
功能特性
- 校验和启用/禁用:修改数据页校验和状态
- 完整性检查:扫描所有数据文件验证校验和
- 损坏检测:识别因磁盘故障损坏的数据页
典型使用场景
# 启用集群校验和(需停机)
pg_checksums --enable -D /var/lib/postgresql/12/main# 离线检查数据文件
pg_checksums --check -D /var/lib/postgresql/12/main
技术实现
- 页面校验和计算:每个8KB页面独立的CRC32校验
- 全文件扫描:读取所有数据文件的所有页面
- 原子切换:启用校验和时保证事务安全
优势与限制
优势:
- 检测物理存储损坏
- 预防静默数据损坏
- 可作为定期维护任务
限制:
- 必须停止PostgreSQL实例
- 大型数据库耗时较长
- 启用后带来约2%性能开销
应用场景对比
应使用 amcheck 的情况
- 业务运行期间怀疑索引损坏
- 升级后验证数据逻辑一致性
- 定期预防性维护检查
- 出现"missing chunk number"类错误时
应使用 pg_checksums 的情况
- 服务器异常关机后数据验证
- 存储硬件更换后的完整性检查
- 启用集群校验和功能时
- 出现"invalid page header"类错误时
高级使用技巧
amcheck 进阶用法
-- 并行检查大表(PG14+)
SELECT bt_index_check_parallel(index => 'large_idx',heapallindexed => true,workers => 4
);-- 检查特定范围的索引键
SELECT bt_index_check_range(index => 'date_idx',keyrange => '[2023-01-01,2023-12-31]'
);
pg_checksums 性能优化
# 只检查特定表空间
pg_checksums --check --tablespace-dir=/pg_tbs/ts1 -D $PGDATA# 跳过全扫描快速启用(PG13+)
pg_checksums --enable --no-scan -D $PGDATA
故障处理流程建议
-
疑似逻辑损坏:
- 先用 amcheck 定位问题
- 确认损坏对象后使用 REINDEX
- 必要时从备份恢复特定表
-
疑似物理损坏:
- 停机运行 pg_checksums
- 确认损坏范围后使用 pg_rewind
- 严重情况下从备份恢复整个集群
版本演进差异
版本 | amcheck 增强 | pg_checksums 变化 |
---|---|---|
PG11 | 基础B-tree检查 | 工具引入(原pg_verify_checksums) |
PG12 | 添加分区表检查 | 支持校验和启用/禁用 |
PG13 | 支持堆表与索引交叉验证 | 添加–no-scan选项 |
PG14 | 并行检查功能 | 性能优化 |
PG15 | 增强错误报告细节 | 支持进度显示 |
最佳实践建议
-
预防性维护计划:
- 每月使用 amcheck 检查关键表索引
- 季度性使用 pg_checksums 全面检查
- 启用集群校验和(如有条件)
-
监控集成:
-- 创建定期检查作业 CREATE EXTENSION IF NOT EXISTS amcheck; CREATE EXTENSION IF NOT EXISTS pg_cron;CREATE OR REPLACE FUNCTION check_critical_indexes() RETURNS void AS $$ BEGINPERFORM bt_index_check('orders_pkey');PERFORM bt_index_check('orders_customer_idx'); EXCEPTION WHEN OTHERS THENRAISE EXCEPTION '索引检查失败: %', SQLERRM; END; $$ LANGUAGE plpgsql;SELECT cron.schedule('0 3 * * 6', 'SELECT check_critical_indexes()');
-
恢复策略:
- 保持有效的备份策略
- 记录关键对象的OID(用于紧急恢复)
- 考虑使用pg_probackup等工具进行块级增量备份
这两种工具在PostgreSQL数据完整性保障体系中扮演互补角色,合理配合使用可以构建多层次的数据保护机制。
相关文章:
PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums
PostgreSQL 数据完整性检查工具对比:amcheck 与 pg_checksums PostgreSQL 提供了两种重要的数据完整性检查机制:amcheck 扩展和 pg_checksums 工具。它们在功能定位、检查层次和使用场景上有显著区别。 核心对比概览 特性amcheckpg_checksums检查对象…...

Vert.x学习笔记-什么是Handler
Vert.x学习笔记 在Vert.x中,Handler是一个核心概念,用于处理异步事件和回调。它是Vert.x响应式编程模型的核心组件之一,通过函数式接口的方式简化了异步编程的复杂性。 1. Handler的定义 Handler是一个函数式接口,定义如下&#…...
浏览器游戏的次世代革命:WebAssembly 3.0 实战指南
破局开篇:开发者必须跨越的性能鸿沟 在2025年,WebAssembly(WASM)技术已经成为高性能Web应用的核心驱动力。特别是WASM3引擎的广泛应用,使得在浏览器中实现主机级游戏画质成为可能。本文将深入探讨WASM3的关键特性、性…...
Java设计模式之工厂模式与策略模式简单案例学习
目录 1.前言2.工厂模式2.1 简单工厂方法2.2 静态工厂方法2.3 抽象工厂方法 3.策略模式4.区别与联系4.1定义与核心意图4.2 UML 结构对比4.3 关键组成对比4.4 应用场景对比 1.前言 最近接手的项目真的是太无语了,经历了多数人的编写,什么牛马鬼神写法都有&…...

【Echarts】象形图
目录 效果代码 效果 代码 <!-- 业务类型 --> <template><div class"ywlx" :style"{ --height: height }"><div class"header_count count_linear_bg"><div>当月业务总量<span class"common_count text_s…...
git 本地合并怎么撤回
在Git中,如果你已经执行了合并(merge)操作,但发现合并的结果不符合预期,你可以通过以下几种方式来撤销这次合并: 1. 使用git merge --abort 如果你在合并过程中还没有完成合并的提交(即合并冲…...

集星云推短视频矩阵系统的定制化与私有化部署方案
在当今数字化营销时代,短视频矩阵系统成为众多企业和机构拓展影响力、实现精准营销的关键工具。集星云推短视频矩阵系统凭借其强大的功能和灵活的定制性,为企业提供了全方位的解决方案。 一、API接口定制:无缝对接自有系统 集星云推短视频矩…...
npm run build 报错:Some chunks are larger than 500 KB after minification
当我们的 Vue 项目太大,使用 npm run build 打包项目的时候,就有可能会遇到以下报错: (!) Some chunks are larger than 500 kB after minification. Consider: - Using dynamic import() to code-split the application - Use build.rollup…...

XCTF-web-file_include
解析 <?php highlight_file(__FILE__); // 高亮显示当前PHP文件源代码 include("./check.php"); // 包含检查文件(可能包含安全过滤逻辑)if(isset($_GET[filename])) { // 检查是否传入filename参数$filename $_GET[f…...

5.28 后端面经
为什么golang在并发环境下更有优势 Go语言(Golang)在并发环境下的优势主要源自其设计哲学和内置的并发机制,这些机制在语言层面提供了高效、简洁且安全的并发编程工具。以下是其核心优势的详细分析: 1. Goroutine:轻量…...

CPP中CAS std::chrono 信号量与Any类的手动实现
前言 CAS(Compare and Swap) 是一种用于多线程同步的原子指令。它通过比较和交换操作来确保数据的一致性和线程安全性。CAS操作涉及三个操作数:内存位置V、预期值E和新值U。当且仅当内存位置V的值与预期值E相等时,CAS才会将内存位…...

PHP生成pdf方法
1:第一种方法: 主要使用PHP的扩展 【 “spatie/browsershot”: “3.57”】 使用这个扩展生成PDF需要环境安装以下依赖 1.1:NPM【版本:9.2.0】 1.2:NODE【版本:v18.19.1】 1.3:puppeteer【npm in…...

【Android笔记】记一次 CMake 构建 Filament Android 库的完整排错过程(安卓交叉编译、CMake、Ninja)
写在前面的话,为了保持Sceneform-EQR始终是采用最新的filament,每隔一段时间我都会编译filament,并根据新增内容完善Sceneform-EQR。 现由于更换电脑,环境需重新配置。简单记录下编译出错和解决方式。 Sceneform-EQR 是EQ对谷歌“…...

C#中的BeginInvoke和EndInvoke:异步编程的双剑客
文章目录 引言1. BeginInvoke和EndInvoke的基本概念1.1 什么是BeginInvoke和EndInvoke1.2 重要概念解释 2. 委托中的BeginInvoke和EndInvoke2.1 BeginInvoke方法2.2 EndInvoke方法2.3 两者的关系 3. 使用方式与模式3.1 等待模式3.2 轮询模式3.3 等待句柄模式3.4 回调模式 4. 底…...

告别延迟!modbus tcp转profine网关助力改造电厂改造升级
发电需求从未如此旺盛。无论您是为客户发电还是为自身运营发电,您都需要提高运营效率,并在资产老化、资源萎缩的情况下,紧跟不断变化的法规。如今,智能系统和技术能够帮助您实现运营转型,提高可视性并实现关键流程自动…...

《软件工程》第 5 章 - 需求分析模型的表示
目录 5.1需求分析与验证 5.1.1 顺序图 5.1.2 通信图 5.1.3 状态图 5.1.4 扩充机制 5.2 需求分析的过程模型 5.3 需求优先级分析 5.3.1 确定需求项优先级 5.3.2 排定用例分析的优先顺序 5.4 用例分析 5.4.1 精化领域概念模型 5.4.2 设置分析类 5.4.3 构思分析类之间…...
解释k8s种ConfigMap和Secret的作用,如何在Pod中挂载环境变
一、ConfigMap & Secret 核心定位 属于Kubernetes的配置管理特性,用于解耦应用与配置 1. ConfigMap 作用:存储非敏感配置数据 存储内容: 环境变量命令行参数配置文件(如JSON/XML/YAML)系统参数(如J…...

阿里云国际版香港轻量云服务器:CN2 GIA加持,征服海外网络的“速度与激情”!
阿里云国际版香港轻量云服务器:CN2 GIA加持,征服海外网络的“速度与激情”! 面对全球化业务拓展对网络连接的严苛要求,阿里云国际版香港轻量云服务器正成为出海企业和开发者的新宠。其核心优势在于搭载了CN2 GIA(Glob…...

Qt6无法识别OpenCV(Windows端开发)
这段时间在Windows 10上进行Qt6的开发。结果在build过程中,出现了如下错误: 但实际上,我明明安装了OpenCV4.10.0, 并且也在CMakeLists.txt中加入了相关内容。 但是,注意自己的编译输出: [1/5 1.4/sec] Automatic MOC and UIC for target R…...

二、网络安全常见编码及算法-(2)
该文章主要介绍古典密码和隐写常用的密码和编码,日常中很少见,主要用于ctf比赛和考试学习一、古典密码 1、古典密码概念概述 古典密码是密码学发展早期所使用的一系列加密技术,这些密码主要依靠手工操作或简单的机械装置来实现信息的加密和…...

Windows系统安装MySQL Connector 使用C++ VS2022连接MySQL
1. 官网及版本 1.1. 网址 官方文档 - 安装编译构建: https://dev.mysql.com/doc/connector-cpp/9.3/en/ 官方文档 - 使用案例: https://dev.mysql.com/doc/dev/connector-cpp/latest/ 下载地址: https://dev.mysql.com/downloads/connector/…...

D2000平台上Centos使用mmap函数遇到的陷阱
----------原创不易,欢迎点赞收藏。广交嵌入式开发的朋友,讨论技术和产品------------- 在飞腾D2000平台上,安装了麒麟linux系统,我写了个GPIO点灯的程序,在应用层利用mmap函数将内核空间映射到用户态,然后…...

Elasticsearch索引机制与Lucene段合并策略深度解析
引言 在现代分布式搜索引擎Elasticsearch中,文档的索引、更新和删除操作不仅是用户交互的核心入口,更是底层存储架构设计的关键挑战。本文围绕以下核心链路展开: 文档生命周期管理:从客户端请求路由到分片定位,从内存…...
BPE、WordPiece 与 Unigram:三种主流子词分词算法对比
BPE、WordPiece 与 Unigram:三种主流子词分词算法对比 在构建现代自然语言处理模型时,Tokenizer 是连接文本与模型之间的桥梁。而在 tokenizer 的设计中,BPE(Byte Pair Encoding)、WordPiece 和 Unigram 三种子词&…...
青少年编程与数学 02-020 C#程序设计基础 11课题、可视化编程
青少年编程与数学 02-020 C#程序设计基础 11课题、可视化编程 一、可视化编程1. 降低学习门槛2. 提高学习兴趣3. 便于学习和掌握4. 为后续学习打下基础5. 适合不同年龄段和背景的初学者6. 适合初学者的可视化编程工具 二、可视化编程适合初学者1. 降低学习门槛2. 提高学习兴趣3…...
AI时代新词-AI驱动的自动化(AI - Driven Automation)
一、什么是AI驱动的自动化? AI驱动的自动化(AI - Driven Automation)是指利用人工智能技术实现各种流程和任务的自动化。这种自动化不仅包括简单的重复性任务,还涵盖了复杂的决策和优化任务。AI驱动的自动化通过机器学习、深度学…...

整合Jdk17+Spring Boot3.2+Elasticsearch9.0+mybatis3.5.12的简单用法
Elasticsearch是一个基于Lucene的分布式搜索和分析引擎,广泛应用于全文搜索、日志分析等场景。结合Spring Boot可以快速构建强大的搜索应用。本文将介绍如何在Spring Boot项目中集成和使用Elasticsearch。 ES9.0.1目前支持的包只有 elasticsearch-rest-client/ …...
Starrocks 物化视图的实现以及在刷新期间能否读数据
背景 本司在用Starrocks做一些业务上的分析的时候,用到了物化视图,并且在高QPS的情况下,RT也没有很大的波动,所以在此研究一下Starrock的实现,以及在刷新的时候是不是原子性的 本文基于Starrocks 3.3.5 结论 Starro…...
前后端传输 Long 类型数据时(时间戳,雪花算法ID),精度丢失的根本原因
前后端传输 Long 类型数据时,精度丢失的根本原因是 JavaScript 的 Number 类型无法精确表示超过 53 位(64 位双精度浮点数)的整数,而 Java 的 Long 类型是 64 位整数。当后端返回的 Long 值超过 2^53-1(即 90071992547…...
探索容器技术:Docker与Kubernetes的实践指南
随着云计算和微服务架构的兴起,容器技术已经成为软件开发和部署的新标准。容器技术以其轻量级、可移植性和灵活性等特点,为应用程序的快速部署、扩展和管理提供了强大的支持。在众多容器技术中,Docker和Kubernetes无疑是最受欢迎的两种。本文…...