跳转到主要内容

PostgreSQL 大法师

冯若航 @Vonng / Pigsty

PostgreSQL 生态进展,以及开发、使用、运维、管理、诊断、调优的经验分享。

PostgreSQL 大法师
是 Oracle 的失误让 PostgreSQL 赢了吗?PostgreSQLOracle技术评论
井喷:修了 28 个 CVE、110 个 BUG,PG 最新小版本发布PostgreSQLPG管理安全翻译
龙芯,正式进入 PostgreSQL 官方仓库PostgreSQLPG生态硬件
PostgreSQL 三十岁生日快乐PostgreSQLPG生态开源
瞬间克隆 PostgreSQL 数据库,无需黑魔法PostgreSQLPigsty工具
什么是 PostgreSQL 发行版?PostgreSQLPigsty
PostgreSQL,三十而立PostgreSQLPG生态
参加 PostgreSQL 30周年开发者大会PostgreSQLPG生态随笔
人人可用的 PG 扩展PostgreSQLPG生态扩展
PGConf.Dev 2026 今天在温哥华开幕PostgreSQLPG生态
PostgreSQL 18.4、17.10、16.14、15.18 与 14.23 发布PostgreSQLPG管理
pgBackRest 续命战与开源世界的逼定价PostgreSQLPG生态开源
顶级开源备份工具 pgBackRest 停止维护PostgreSQLPG生态开源
504 个扩展,PG 生态的天花板在哪?PostgreSQLPG生态扩展
PostgreSQL vs MySQL 2026PostgreSQLMySQLPG生态
PG 五大版本中文文档已就绪,欢迎查阅!PostgreSQL文档翻译
PostgreSQL 官网中文版:pg.centerPostgreSQL文档PG生态
PG 扩展百科全书:中英双语,开箱即用PostgreSQLPigstyPG生态扩展
464个扩展开箱即用:新版 PG 扩展目录发布PostgreSQL扩展文档
一天翻译完 PG 生态三大件文档PostgreSQL文档翻译
PostgreSQL 号外紧急补丁版本发布!PostgreSQLPG管理安全
Oracle 兼容的 PG 真的有用吗?PostgreSQLOracle国产数据库
号外:暂缓 PG 最新小版本安装与升级PostgreSQLPG管理
中国厂商首次站上 PGConf.dev 主题演讲台PostgreSQLPG生态
从AGPL到Apache:Pigsty 协议变更的思考Pigsty开源
OpenAI:一套 PG 支持8亿 ChatGPT 用户PostgreSQLCodex
PostgreSQL 高可用到底怎么做?PostgreSQLPG管理
如何快速上手学习 PostgreSQL?PostgreSQL文档
Git for Data: 瞬间克隆PG数据库PostgreSQLPG开发GIS
为什么PG将主宰AI时代的数据库PostgreSQLAI数据库
立足中国,面向全球的 PostgreSQL 发行版PostgreSQLPigsty
PostgreSQL 18 可以上生产用了吗?PostgreSQLPG管理扩展
PG扩展云:解锁 PG 生态的全部潜力PostgreSQL扩展
尝鲜须谨慎:PG新存储引擎故障案例PostgreSQL扩展故障复盘
月饼好吃:又一家PG扩展公司被Databricks收购PostgreSQL扩展商业
聚焦六大功能:PostgreSQL 18 新特性深度解析PostgreSQLPG开发性能
从PG“断供”看软件供应链中的信任问题PostgreSQLPG管理
新坑:PostgreSQL 36计PostgreSQL文档PG管理
专栏:Postgres 大法师PostgreSQL
PostgreSQL主宰数据库世界,而谁来吞噬PG?PostgreSQLPG生态
PostgreSQL 已主宰数据库世界PostgreSQLPG生态
卡脖子:PGDG切断镜像站同步通道PostgreSQLPG管理
PostgreSQL高峰论坛:参会小记PostgreSQLPG生态随笔
再见MySQL,你好PGMySQLPostgreSQL数据库
PostgreSQL + 组播,有希望成为下一个被收购的 neon 吗?PostgreSQLCodex成本
PGCon.dev闪电演讲,硬控PG大佬5分钟PostgreSQLPG生态随笔
PG生态赢得资本市场青睐:Databricks收购Neon,Supabase融资两亿美元,微软财报点名PGPostgreSQLPG生态商业
兼容Oracle的开源 PostgreSQL?PostgreSQLOracle迁移
PG被黑慢MySQL 360倍,这次我真忍不了PostgreSQLMySQL性能
Postgres Extension Day,咱们不见不散PostgreSQL扩展
OrioleDB来了!4x性能,消除顽疾,存算分离PostgreSQL
OpenHalo:MySQL线缆兼容的PostgreSQL来了!PostgreSQLMySQL
PGFS:将数据库作为文件系统PostgreSQL对象存储
PostgreSQL取得对MySQL的压倒性优势PostgreSQLMySQL技术评论
什么?PG小版本发布又翻车了?PostgreSQLPG管理安全
PostgreSQL 生态前沿进展PostgreSQLPG生态
PII数据安全合规与PG Anonymizer最佳实践PostgreSQL安全扩展
第七届PG生态大会:一些感想PostgreSQLPG生态随笔
中译版《PostgreSQL 14 Internals》上线PostgreSQLPG内核文档
小猪骑大象:PG内核与扩展包管理神器PostgreSQL工具
PostgreSQL 2024 社区现状调查报告PostgreSQLPG生态
PostgreSQL 号外小版本发布:17.2, 16.6, 15.10, 14.15, 13.18, 12.22PostgreSQLPG管理
不要更新!发布当日叫停:PG也躲不过大翻车PostgreSQL
PostgreSQL 12 过保,PG 17 上位PostgreSQL
PostgreSQL神功大成!最全扩展仓库来了!PostgreSQLPG生态扩展
PostgreSQL 规约(2024版)PostgreSQLPG开发
PG系创业公司Supabase:$80M C轮融资PostgreSQLPG生态商业
PostgreSQL 17 发布:摊牌了,我不装了!PostgreSQL
PostgreSQL可以替代微软SQL Server吗?PostgreSQLMySQLPG生态
谁整合好DuckDB,谁赢得OLAP世界PostgreSQLPG生态
PostgreSQL小版本更新,17beta3,12将EOLPostgreSQLPG管理
ClickHouse收购PeerDB:这浓眉大眼的也要来搞 PG 了?PostgreSQLOLAP商业
StackOverflow 2024调研:PostgreSQL已经杀疯了PostgreSQLPG生态
duckdb_fdw v1.0.0来了,第13届 PostgreSQL 中国技术大会见OLAPPostgreSQLPG生态
用PG的开发者,年薪比MySQL多赚四成?PostgreSQLMySQL职业
使用Pigsty自建Dify:AI工作流平台PostgreSQLPigsty容器化
让PG停摆一周的大会:PGCon.Dev 2024 参会记PostgreSQLPG生态
PostgreSQL 17 beta1 发布!PostgreSQL
为什么PostgreSQL是未来数据库的事实标准?PostgreSQLPG生态翻译
灿灿荐书:《收获,不止 SQL 优化》PostgreSQLOraclePG开发
PostgreSQL 主要贡献者 Simon Riggs 因坠机去世PostgreSQLPG生态
PostgreSQL会修改开源许可证吗?PostgreSQLPG生态开源翻译
PostgreSQL 正在吞噬数据库世界PostgreSQLPG生态扩展
技术极简主义:一切皆用PostgresPostgreSQLPG生态翻译
PG生态新玩家:ParadeDBPostgreSQLPG生态扩展
快速掌握PostgreSQL版本新特性PostgreSQL文档
令人惊叹的PostgreSQL可伸缩性PostgreSQL性能翻译
中国对PostgreSQL的贡献约等于零吗?PostgreSQLPG生态开源
展望 PostgreSQL 的2024PostgreSQLPG生态翻译
PostgreSQL荣获2024年度数据库之王!(第五次)PostgreSQLPG生态
2023年度数据库:PostgreSQL (DB-Engine)PostgreSQLPG生态
PostgreSQL 宏观查询优化之 pg_stat_statementsPostgreSQLPG管理性能
FerretDB:假扮成MongoDB的PGPostgreSQLMongoDBPG生态扩展
如何用 pg_filedump 抢救数据?PostgreSQLPG管理故障复盘
PG先写脏页还是先写WAL?PostgreSQLPG内核
如何看待 MySQL vs PGSQL 直播闹剧PostgreSQLMySQL技术评论
驳《MySQL:这个星球最成功的数据库》PostgreSQLMySQL技术评论
MySQL:这个星球最成功的数据库MySQLPostgreSQL数据库
向量是新的 JSONPostgreSQL向量扩展翻译
PostgreSQL:最成功的数据库PostgreSQLPG生态
AI大模型与向量库 PGVectorPostgreSQLPG开发扩展向量
PostgreSQL 到底有多强?PostgreSQLPG生态性能
为什么PostgreSQL是最成功的数据库?PostgreSQLPG生态
开箱即用的PG发行版:PigstyPostgreSQLPigstyRDS
开源PG全家桶上手指南PostgreSQLPG管理
为什么PostgreSQL前途无量?PostgreSQLPG生态
高可用PgSQL集群架构设计与落地PostgreSQL架构PG管理
高级模糊查询的实现PostgreSQLPG开发
PG中的本地化排序规则PostgreSQLPG管理
PostgreSQL 逻辑复制详解PostgreSQLPG管理
PG复制标识详解(Replica Identity)PostgreSQLPG管理PG开发
PG慢查询诊断方法论PostgreSQLPG管理性能
故障档案:时间回溯导致的Patroni故障PostgreSQLPG管理故障复盘
在线修改主键列类型PostgreSQLPG管理
黄金监控指标:错误延迟吞吐饱和PostgreSQLPG管理监控
数据库集群管理概念与实体命名规范PostgreSQLPG管理架构
PostgreSQL的KPIPostgreSQLPG管理监控
在线修改PG字段类型PostgreSQLPG管理迁移
事务隔离等级注意事项PostgreSQLPG开发
前后端通信线缆协议PostgreSQLPG开发PG内核
故障档案:PG安装Extension导致无法连接PostgreSQLPG管理扩展故障复盘
CDC 变更数据捕获机理PostgreSQLPG开发
PostgreSQL中的锁PostgreSQLPG开发PG管理
GIN搜索的O(n²)复杂度PostgreSQLPG开发
PostgreSQL 常见复制拓扑方案PostgreSQLPG管理架构
温备:使用pg_receivewalPostgreSQLPG管理备份
PostgreSQL监控系统概览PostgreSQL监控PG管理
故障档案:pg_dump导致的连接池污染PostgreSQLPG管理故障复盘
PostgreSQL数据页面损坏修复PostgreSQLPG管理故障复盘
关系膨胀的监控与治理PostgreSQLPG管理
TimescaleDB 快速上手PostgreSQLPG管理扩展
PipelineDB快速上手PostgreSQLPG管理扩展
故障档案:序列号消耗过快导致整型溢出PostgreSQLPG管理故障复盘
故障档案:PostgreSQL事务号回卷PostgreSQLPG管理故障复盘
PostgreSQL的触发器使用注意事项PostgreSQLPG开发
GeoIP 地理逆查询优化PostgreSQLPG开发扩展GIS
PostgreSQL开发规约(2018版)PostgreSQLPG开发软件工程
PostgreSQL好处都有啥PostgreSQLPG生态
PostGIS高效解决行政区划归属查询PostgreSQLPG开发GIS
KNN极致优化:从RDS到PostGISPostgreSQLPG开发机器学习GIS
监控PG中的表大小PostgreSQLPG管理监控
PgAdmin安装配置PostgreSQLPG管理工具
故障档案:快慢不匀雪崩PostgreSQLPG管理故障复盘
Bash与psql小技巧PostgreSQLPG管理工具
用 Exclude 实现互斥约束PostgreSQLPG开发
函数易变性等级分类PostgreSQLPG开发
Distinct On 去除重复数据PostgreSQLPG开发
PostgreSQL例行维护PostgreSQLPG管理
备份恢复手段概览PostgreSQLPG管理备份
Pgbouncer快速上手PostgreSQLPG管理
PgBackRest2中文文档PostgreSQLPG管理备份
使用sysbench测试PostgreSQL性能PostgreSQLPG管理性能
使用FIO测试磁盘性能PostgreSQLPG管理性能
空中换引擎:PostgreSQL不停机迁移数据PostgreSQLPG管理迁移
PG服务器日志常规配置PostgreSQLPG管理监控
找出没用过的索引PostgreSQLPG管理
批量配置SSH免密登录PostgreSQLPG管理
Wireshark抓包分析协议PostgreSQLPG管理工具
file_fdw妙用无穷——从数据库读取系统信息PostgreSQLPG管理扩展
源码编译安装 PostGISPostgreSQLPG管理扩展
Linux 常用统计 CLI 工具PostgreSQLPG管理工具
Go数据库教程:database/sqlPostgreSQL软件工程
GO与PG实现缓存同步PostgreSQLPG开发
用触发器审计数据变化PostgreSQLPG开发
SQL实现ItemCF推荐系统PostgreSQLPG开发机器学习
UUID性质原理与应用PostgreSQLPG开发架构
PostgreSQL MongoFDW安装部署PostgreSQLPG管理扩展

PostgreSQL好处都有啥

冯若航 4934 字 10 分钟

PostgreSQL的Slogan是"世界上最先进的开源关系型数据库",要我说最能生动体现PG特色的口号应该是:一专多长的全栈数据库,一招鲜吃遍天。

  • 故障档案:PG安装Extension导致无法连接

    冯若航 发布于 PGSQL 858 字 2 分钟

    冯若航PostgreSQLPG管理扩展故障复盘

    Featured Image for 故障档案:PG安装Extension导致无法连接

    今天遇到一个比较有趣的Case,客户报告说数据库连不上了。报这个错: psql: FATAL: could not load library "/export/servers/pgsql/lib/pg_hint_plan.so": /export/servers/pgsql/lib/pg_hint_plan.so: undefined symbol: RINFO_IS_PUSHED_DOWN 当然,这种错误一眼就知道是插件没编译好,报符号找不到。因此数据库后端进程在启动时尝试加载 …

    今天遇到一个比较有趣的Case,客户报告说数据库连不上了。报这个错: psql: FATAL: could not load library "/export/servers/pgsql/lib/pg_hint_plan.so": /export/servers/pgsql/lib/pg_hint_plan.so: undefined symbol: RINFO_IS_PUSHED_DOWN 当然,这种错误一眼就知道是插件没编译好,报符号找不到。因此数据库后端进程在启动时尝试加载 …

  • CDC 变更数据捕获机理

    冯若航 发布于 PGSQL 9309 字 19 分钟

    冯若航PostgreSQLPG开发

    Featured Image for CDC 变更数据捕获机理

    在实际生产中,我们经常需要把数据库的状态同步到其他地方去,例如同步到数据仓库进行分析,同步到消息队列供下游消费,同步到缓存以加速查询。总的来说,搬运状态有两大类方法:ETL与CDC。 前驱知识 CDC与ETL 数据库在本质上是一个 状态集合,任何对数据库的 变更(增删改)本质上都是对状态的修改。 在实际生产中,我们经常需要把数据库的状态同步到其他地方去,例如同步到数据仓库进行分析,同步到消息队列供下游消费,同步到缓存以加速查询。总的来说,搬运状态有两大类方法:ETL与CDC。 …

    在实际生产中,我们经常需要把数据库的状态同步到其他地方去,例如同步到数据仓库进行分析,同步到消息队列供下游消费,同步到缓存以加速查询。总的来说,搬运状态有两大类方法:ETL与CDC。 前驱知识 CDC与ETL 数据库在本质上是一个 状态集合,任何对数据库的 变更(增删改)本质上都是对状态的修改。 在实际生产中,我们经常需要把数据库的状态同步到其他地方去,例如同步到数据仓库进行分析,同步到消息队列供下游消费,同步到缓存以加速查询。总的来说,搬运状态有两大类方法:ETL与CDC。 …

  • PostgreSQL中的锁

    冯若航 发布于 PGSQL 6662 字 14 分钟

    冯若航PostgreSQLPG开发PG管理

    Featured Image for PostgreSQL中的锁

    PostgreSQL的并发控制以 快照隔离(SI) 为主,以 两阶段锁定(2PL) 机制为辅。PostgreSQL对DML(SELECT, UPDATE, INSERT, DELETE 等命令)使用SSI,对DDL(CREATE TABLE 等命令)使用2PL。 PostgreSQL有好几类锁,其中最主要的是 表级锁 与 行级锁,此外还有页级锁,咨询锁等,表级锁 通常是各种命令执行时自动获取的,或者通过事务中的 LOCK 语句显式获取;而行级锁则是由 SELECT FOR …

    PostgreSQL的并发控制以 快照隔离(SI) 为主,以 两阶段锁定(2PL) 机制为辅。PostgreSQL对DML(SELECT, UPDATE, INSERT, DELETE 等命令)使用SSI,对DDL(CREATE TABLE 等命令)使用2PL。 PostgreSQL有好几类锁,其中最主要的是 表级锁 与 行级锁,此外还有页级锁,咨询锁等,表级锁 通常是各种命令执行时自动获取的,或者通过事务中的 LOCK 语句显式获取;而行级锁则是由 SELECT FOR …

  • GIN搜索的O(n²)复杂度

    冯若航 发布于 PGSQL 709 字 2 分钟

    冯若航PostgreSQLPG开发

    Featured Image for GIN搜索的O(n²)复杂度

    GIN索引如果使用很长的关键词列表进行搜索,会导致性能显著下降。本文解释了为什么GIN索引关键词搜索的时间复杂度为O(n^2) Here is the detail of why that query have O(N^2) inside GIN implementation. Details Inspect the index example_keys_idx postgres=# select oid,* from pg_class where relname = …

    GIN索引如果使用很长的关键词列表进行搜索,会导致性能显著下降。本文解释了为什么GIN索引关键词搜索的时间复杂度为O(n^2) Here is the detail of why that query have O(N^2) inside GIN implementation. Details Inspect the index example_keys_idx postgres=# select oid,* from pg_class where relname = …

  • PostgreSQL 常见复制拓扑方案

    冯若航 发布于 PGSQL 1150 字 3 分钟

    冯若航PostgreSQLPG管理架构

    Featured Image for PostgreSQL 常见复制拓扑方案

    复制是系统架构中的核心问题之一。 集群拓扑 假设我们使用4单元的标准配置:主库,同步从库,延迟备库,远程备库,分别用字母M,S,O,R标识。 M:Master, Main, Primary, Leader, 主库,权威数据源。 S: Slave, Secondary, Standby, Sync Replica,同步副本,需要直接挂载至主库 R: Remote Replica, Report instance,远程副本,可以挂载到主库或同步从库上 O: Offline,离线延迟备库,可以挂载到主 …

    复制是系统架构中的核心问题之一。 集群拓扑 假设我们使用4单元的标准配置:主库,同步从库,延迟备库,远程备库,分别用字母M,S,O,R标识。 M:Master, Main, Primary, Leader, 主库,权威数据源。 S: Slave, Secondary, Standby, Sync Replica,同步副本,需要直接挂载至主库 R: Remote Replica, Report instance,远程副本,可以挂载到主库或同步从库上 O: Offline,离线延迟备库,可以挂载到主 …

  • 温备:使用pg_receivewal

    冯若航 发布于 PGSQL 1571 字 4 分钟

    冯若航PostgreSQLPG管理备份

    Featured Image for 温备:使用pg_receivewal

    备份是DBA的安身立命之本,也是数据库管理中最为关键的工作之一。有各种各样的备份,但今天这里讨论的备份都是物理备份。物理备份通常可以分为以下四种: 热备(Hot Standby):与主库一模一样,当主库出现故障时会接管主库的工作,同时也会用于承接线上只读流量。 温备(Warm Standby):与热备类似,但不承载线上流量。通常数据库集群需要一个延迟备库,以便出现错误(例如误删数据)时能及时恢复。在这种情况下,因为延迟备库与主库内容不一致,因此不能服务线上查询。 冷备(Code Backup): …

    备份是DBA的安身立命之本,也是数据库管理中最为关键的工作之一。有各种各样的备份,但今天这里讨论的备份都是物理备份。物理备份通常可以分为以下四种: 热备(Hot Standby):与主库一模一样,当主库出现故障时会接管主库的工作,同时也会用于承接线上只读流量。 温备(Warm Standby):与热备类似,但不承载线上流量。通常数据库集群需要一个延迟备库,以便出现错误(例如误删数据)时能及时恢复。在这种情况下,因为延迟备库与主库内容不一致,因此不能服务线上查询。 冷备(Code Backup): …

  • PostgreSQL监控系统概览

    冯若航 发布于 PGSQL 2393 字 5 分钟

    冯若航PostgreSQL监控PG管理

    Featured Image for PostgreSQL监控系统概览

    PostgreSQL驾驶技巧 PostgreSQL是一个很棒的数据库,但也相当复杂。上手虽简单,但想要用好不容易,想要管理好就更麻烦了。监控系统是几乎所有运维工作的基础,更亦是驾驭数据库的必备工具。用好一个监控系统,理解各种指标背后的意义并不是一件简单的事情,因此本司机决定写一系列文章,来介绍了PostgreSQL监控系统的设计,实施与使用。 0x01 PostgreSQL监控面板 为了帮助读者形成一种直觉,这里展示了在实际环境中,我所使用的监控面板。最为常用的监控面板为“单数据库实例”监控,并 …

    PostgreSQL驾驶技巧 PostgreSQL是一个很棒的数据库,但也相当复杂。上手虽简单,但想要用好不容易,想要管理好就更麻烦了。监控系统是几乎所有运维工作的基础,更亦是驾驭数据库的必备工具。用好一个监控系统,理解各种指标背后的意义并不是一件简单的事情,因此本司机决定写一系列文章,来介绍了PostgreSQL监控系统的设计,实施与使用。 0x01 PostgreSQL监控面板 为了帮助读者形成一种直觉,这里展示了在实际环境中,我所使用的监控面板。最为常用的监控面板为“单数据库实例”监控,并 …

  • 故障档案:pg_dump导致的连接池污染

    冯若航 发布于 PGSQL 2403 字 5 分钟

    冯若航PostgreSQLPG管理故障复盘

    Featured Image for 故障档案:pg_dump导致的连接池污染

    PostgreSQL很棒,但这并不意味着它是Bug-Free的。这一次在线上环境中,我又遇到了一个很有趣的Case:由 pg_dump 导致的线上故障。这是一个非常微妙的Bug,由Pgbouncer,search_path,以及特殊的 pg_dump 操作所触发。 背景知识 连接污染 在PostgreSQL中,每条数据库连接对应一个后端进程,会持有一些临时资源(状态),在连接结束时会被销毁,包括: 本会话中修改过的参数。RESET ALL; 准备好的语句。 DEALLOCATE ALL 打开的游 …

    PostgreSQL很棒,但这并不意味着它是Bug-Free的。这一次在线上环境中,我又遇到了一个很有趣的Case:由 pg_dump 导致的线上故障。这是一个非常微妙的Bug,由Pgbouncer,search_path,以及特殊的 pg_dump 操作所触发。 背景知识 连接污染 在PostgreSQL中,每条数据库连接对应一个后端进程,会持有一些临时资源(状态),在连接结束时会被销毁,包括: 本会话中修改过的参数。RESET ALL; 准备好的语句。 DEALLOCATE ALL 打开的游 …

  • PostgreSQL数据页面损坏修复

    冯若航 发布于 PGSQL 4434 字 9 分钟

    冯若航PostgreSQLPG管理故障复盘

    Featured Image for PostgreSQL数据页面损坏修复

    PostgreSQL是一个很可靠的数据库,但是再可靠的数据库,如果碰上了不可靠的硬件,恐怕也得抓瞎。本文介绍了在PostgreSQL中,应对数据页面损坏的方法。 最初的问题 线上有一套统计库跑离线任务,业务方反馈跑SQL的时候碰上一个错误: ERROR: invalid page in block 18858877 of relation base/16400/275852 看到这样的错误信息,第一直觉就是硬件错误导致的关系数据文件损坏,第一步要检查定位具体问题。 这里,16400是数据库的 …

    PostgreSQL是一个很可靠的数据库,但是再可靠的数据库,如果碰上了不可靠的硬件,恐怕也得抓瞎。本文介绍了在PostgreSQL中,应对数据页面损坏的方法。 最初的问题 线上有一套统计库跑离线任务,业务方反馈跑SQL的时候碰上一个错误: ERROR: invalid page in block 18858877 of relation base/16400/275852 看到这样的错误信息,第一直觉就是硬件错误导致的关系数据文件损坏,第一步要检查定位具体问题。 这里,16400是数据库的 …

  • 关系膨胀的监控与治理

    冯若航 发布于 PGSQL 5474 字 11 分钟

    冯若航PostgreSQLPG管理

    Featured Image for 关系膨胀的监控与治理

    PostgreSQL使用了MVCC作为主要并发控制技术,它有很多好处,但也会带来一些其他的影响,例如关系膨胀。关系(表与索引)膨胀会对数据库性能产生负面影响,并浪费磁盘空间。为了使PostgreSQL始终保持在最佳性能,有必要及时对膨胀的关系进行垃圾回收,并定期重建过度膨胀的关系。 在实际操作中,垃圾回收并没有那么简单,这里有一系列的问题: 关系膨胀的原因? 关系膨胀的度量? 关系膨胀的监控? 关系膨胀的处理? 本文将详细说明这些问题。 关系膨胀概述 假设某个关系实际占用存储100G,但其中有很 …

    PostgreSQL使用了MVCC作为主要并发控制技术,它有很多好处,但也会带来一些其他的影响,例如关系膨胀。关系(表与索引)膨胀会对数据库性能产生负面影响,并浪费磁盘空间。为了使PostgreSQL始终保持在最佳性能,有必要及时对膨胀的关系进行垃圾回收,并定期重建过度膨胀的关系。 在实际操作中,垃圾回收并没有那么简单,这里有一系列的问题: 关系膨胀的原因? 关系膨胀的度量? 关系膨胀的监控? 关系膨胀的处理? 本文将详细说明这些问题。 关系膨胀概述 假设某个关系实际占用存储100G,但其中有很 …

  • TimescaleDB 快速上手

    冯若航 发布于 PGSQL 9152 字 19 分钟

    冯若航PostgreSQLPG管理扩展

    Featured Image for TimescaleDB 快速上手

    官方网站:https://www.timescale.com 官方文档:https://docs.timescale.com/v0.9/main Github:https://github.com/timescale/timescaledb 为什么使用TimescaleDB 什么是时间序列数据? 我们一直在谈论什么是“时间序列数据”,以及与其他数据有何不同以及为什么? 许多应用程序或数据库实际上采用的是过于狭窄的视图,并将时间序列数据与特定形式的服务器度量值等同起来: Name: CPU …

    官方网站:https://www.timescale.com 官方文档:https://docs.timescale.com/v0.9/main Github:https://github.com/timescale/timescaledb 为什么使用TimescaleDB 什么是时间序列数据? 我们一直在谈论什么是“时间序列数据”,以及与其他数据有何不同以及为什么? 许多应用程序或数据库实际上采用的是过于狭窄的视图,并将时间序列数据与特定形式的服务器度量值等同起来: Name: CPU …

  • PipelineDB快速上手

    冯若航 发布于 PGSQL 295 字 1 分钟

    冯若航PostgreSQLPG管理扩展

    Featured Image for PipelineDB快速上手

    PipelineDB安装与配置 PipelineDB可以直接通过官方rpm包安装。 加载PipelineDB需要添加动态链接库,在 postgresql.conf 中修改配置项并重启: shared_preload_libraries = 'pipelinedb' max_worker_processes = 128 注意如果不修改 max_worker_processes 会报错。其他配置都参照标准的PostgreSQL PipelineDB使用样例 —— 维基PV数据 -- 创建Stream …

    PipelineDB安装与配置 PipelineDB可以直接通过官方rpm包安装。 加载PipelineDB需要添加动态链接库,在 postgresql.conf 中修改配置项并重启: shared_preload_libraries = 'pipelinedb' max_worker_processes = 128 注意如果不修改 max_worker_processes 会报错。其他配置都参照标准的PostgreSQL PipelineDB使用样例 —— 维基PV数据 -- 创建Stream …

  • 故障档案:序列号消耗过快导致整型溢出

    冯若航 发布于 PGSQL 1189 字 3 分钟

    冯若航PostgreSQLPG管理故障复盘

    Featured Image for 故障档案:序列号消耗过快导致整型溢出

    0x01 概览 故障表现: 某张使用自增列的表序列号涨至整型上限,无法写入。 发现表中的自增列存在大量空洞,很多序列号没有对应记录就被消耗掉了。 故障影响:非核心业务某表,10分钟左右无法写入。 故障原因: 内因:使用了INTEGER而不是BIGINT作为主键类型。 外因:业务方不了解 SEQUENCE 的特性,执行大量违背约束的无效插入,浪费了大量序列号。 修复方案: 紧急操作:降级线上插入函数为直接返回,避免错误扩大。 应急方案:创建临时表,生成5000万个浪费空洞中的临时ID,修改插入函 …

    0x01 概览 故障表现: 某张使用自增列的表序列号涨至整型上限,无法写入。 发现表中的自增列存在大量空洞,很多序列号没有对应记录就被消耗掉了。 故障影响:非核心业务某表,10分钟左右无法写入。 故障原因: 内因:使用了INTEGER而不是BIGINT作为主键类型。 外因:业务方不了解 SEQUENCE 的特性,执行大量违背约束的无效插入,浪费了大量序列号。 修复方案: 紧急操作:降级线上插入函数为直接返回,避免错误扩大。 应急方案:创建临时表,生成5000万个浪费空洞中的临时ID,修改插入函 …

  • 故障档案:PostgreSQL事务号回卷

    冯若航 发布于 PGSQL 1972 字 4 分钟

    冯若航PostgreSQLPG管理故障复盘

    Featured Image for 故障档案:PostgreSQL事务号回卷

    遇到一次磁盘坏块导致的事务回卷故障: 主库(PostgreSQL 9.3)磁盘坏块导致几张表上的VACUUM FREEZE执行失败。 无法回收老旧事务ID,导致整库事务ID濒临用尽,数据库进入自我保护状态不可用。 磁盘坏块导致手工VACUUM抢救不可行。 提升从库后,需要紧急VACUUM FREEZE才能继续服务,进一步延长了故障时间。 主库进入保护状态后提交日志(clog)没有及时复制到从库,从库产生存疑事务拒绝服务。 摘要 这是一个即将下线老旧库,疏于管理。坏块征兆在一周前就已经出现,没有及 …

    遇到一次磁盘坏块导致的事务回卷故障: 主库(PostgreSQL 9.3)磁盘坏块导致几张表上的VACUUM FREEZE执行失败。 无法回收老旧事务ID,导致整库事务ID濒临用尽,数据库进入自我保护状态不可用。 磁盘坏块导致手工VACUUM抢救不可行。 提升从库后,需要紧急VACUUM FREEZE才能继续服务,进一步延长了故障时间。 主库进入保护状态后提交日志(clog)没有及时复制到从库,从库产生存疑事务拒绝服务。 摘要 这是一个即将下线老旧库,疏于管理。坏块征兆在一周前就已经出现,没有及 …

  • PostgreSQL的触发器使用注意事项

    冯若航 发布于 PGSQL 2040 字 5 分钟

    冯若航PostgreSQLPG开发

    Featured Image for PostgreSQL的触发器使用注意事项

    概览 触发器行为概述 触发器的分类 触发器的功能 触发器的种类 触发器的触发 触发器的创建 触发器的修改 触发器的查询 触发器的性能 触发器概述 触发器行为概述:英文,中文 触发器分类 触发时机:BEFORE, AFTER, INSTEAD 触发事件:INSERT, UPDATE, DELETE,TRUNCATE 触发范围:语句级,行级 内部创建:用于约束的触发器,用户定义的触发器 触发模式:origin|local(O), replica(R),disable(D) 触发器操作 触发器的操作通 …

    概览 触发器行为概述 触发器的分类 触发器的功能 触发器的种类 触发器的触发 触发器的创建 触发器的修改 触发器的查询 触发器的性能 触发器概述 触发器行为概述:英文,中文 触发器分类 触发时机:BEFORE, AFTER, INSTEAD 触发事件:INSERT, UPDATE, DELETE,TRUNCATE 触发范围:语句级,行级 内部创建:用于约束的触发器,用户定义的触发器 触发模式:origin|local(O), replica(R),disable(D) 触发器操作 触发器的操作通 …

  • GeoIP 地理逆查询优化

    冯若航 发布于 PGSQL 2902 字 6 分钟

    冯若航PostgreSQLPG开发扩展GIS

    Featured Image for GeoIP 地理逆查询优化

    IP归属地查询的高效实现 在应用开发中,一个‘很常见’的需求就是GeoIP转换。将请求的来源IP转换为相应的地理坐标,或者行政区划(国家-省-市-县-乡-镇)。这种功能有很多用途,譬如分析网站流量的地理来源,或者干一些坏事。使用PostgreSQL可以多快好省,优雅高效地实现这一需求。 0x01 思路方法 通常网上的IP地理数据库的形式都是:start_ip, stop_ip , longitude, latitude,再缀上一些国家代码,城市代码,邮编之类的属性字段。大概长这样: …

    IP归属地查询的高效实现 在应用开发中,一个‘很常见’的需求就是GeoIP转换。将请求的来源IP转换为相应的地理坐标,或者行政区划(国家-省-市-县-乡-镇)。这种功能有很多用途,譬如分析网站流量的地理来源,或者干一些坏事。使用PostgreSQL可以多快好省,优雅高效地实现这一需求。 0x01 思路方法 通常网上的IP地理数据库的形式都是:start_ip, stop_ip , longitude, latitude,再缀上一些国家代码,城市代码,邮编之类的属性字段。大概长这样: …

  • PostgreSQL开发规约(2018版)

    冯若航 发布于 PGSQL 7398 字 15 分钟

    冯若航PostgreSQLPG开发软件工程

    Featured Image for PostgreSQL开发规约(2018版)

    微信公众号原文 0x00背景 没有规矩,不成方圆。 PostgreSQL的功能非常强大,但是要把PostgreSQL用好,需要后端、运维、DBA的协力配合。 本文针对PostgreSQL数据库原理与特性,整理了一份开发规范,希望可以减少大家在使用PostgreSQL数据库过程中遇到的困惑。你好我也好,大家都好。 0x01 命名规范 无名,万物之始,有名,万物之母。 【强制】 通用命名规则 本规则适用于所有对象名,包括:库名、表名、表名、列名、函数名、视图名、序列号名、别名等。 对象名务必只使用 …

    微信公众号原文 0x00背景 没有规矩,不成方圆。 PostgreSQL的功能非常强大,但是要把PostgreSQL用好,需要后端、运维、DBA的协力配合。 本文针对PostgreSQL数据库原理与特性,整理了一份开发规范,希望可以减少大家在使用PostgreSQL数据库过程中遇到的困惑。你好我也好,大家都好。 0x01 命名规范 无名,万物之始,有名,万物之母。 【强制】 通用命名规则 本规则适用于所有对象名,包括:库名、表名、表名、列名、函数名、视图名、序列号名、别名等。 对象名务必只使用 …

  • PostgreSQL好处都有啥

    冯若航 发布于 PGSQL 4934 字 10 分钟

    冯若航PostgreSQLPG生态

    Featured Image for PostgreSQL好处都有啥

    PostgreSQL的Slogan是“世界上最先进的开源关系型数据库”,但我觉得这口号不够响亮,而且一看就是在怼MySQL那个“世界上最流行的开源关系型数据库”的口号,有碰瓷之嫌。要我说最能生动体现PG特色的口号应该是:一专多长的全栈数据库,一招鲜吃遍天嘛。 全栈数据库 成熟的应用可能会用到许许多多的数据组件(功能):缓存,OLTP,OLAP/批处理/数据仓库,流处理/消息队列,搜索索引,NoSQL/文档数据库,地理数据库,空间数据库,时序数据库,图数据库。传统的架构选型呢,可能会组合使用多种组 …

    PostgreSQL的Slogan是“世界上最先进的开源关系型数据库”,但我觉得这口号不够响亮,而且一看就是在怼MySQL那个“世界上最流行的开源关系型数据库”的口号,有碰瓷之嫌。要我说最能生动体现PG特色的口号应该是:一专多长的全栈数据库,一招鲜吃遍天嘛。 全栈数据库 成熟的应用可能会用到许许多多的数据组件(功能):缓存,OLTP,OLAP/批处理/数据仓库,流处理/消息队列,搜索索引,NoSQL/文档数据库,地理数据库,空间数据库,时序数据库,图数据库。传统的架构选型呢,可能会组合使用多种组 …

  • PostGIS高效解决行政区划归属查询

    冯若航 发布于 PGSQL 4305 字 9 分钟

    冯若航PostgreSQLPG开发GIS

    Featured Image for PostGIS高效解决行政区划归属查询

    微信公众号原文 在应用开发中,很多时候我们需要解决这样一个问题:根据用户的经纬度坐标,定位用户的行政区划。 我们收集到的是诸如 28°00'00"N 100°00'00.000"E 这样的经纬度坐标,但实际感兴趣的是这个点所属的行政区划:(中华人民共和国,云南省,迪庆藏族自治州,香格里拉市)。这种将地理坐标映射到某条记录的操作就称为 地理编码(GeoEncode)。高效实现地理编码是一个很有趣的问题。 本文介绍了该问题的解决与优化方案:能在确保正确性的前提下,能用几兆的空间,110μs的执行时 …

    微信公众号原文 在应用开发中,很多时候我们需要解决这样一个问题:根据用户的经纬度坐标,定位用户的行政区划。 我们收集到的是诸如 28°00'00"N 100°00'00.000"E 这样的经纬度坐标,但实际感兴趣的是这个点所属的行政区划:(中华人民共和国,云南省,迪庆藏族自治州,香格里拉市)。这种将地理坐标映射到某条记录的操作就称为 地理编码(GeoEncode)。高效实现地理编码是一个很有趣的问题。 本文介绍了该问题的解决与优化方案:能在确保正确性的前提下,能用几兆的空间,110μs的执行时 …

  • KNN极致优化:从RDS到PostGIS

    冯若航 发布于 PGSQL 8223 字 17 分钟

    冯若航PostgreSQLPG开发机器学习GIS

    Featured Image for KNN极致优化:从RDS到PostGIS

    灵活应用数据库的功能,可以轻松实现 GIS 圈选场景下三万倍的性能提升。 Level 方法 性能/耗时(ms) 可维护性/可靠性 备注 1 暴力扫表 30,000 - 形式简单 2 经纬索引 35 复杂度/魔数问题 额外复杂度 3 联合索引 10 复杂度/魔数问题 额外复杂度 4 GIST 4 最简表达,完全精确 形式简单,距离更精确,PostgreSQL限定 5 btree_gist 联合索引 1 最简表达,完全精确 形式简单,距离更精确,PostgreSQL限定 场景 互联网中的很多业务都涉 …

    灵活应用数据库的功能,可以轻松实现 GIS 圈选场景下三万倍的性能提升。 Level 方法 性能/耗时(ms) 可维护性/可靠性 备注 1 暴力扫表 30,000 - 形式简单 2 经纬索引 35 复杂度/魔数问题 额外复杂度 3 联合索引 10 复杂度/魔数问题 额外复杂度 4 GIST 4 最简表达,完全精确 形式简单,距离更精确,PostgreSQL限定 5 btree_gist 联合索引 1 最简表达,完全精确 形式简单,距离更精确,PostgreSQL限定 场景 互联网中的很多业务都涉 …

  • 监控PG中的表大小

    冯若航 发布于 PGSQL 1397 字 3 分钟

    冯若航PostgreSQLPG管理监控

    Featured Image for 监控PG中的表大小

    表的空间布局 宽泛意义上的 表(Table),包含了 本体表 与 TOAST表 两个部分: 本体表,存储关系本身的数据,即狭义的关系,relkind='r'。 TOAST表,与本体表一一对应,存储过大的字段,relinkd='t'。 而每个表,又由 主体 与 索引 两个 关系(Relation) 组成(对本体表而言,可以没有索引关系) 主体关系:存储元组。 索引关系:存储索引元组。 每个 关系 又可能会有 四种分支: main: 关系的主文件,编号为0 fsm:保存关于main分支中空闲空间的信 …

    表的空间布局 宽泛意义上的 表(Table),包含了 本体表 与 TOAST表 两个部分: 本体表,存储关系本身的数据,即狭义的关系,relkind='r'。 TOAST表,与本体表一一对应,存储过大的字段,relinkd='t'。 而每个表,又由 主体 与 索引 两个 关系(Relation) 组成(对本体表而言,可以没有索引关系) 主体关系:存储元组。 索引关系:存储索引元组。 每个 关系 又可能会有 四种分支: main: 关系的主文件,编号为0 fsm:保存关于main分支中空闲空间的信 …

  • PgAdmin安装配置

    冯若航 发布于 PGSQL 450 字 1 分钟

    冯若航PostgreSQLPG管理工具

    Featured Image for PgAdmin安装配置

    PgAdmin4的安装与配置 PgAdmin是一个为PostgreSQL定制设计的GUI。用起来很不错。可以以本地GUI程序或者Web服务的方式运行。因为Retina屏幕下面PgAdmin依赖的GUI组件显示效果有点问题,这里主要介绍如何以Web服务方式(Python Flask)配置运行PgAdmin4。 下载 PgAdmin可以从官方FTP下载。 postgresql网站FTP目录地址 wget …

    PgAdmin4的安装与配置 PgAdmin是一个为PostgreSQL定制设计的GUI。用起来很不错。可以以本地GUI程序或者Web服务的方式运行。因为Retina屏幕下面PgAdmin依赖的GUI组件显示效果有点问题,这里主要介绍如何以Web服务方式(Python Flask)配置运行PgAdmin4。 下载 PgAdmin可以从官方FTP下载。 postgresql网站FTP目录地址 wget …

  • 故障档案:快慢不匀雪崩

    冯若航 发布于 PGSQL 2855 字 6 分钟

    冯若航PostgreSQLPG管理故障复盘

    Featured Image for 故障档案:快慢不匀雪崩

    最近发生了一起匪夷所思的故障,某数据库切走了一半的数据量和负载。 其他什么都没变,本来还好;压力减小,却在高峰期陷入濒死状态,完全不符合直觉。 但正如福尔摩斯所说,当你排除掉一切不可能之后,剩下的即使再离奇,也是事实。 一、摘要 某日凌晨4点,进行了核心库进行分库迁移,拆走一半的表和一半的查询负载,原库节点规模不变。 当日晚高峰核心库所有热备库(15台)出现连接堆积,压力暴涨,针对性地清理慢查询不再起效。 无差别持续杀查询,有立竿见影的救火效果(22:30后),且暂停后故障立刻重现 …

    最近发生了一起匪夷所思的故障,某数据库切走了一半的数据量和负载。 其他什么都没变,本来还好;压力减小,却在高峰期陷入濒死状态,完全不符合直觉。 但正如福尔摩斯所说,当你排除掉一切不可能之后,剩下的即使再离奇,也是事实。 一、摘要 某日凌晨4点,进行了核心库进行分库迁移,拆走一半的表和一半的查询负载,原库节点规模不变。 当日晚高峰核心库所有热备库(15台)出现连接堆积,压力暴涨,针对性地清理慢查询不再起效。 无差别持续杀查询,有立竿见影的救火效果(22:30后),且暂停后故障立刻重现 …

  • Bash与psql小技巧

    冯若航 发布于 PGSQL 2726 字 6 分钟

    冯若航PostgreSQLPG管理工具

    Featured Image for Bash与psql小技巧

    一些PostgreSQL与Bash交互的技巧。 使用严格模式编写Bash脚本 使用Bash严格模式,可以避免很多无谓的错误。在Bash脚本开始的地方放上这一行很有用: set -euo pipefail -e:当程序返回非0状态码时报错退出 -u:使用未初始化的变量时报错,而不是当成NULL -o pipefail:使用Pipe中出错命令的状态码(而不是最后一个)作为整个Pipe的状态码1。 执行SQL脚本的Bash包装脚本 通过psql运行SQL脚本时,我们期望有这么两个功能: 能向脚本中传入 …

    一些PostgreSQL与Bash交互的技巧。 使用严格模式编写Bash脚本 使用Bash严格模式,可以避免很多无谓的错误。在Bash脚本开始的地方放上这一行很有用: set -euo pipefail -e:当程序返回非0状态码时报错退出 -u:使用未初始化的变量时报错,而不是当成NULL -o pipefail:使用Pipe中出错命令的状态码(而不是最后一个)作为整个Pipe的状态码1。 执行SQL脚本的Bash包装脚本 通过psql运行SQL脚本时,我们期望有这么两个功能: 能向脚本中传入 …