【PGCCC】Postgres 故障排除:修复重复的主键行
如何从表中删除不需要的重复行。这些重复行之所以“不需要”,是因为同一个值在指定为主键的列中出现多次。自从 glibc 好心地改变了排序方式后,我们发现这个问题有所增加。当用户升级操作系统并修改底层 glibc 库时,这可能会导致无效索引。
唯一索引损坏的主要影响之一是允许添加本应由主键捕获的行。换句话说,对于一个在名为“id”的列上有主键的表,您可能会观察到如下情况:
-- Can you spot the problem?
SELECT id FROM mytable ORDER BY id LIMIT 5;id
----12334
(5 rows)
在对问题一无所知的情况下,解决问题的第一步是什么?如果你说备份,那你答对了!每当你认为数据库有问题时,或者在尝试修复此类问题之前,都应该进行一次全新备份。
补充一下:我们可以简单地重新索引吗?不行——只要有重复的行,就无法创建(或重新创建)唯一索引。Postgres 会拒绝这样做,因为这违反了我们试图强制执行的唯一性。所以,我们必须从表中删除这些行。
这里有一个修复 Postgres 表中重复主键条目问题的巧妙方法。当然,你需要根据具体情况进行调整,但请慢慢操作,确保理解每个步骤。尤其是在生产环境中发生这种情况时(剧透:这种情况几乎总是在生产环境中发生)。
1. 调试辅助工具
我们要做的第一件事可能看起来有点奇怪:
-- Encourage not using indexes:
set enable_indexscan = 0;
set enable_bitmapscan = 0;
set enable_indexonlyscan = 0;
由于不良索引是此类不良行进入数据库的主要途径,因此我们不能信任它们。这些低级调试辅助工具会告诉 Postgres 规划器优先考虑其他数据获取方式。在我们的例子中,这意味着直接访问表,而不是在索引中查找
2. 进行快速健全性检查
-- Sanity check. This should return a number greater than 1. If not, stop.
set search_path = public;
select count(*) from mytable where id = 3;
在开始之前,我们需要确保拥有正确的表。search_path 是一种安全措施,就像在表上查找一样。由于 id 是表的主键,因此它应该为每个值返回 1 的计数。在我们的例子中,我们知道该表有多个 id 为“3”的条目,因此这主要是为了进行完整性检查,确保我们将要操作的患者是正确的。我们期望返回一个大于“1”的数字。对于有效的主键,返回的值应该只有 0 或 1。
3. 创建备份(始终)
-- Make a backup:
create table mytable_backup as select * from mytable;
在开始之前,我们需要将表中的所有现有行复制到新的备份表中。同样,这不会取代对整个数据库的完整备份(始终是步骤 0),但它是另一个很好的安全功能。
4.制作测试表
-- Test out the process on a subset of the data:
create table test_mytable as select * from mytable where id < 30;
create table test_mytable_duperows_20250317 (like mytable);
最好先在测试表上进行测试。在我们的例子中,使用的是实际表的较小版本。因为我们知道 ID 为 3 的行有问题,所以我们创建了一个包含这些行的新表。我们还创建了一个名为 test_mytable_20250317 的新空表,用于保存被移除的重复行。末尾的日期会告诉以后的查看者该表的创建时间。
5. 在副本会话中启动清理
从现在开始,我们将开始实际的清理工作。我们启动一个事务,然后将 session_replication_role 设置为 replica,这是一个高级(且危险)的命令,它会禁用所有触发器和规则。通常情况下,这不是一个好的做法,但我们还是希望这样做,以防万一存在外键阻止我们删除损坏的行。此外,我们这样做是SET LOCAL为了确保此设置在下次或时SET恢复正常。COMMITROLLBACK
begin;
set local session_replication_role = 'replica';
因为我们刚刚创建了这个测试表,所以我们知道它没有触发器并且没有通过外键链接到任何其他表,但我们希望使这个测试尽可能接近实际的表修改,因此我们保留 session_replication_role 修改。
6. 使用函数清理重复行
begin;
set local session_replication_role = 'replica';
with goodrows as (select min(ctid) from TEST_mytable group by id
)
,mydelete as (delete from TEST_mytablewhere not exists (select 1 from goodrows where min=ctid)returning *
)
insert into TEST_mytable_duperows_20250317 select * from mydelete;
reset session_replication_role;
commit;
因此,我们发出一个 begin 命令,设置 session_replication_role,运行一条 SQL 语句,重置 session_replication_role,最后提交。这条 SQL 语句执行起来比较繁重,所以我们来分解一下。
select min(ctid) from TEST_mytable group by id我们要做的第一件事就是想办法找出哪些行是重复的。由于id列应该是唯一的(所有主键列都是唯一的),我们知道任何出现超过一次的 ID 都需要一个决胜机制。Postgres 中的每一行都有一个名为“ctid”的隐藏列,它代表列元组标识符,本质上是一个指向实际物理行所在位置的指针。因此,它始终是唯一的。如果我们按 id 列分组,我们可以通过查找“最小”的 ctid 为每个唯一 ID 提取一个 ctid(使用 min() 、max() 或其他方法都没关系,只要我们只选择一个就行)。
我们将存储该信息并使用它来帮助删除,因此我们通过WITH命令启动一个 cte,并将其命名为goodrows。
delete from TEST_mytable
where not exists (select 1 from goodrows where min=ctid)
returning *
下一步是删除所有不来自我们刚刚创建的 goodrows 列表的重复行。因此,每个重复行都会有不同的 ctid,我们将删除每个 ctid 对应的所有 ctid,只保留一个。最后***RETURNING ****一步告诉 delete 函数返回所有被删除行的完整信息。
insert into test_mytable_duperows_20250317 select * from mydelete;
最后,我们将删除操作的输出存储到表中。这样,行虽然被删除了,但我们仍然拥有一个完整的被删除行列表,用于调试和取证。
此时,重复的行应该被删除,并放在“duperows”表中。最好检查一下此表和 test_mytable 表,以确保一切按预期工作。
7. 在实时表上运行该函数
准备就绪后,您可以重新运行相同的代码,但将测试表替换为实际表:
create table mytable_duperows_20250317 (like mytable);
begin;
set local session_replication_role = 'replica';
with goodrows as (select min(ctid) from mytable group by id
)
,mydelete as (delete from mytablewhere not exists (select 1 from goodrows where min=ctid)returning *
)
insert into mytable_duperows_20250317 select * from mydelete;
reset session_replication_role;
commit;
8. 重新索引
最后一步,我们要重建那些可疑的索引。即使重复的行已经删除,索引中仍然可能包含错误的信息。该REINDEX命令本质上是删除并重建,因此我们对表中可能存在的所有索引执行此操作:
reindex table mytable;
现在我们还可以使用、和全部设置为将 Postgres 恢复到enable_indexscan正常enable_bitmapscan计划enable_indexonlyscan设置。
以上就是所有步骤!
相关文章:
【PGCCC】Postgres 故障排除:修复重复的主键行
如何从表中删除不需要的重复行。这些重复行之所以“不需要”,是因为同一个值在指定为主键的列中出现多次。自从 glibc 好心地改变了排序方式后,我们发现这个问题有所增加。当用户升级操作系统并修改底层 glibc 库时,这可能会导致无效索引。 唯…...
Java多线程的暗号密码:5分钟掌握wait/notify
wait和join的区别 wait和join在使用上都是等待。 但是join是等待其他线程结束,而wait是等待其他线程的notify通知再运行。 当拿到锁的线程,发现要执行的任务时机不成熟的时候,使用wait进行阻塞等待,然后等时机成熟了再notify通…...
【重学Android】03.高版本 Android Studio 不能使用引用库资源ID的问题
问题背景 由于直接下载的最新版本Android Studio,然后直接创建的新项目,因此默认的工程配置相比以前的老版本有了不少的变化,Gradle的新版本使用,导致一些配置项也发生了变化,加上谷歌针对gradle.properties文件的一些…...
8. kubernetes的service原理
Kubernetes 的 Service 是集群内部和外部访问 Pod 的核心抽象层,解决了 Pod 动态 IP 变化及负载均衡问题。以下是其核心概念、原理及使用方法: 一、Service 的核心概念 概念说明服务发现通过标签选择器(selector)动态关联一组 Po…...
杭电oj(1087、1203、1003)题解
DP 即动态规划(Dynamic Programming),是一种通过把原问题分解为相对简单的子问题,并保存子问题的解来避免重复计算,从而解决复杂问题的算法策略。以下从几个方面简述动态规划: 基本思想 动态规划的核心在…...
解锁安防新境界:XS9933四通道多合一同轴高清解码芯片方案
在安防监控领域,高清、高效、便捷一直是行业追求的目标。今天,我们要为大家介绍一款具有突破性的产品——XS9933四通道多合一同轴高清解码芯片方案,它将为安防监控带来全新的体验。 一、强大性能,高清呈现 XS9933是一款4通道模拟复…...
Mysql之存储过程
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。 目录 1.存储过程概述 2.存储过程的基本语法 2.1创建存储过程 2.2调用存储过…...
2.第二章:政策法规与标准体系
文章目录 2.1 全球数据治理政策概览2.1.1 欧盟GDPR2.1.2 美国数据法规2.1.3 亚太地区数据法规 2.2 国际标准体系2.2.1 ISO/IEC 270012.2.2 NIST框架2.2.3 DAMA DMBOK2.2.4 其他国际标准 2.3 中国数据治理法规体系2.3.1 《网络安全法》2.3.2 《数据安全法》2.3.3 《个人信息保护…...
Kubernetes (k8s) 日常运维命令总结
一、资源查看 查看所有命名空间的 Pod kubectl get pod --all-namespaces查看指定命名空间的 Pod kubectl get pod --namespace <命名空间>查看所有部署(Deployments) kubectl get deployments.apps --all-namespaces查看所有守护进程集࿰…...
NLP高频面试题(五十三)——LLM中激活函数详解
引言 在现代大型语言模型架构中,激活函数是贯穿神经网络各层的关键组件。它们通过为线性变换结果引入非线性,从而赋予模型表达复杂语言模式的能力。选择合适的激活函数,不仅影响训练的稳定性与收敛速度,还在推理阶段决定了计算效率与模型性能。本文将系统梳理常见激活函数…...
跨平台软件开发探讨
一、跨平台开发核心思路 1. 代码复用最大化 通过抽象平台差异实现核心逻辑复用,理想情况下70%代码可复用,仅30%处理平台特性。 2. 分层架构设计 业务逻辑层:完全平台无关(C/Rust) 平台适配层:封装系统AP…...
网络原理————HTTP
1,HTTP简介 我们上一期谈到了网络编程尤其是TCP和UDP,使用网络套接字来实现网络编程,上一期忘记说了,我们使用TCP的时候,我们用了线程池,这样就可以处理很多客户端而不会阻塞,那么如果客户端一…...
安装Jupyter Notebook 之不断报错 差点放弃版
error: subprocess-exited-with-error Preparing metadata (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [6 lines of output] Cargo, the Rust package manager, is not installed or is not on PATH. This package requires Rust and Cargo to com…...
w~大模型~合集13
我自己的原文哦~ https://blog.51cto.com/whaosoft/13864163 #TextRCNN、TextCNN、RNN 小小搬运工周末也要学习一下~~虽然和世界没关 但还是地铁上看书吧, 大老勿怪 今天来说一下 文本分类必备经典模型 模型 SOTA!模型资源站收录情况 模型来源论文 RAE …...
【华为】防火墙双击热备-之-主备模式-单外网线路
FW1和FW2的业务接口都工作在三层,上行连接二层交换机。上行交换机连接运营商的接入点,运营商为企业分配的IP地址为100.100.100.2。现在希望FW1和FW2以主备备份方式工作。正常情况下,流量通过FW1转发;当FW1出现故障时,流…...
学习记录:DAY16
Maven 进阶与前端实战 前言 二轮考核的内容下来了,由整体项目构建转为实现特定模块的功能。对细节的要求更高了,而且有手搓线程池、手搓依赖注入等进阶要求,又有得学力。嘻嘻,太简单了,只要我手搓 Spring Boot 框架……...
基于 Spring Boot 瑞吉外卖系统开发(六)
基于 Spring Boot 瑞吉外卖系统开发(六) 菜品列表 在系统管理端首页,单击左侧菜单栏中的“菜品管理”,会在右侧打开菜品管理页面。 请求URL/dish/page,请求方法GET,请求参数page,pageSize。 该菜品列表…...
香港服务器租用需要哪些性能要求
在如今数字化的时代,租用香港服务器成为了许多企业和个人的选择。但你知道租用香港服务器需要哪些性能要求吗?香港服务器租用需满足硬件性能、网络质量、安全合规、扩展能力四大核心要求,旨在支撑业务高并发、低延迟、稳定安全的运行环境。其…...
LLama Factory从入门到放弃
目录 简介 安装 LLama Factory界面介绍 数据格式要求 微调训练 今天在这里介绍一种常用的大模型微调框架——LLama Factory。 简介 LLama Factory 是一个高效的界面化大语言模型微调工具库,支持多种参数高效微调技术,提供简洁接口和丰富示例&#…...
钧瓷产业原始创新的许昌共识:技术破壁·产业再造·生态重构(一)
大禹智库 第 9期〔总第463期〕2025-4-23 钧瓷产业许昌共识:技术破壁产业再造生态重构(一) ——基于钧瓷产业一体化与数字化原始创新的双轮驱动实践 在当今快速发展的科技领域,创新已成为推动进步的核心动力,企业生存和…...
思科路由器密码绕过+重置
思科路由器密码忘记,重新设置密码不重置配置 1、路由器在初始化过程中会询问是否进行初始化配置,输入no,将直接进入路由器,不会出现用户设置、密码设置等操作。 Would you like to enter the initial configuration dialog? [ye…...
OpenCV 图形API(52)颜色空间转换-----将 NV12 格式的图像数据转换为 RGB 格式的图像
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 NV12 (YUV420p) 色彩空间转换为 RGB。该函数将输入图像从 NV12 色彩空间转换到 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图…...
为什么圆形在GeoJSON中被表示为多边形(Polygon)而不是圆形类型
GeoJSON规范中没有"圆形"类型 GeoJSON是一种用于表示地理空间数据的标准格式,它的规范中只定义了以下几种基本几何类型: Point (点) LineString (线) Polygon (多边形) MultiPoint (多点) MultiLineString (多线) MultiPolygon (多多边形) Ge…...
【解读】Chrome 浏览器实验性功能全景
Chrome 浏览器提供了大量可配置的实验性或功能性设置,主要涉及安全、性能、多媒体、Web API、隐私等多个方面,这些设置可在 Chrome 浏览器的 flags 页面进行调整。 安全相关设置 不安全源设置:可通过#unsafely-treat-insecure-origin-as-sec…...
LInux平均负载
Linux平均负载是**指在一定时间内,系统中处于可运行状态或正在等待资源的进程数的平均值。**它是衡量系统整体工作负载的重要指标,反映了系统的繁忙程度。平均负载通常分为过去1分钟、5分钟和15分钟的平均值。 理解平均负载的关键点 与CPU核心数的关系 *…...
【人工智能】Ollama 负载均衡革命:多用户大模型服务的高效调度与优化
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在 多用户大模型推理 场景下,负载均衡 是确保高并发、低延迟的关键挑战。本文以 Ollama(一个流行的本地大模型运行框架)为例,深入探讨 …...
deepseek-php-client开源程序是强力维护的 PHP API 客户端,允许您与 deepseek API 交互
一、软件介绍 文末提供程序和源码下载学习 deepseek-php-client开源程序是强力维护的 PHP API 客户端,允许您与 deepseek API 交互。 二、Features 特点 无缝 API 集成:DeepSeek 人工智能功能的 PHP 优先接口。流畅构建器模式:可链式调用的…...
ThinkPHP快速使用手册
目录 介绍 安装(windows环境) 安装Composer 安装ThinkPHP 目录结构 配置文件 第一个接口(Controller层) Hello World 自定义Controller 请求参数 获取查询参数(Get请求) 获取指定请求参数 获取…...
文档构建:Sphinx全面使用指南 — 强化篇
文档构建:Sphinx全面使用指南 — 强化篇 Sphinx 是一款强大的文档生成工具,使用 reStructuredText 作为标记语言,通过扩展兼容 Markdown,支持 HTML、PDF、EPUB 等多种输出格式。它具备自动索引、代码高亮、跨语言支持等功能&#…...
Laravel 自定义 Artisan 命令行
1.什么是Artisan 命令行 Artisan 是 Laravel 中自带的命令行接口。Artisan 以 artisan 脚本的方式存在于应用的根目录中,提供了许多有用的命令。 查看所有命令行 php artisan list系统自带我很多的命令,大家可以自己去试一下,例如…...
node.js 实战——(fs模块 知识点学习)
fs 模块 也可以称之为文件系统模块,是node中的内置模块,可以实现与硬盘的交互。比如文件的创建、删除、重命名、移动,还有文件内容的写入、读取,以及文件夹的相关操作 #mermaid-svg-NAByzqTngZUOyQcY {font-family:"trebuch…...
openharmony5.0.0中C++公共基础类测试-线程相关(一)
C公共基础类测试及源码剖析 延续传统,show me the code,除了给出应用示例还重点分析了下openharmony中的实现。 简介 openharmony中提供了C公共基础类库,为标准系统提供了一些常用的C开发工具类,本文分析其实现,并给…...
前缀和相似题共赏
P3131 [USACO16JAN] Subsequences Summing to Sevens S P3131 [USACO16JAN] Subsequences Summing to Sevens S 思路: 一看到区间和我们应该就能马上想到把这个区间拆分成两个前缀相减的形式 式子为:(Pre[r] - Pre[l-1]) % 7 0 Pre[r] % 7 Pre[l-1] % 7 Pre[r] Pre[l-1] 所…...
一文读懂https
http和https的关系 http,应用层协议,由于采用明文传输,不安全,还有很多其他安全问题,为此就衍生出了同为应用层协议的https。https在http的基础上引入了SSL(Secure Socket Layer 安全套接层)和…...
为什么 requests 不是 python 标准库?
为什么 requests 不是 python 标准库? requests开发者Kenneth之前还严肃地征求过这个意见,感兴趣的可以看看 https://github.com/psf/requests/issues/2424 我大致瞅了下,基本都不赞成requests加入python标准库,主要有以下两个原…...
[STM32] 4-1 UART与串口通信
文章目录 前言4-1 UART与串口通信串口简介串口接线 数据帧串口的数据帧格式空闲位起始位数据位校验位(位于数据位内部)奇偶校验 停止位 异步通信和波特率同步通信异步通信波特率 流控的概念串口流控的工作原理 随堂测试问题1:说出Tx、Rx、CTS、RTS、VCC、…...
7-1 三种语言的单词转换
编写程序实现:首先从键盘输入若干个中文与英文单词的偶对,以空行作结束标记;再输入若干个英文与丹麦文单词的偶对,以空行作结束标记。然后输入一个中文单词,输出对应的丹麦文单词;若不存在该单词࿰…...
高防IP是什么
"高防IP"是指"高防护IP",是一种防御DDoS(分布式拒绝服务攻击)的网络安全服务。在分布式拒绝服务攻击中,攻击者会利用许多不同的计算机或者其他设备,通过向目标发送大量的网络请求来尝试使目标服务…...
基于javaweb的SSM宠物商城设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
《TCP/IP详解 卷1:协议》之第六章:ICMP:Internet控制报文协议
目录 一、ICMP协议 二、ICMP 报文格式 三、ICMP询问报文 四、ICMP 差错报告报文 五、ICMP端口不可达差错 一、ICMP协议 ICMP(Internet Control Message Protocol,互联网控制消息协议)是网络层的一个核心协议,用于在IP主机、…...
SpringBoot项目,密码加密之“BCrypt加密”
前言 这种方法,是当前推荐的密码加密方式。(现在不推荐使用MD5加密了)。 如何在springboot项目中,使用bcrypt加密?请分步骤详细介绍一下 一.在Spring Boot项目中使用BCrypt加密的详细步骤 BCrypt是当前推荐用于密码存…...
外贸获客新革命:基于AI的搜索引擎排名攻防战——48小时抢占谷歌TOP3的技术逻辑与实战路径
一、传统SEO的三大死亡陷阱(为什么你的客户正在被AI截流?) 关键词荒漠化 人工筛选关键词效率不足1%,95%的B2B采购商使用长尾词搜索(如"IP68 waterproof LED strip for outdoor projects")而非通…...
0101基础知识-区块链-web3
文章目录 1 web3学习路线2 区块链简史2.1 区块链2.2 公共账本2.3 区块链的设计哲学2.3.1 去中心化2.3.2 共识2.3.2.1 上链2.3.2.2 共识算法 3 web3面向资产的互联网3.1 安全性和去中心化的权衡 4 智能合约4.1 以太坊智能合约4.2 去中心化应用 5 小结结语 1 web3学习路线 参考下…...
SpringMVC从入门到上手-全面讲解SpringMVC的使用.
一、springmvc介绍 MVC全称Model View Controller,是一种设计创建Web应用程序的模式。这三个单词分别代表Web应用程序的三个部分: Model(模型):指数据模型。用于存储数据以及处理用户请求的业务逻辑。在Web应用中&…...
解锁现代生活健康密码,开启养生新方式
在科技飞速发展的当下,我们享受着便捷生活,却也面临诸多健康隐患。想要维持良好状态,不妨从这些细节入手,解锁科学养生之道。 肠道是人体重要的消化器官,也是最大的免疫器官,养护肠道至关重要。日常可多…...
绿色森林人文生活纪实摄影Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色介绍 绿色森林人文生活纪实摄影 Lr 调色,是借助 Lightroom 软件,对以绿色森林为背景,记录人文生活场景的纪实摄影作品进行后期调色处理。通过调整画面的色彩、光影、对比度等参数,让画面融入绿色森林的独特氛围,真…...
【项目篇】仿照RabbitMQ模拟实现消息队列
大家好呀 我是浪前 项目篇:仿照RabbitMQ模拟实现消息队列 今天是项目的第一篇,我们先来创建出最核心的几个类。 仿照RabbitMQ模拟实现消息队列 创建Exchange类MessageQueue类Binding类Message类1:BasicProperties类2:正文部分3&a…...
JAVA程序获取SVN提交记录
1.获取文件提交记录 private String userName "userName "; //svn账号 private String password "password "; //svn密码 private String urlString "urlString "; //svnurl 换成自己对应的svn信息 package com.tengzhi.common.dao;import…...
从检索到生成:RAG 如何重构大模型的知识边界?
目录 一、技术演进图谱说明 二、RAG 技术概述 (一)核心思想说明 (二)RAG 发展路径与研究范式 三、Naive RAG:最基础的检索增强生成范式 (一)Naive RAG 的标准流程 1. 索引(In…...
rabbitmq-spring-boot-start版本优化升级
文章目录 1.前言2.优化升级内容3.依赖4.使用4.1发送消息代码示例4.2消费监听代码示例4.3 brock中的消息 5.RabbmitMq的MessageConverter消息转换器5.1默认行为5.2JDK 序列化的缺点5.3使用 JSON 进行序列化 6.总结 1.前言 由于之前手写了一个好用的rabbitmq-spring-boot-start启…...