记录一个openguass(mogdb)checkpoint不推进的问题(续)

前几天《记录一个openguass(mogdb)checkpoint不推进的问题》写了一个问题,最近几天一直在尝试解决,在opengauss本人还不是专家,所以处理起来还是有一些心得,使用vacuum full和pg_repack对表重组,及检查relfilenode所属对象及如何检查是否是孤儿文件

记录一个openguass(mogdb)checkpoint不推进的问题

最近在基于opengauss的mogdb v508上遇到了一个备库 流复制(Streaming Replication)环境中,备机(standby)的 restart point 无法推进,停留在1个月前的一天,该库并未重启或断电,只是在前一晚有对库里大量表做DDL,日志告警Waring: coluld not record restart point at 6F04/98156BB8 because ther are unresolved references to invalid pages

测试主流数据库允许同一列(column)上创建重复索引?

之前在《有哪些技术可以减少PostgreSQL/openGauss数据库的存储空间?》记录过,在PG系的数据库上是支持同一列上创建多个索引,这种既浪费存储又增加了更新列时的额外的写代价,日常巡检需要即使发现并清理,下面再测试oracle,mysql(goldendb等),Gaussdb(opengauss系),Kingbase(Postgresql系),oceanbase,达梦,崖山的情况。

Oracle优化器outer join to inner不如YashanDB

Oracle数据库优化器经过数十年的发展,已经具备了相当成熟的自动查询转换能力。无论是面对编写“欠佳”的SQL语句,还是原本规范但在执行时存在更优路径的SQL,优化器通常都能将其等价转换为较优或最优的执行方案,然而最近遇到一个场景却恰恰相反:Oracle优化器在该情况下存在一定的缺陷,而国产数据库YashanDB的表现却超出了预期。

Highgo在重建流复制备库时会自动清理主库的物理复制槽?

近期在一个国产化数据库highgoDB的数据库环境,一主三从架构,主库的归档产生的较为频繁,且主库的参数关于wal的保留时间配置(wal_keep_size)也偏低, 后来因为备库有重建需求,在重建时发现主库的WAL日志缺失了,重建前也并未手动清理对应的物理槽。难道HighgoDB可以自动清理?

Highgo oracle兼容模式的国产库copy force_null

最近在一个从oracle到基于postgresql的国产数据库项目上,遇到使用copy加载到数据库中的表字段是空值数据无法过滤,因为在oracle中的\0x00、NULL、”(空值) 与postgresql中不同,所以在像瀚高、kingbase等PG系的数据库,oracle兼容模式下对于‘’空值的处理要格外注意,下面简单的记录。

索引key长度限制Oracle、MySQL、PostgreSQL

近期在推进一个从 Oracle 迁移至 PostgreSQL 的项目时,我们遇到部分在 Oracle 中运行正常的索引无法在 PostgreSQL 中创建,系统报错:ERROR: index row size X exceeds maximum Y for index “index_name”。

经分析,这源于不同数据库对索引键(Index Key)长度的上限设计存在差异。为规避此类问题并助力迁移规划,我们特此整理了 Oracle, MySQL, PostgreSQL 三大主流数据库的索引键长度限制。

Highgo数据库模拟deadlock

Highgo数据库实际是Postgresql内核,这篇同样也适用于Kingbase, GaussDB一样存在的PG系,最近一客户上了Highgo数据库后晚上的批作业任务总是失败,查询JOB日志,显示因为deadlock失败,其实很好理解,提示的信息有会话、表、行的信息,这里模拟一下2个会话交叉更新相同记录产生的deadlock.

性能诊断: Kingbase、Highgo等(PostgreSQL系)中数字类型隐式转换导致无法使用索引

在oracle数据库同样也会出现因为隐式转换导致的索引无法使用,但是在PostgreSQL系的数据库中如kingbase, highgoDB, GaussDB, openGauss等,对于对于常用的“数字”对应多个datatype,增加了转换的概率,近期在一套oracle迁移到某国产postgresql系数据库后,之前一个正常高频执行的SQL把数据库CPU瞬间拉到了70%, 如 numval>=power(10,19) 未在索引列使用索引,下面记录这一问题。

性能诊断PostgreSQL中attach partition越来越慢一案例?(pg_partman)

分区表(partition)在大型数据库中是较为常用的技术,PostgreSQL中 v10版本后支持了原生分区语法,之前多是约束注册方式,v11后又至此了default分区,近日一客户反馈他们的PostgreSQL在分区使用pg_partman管理分区增加空分区时越来越慢(≈3sec一个分区), 这里简单记录原因。

如何查找其他session级alter session set修改的参数? Oracle 和Kingbase/HighgoDB(PostgreSQL)

ALTER SESSION命令会更改运行时配置参数,仅影响当前会话使用的值,对其他会话或系统级没有影响,有时需要知道某个会话当前的session级参数,在oracle中比较方便,目前postgresql及基于postgresql的国产库如Kingbase、Highgodb中不太容易,这里我演示gdb的方法。

HighgoDB (PostgreSQL)利用pg_trgm的gin索引优化前后模糊查询

在数据库中文本的模糊查询是ES等数据库的强项,但在关系型数据库中也有一些手段,如后缀%普通索引就可以使用,前缀可以创建reverse反转索引,但是前后模糊的话,在oracle中可以创建索引使用index full scan+加回表查询,今天发现在PostgreSQL中还有pg_trgm扩展,配合GIN索引有不错的性能表现。

HighgoDB (PostgreSQL) %SYS CPU newfstatat() high 调优一例

最这我们一个客户从oracle迁移到postgresql系的某国产数据库后,CPU一直接近100%, 但是再仔细分析,发现%system CPU占到60%左右,当然这是一种不正常的现象,之前我写过《如何在 Linux 上诊断高 %Sys CPU》, 使用pidstat 确认%sys cpu进程大部分为postgresql进程,pstack 查看发现call, PostgreSQL 的线程大部分时间都在调用 newfstatat(),这 不是正常现象,并且通常意味着数据库运行中存在 频繁的文件状态检查(stat)操作,严重时可能导致性能瓶颈。

Alert: PostgreSQL JDBC 记得配置Fetch Size

在使用PostgreSQL JDBC处理大型结果集时,正确配置fetch size对于优化性能和内存使用至关重要。最近我们在国产化改造过程中总有一些差异导致应用性能问题,有时不只在数据库还可能在驱动中,如分页查询或其他OLTP场景,我们总希望尽快的返回结果,这里我分享一下Oracle和Postgresql JDBC 默认fetchsize 从服务向客户端发送数据的差异。

PostgreSQL的事务回卷

PostgreSQL 32位的事务ID,是个比较头疼的问题,如果事务ID耗尽回卷时,回影响数据库的可用行,近期一客户的postgresql数据库出现了事务回卷问题,导致所有业务无法执行, 早期可能日志中会有提示,后期数据库进入只读模式,需要人工干预,同时日志提示下面的错误:
2025-05-16 08:43:48.640 [5764] ERROR: database is not accepting commands to avoid wraparound data loss in database “postgres” (10182)

PostgreSQL Explain analyze命令输出的Execution Time不等于Response TIME

我们explain 增加analyze可以显示exection time实际执行所花的时间, 但是注意对于客户端执行SQL时的response time响应时间并不是这个exection time,这也是有时应用的人会反馈程序执行时间很慢,但我们在数据库端使用explain显示的exection time快,相差很大的原因。简单演示。

GaussDB 单机版(505)ARM安装体验

GaussDB是华为推出的企业级关系型数据库,这里GaussDB是指FOR OLTP的关系型数据库,该分支产品支持分布式和单机式,支持ARM架构和X86架构,目前也同样支持on-premises 本地部署, 来抢占线下的如oracle\MySQL的国产化替代市场,支持oracle与MySQL兼容模式,之前测试过《体验一下GaussDB集中式(本地部署)的Flashback/TIMECAPSULE 闪回功能》,这次在测试环境ARM平台上安装GaussDB单机版(505版本)用于学习,简单记录。

PostgreSQL系(GaussDB、KingBase…) 在 SELECT 和 TRUNCATE之间lock冲突

在从Oracle迁移到PostgreSQL后,SELECT和TRUNCATE操作互相阻塞是一个常见问题,这主要是由于两种数据库的锁机制不同导致的。目前一客户项目在我们迁移到postgresql系的国产数据库生产环境后,时常在一个存储过程中包含truncate又有select 长事务时发生互相堵塞,简单记录.