GreatSQL社区

搜索

reddey

国产红石PG数据库的回滚段一些功能介绍和猜想

reddey 已有 23 次阅读2025-9-26 10:01 |系统分类:运维实战


红石PG数据库使用了类似ORACLE数据库的回滚段对事务进行管理,以下引用其官方的技术文档进行一些介绍:

Redrock Postgres 维护事务操作的记录,统称为撤消数据。Redrock Postgres 使用撤消数据来执行以下操作:

回滚活跃事务

恢复异常结束的事务

提供读一致性

Redrock Postgres 将撤消数据存储在数据库中而不是外部日志中。撤消数据存储在与数据块一样更新的块中,对这些块的更改会产生重做。 通过这种方式,Redrock Postgres 可以高效地访问撤消数据,而无需读取外部日志。

撤消数据存储在独立的表空间中。Redrock Postgres 提供了一种完全自动化的机制,称为自动回滚段管理模式,用于管理回滚段和存储空间。

管理回滚段

初始化数据库实例数据目录后,数据库中默认会产生 64 个回滚段。要获取当前数据库中现有回滚段的信息,可以查看系统表 pg_class,例如:

SELECT oid, relname,

      pg_size_pretty(pg_relation_size(oid)) AS undsize

  FROM pg_class WHERE relkind = 'u';

当某个回滚段的使用空间超出 1GB 以后,后台清理进程会自动对其进行收缩,以回收其占用的多余空间。

从上面的功能介绍看,发现该数据库对回滚段的管理,不是通过日志(WAL日志或UNDO日志)进行管理,而是通过专用的数据库表空间进行管理回滚段,这一点和ORACLE数据库有些类似。我们推测一下红石PG数据库,斗胆提出如下几个问题:

1、既然表空间管理的回滚段,这个表空间的名称是什么?这个表空间的大小大约是多少?

2、会不会像ORACLE数据库有个过期数据保持时间呢?如果有,这个时间是多长?比如ORALCE数据库有个undo_retention参数,任何回滚段大小都有上限,保存数据时间也会有个量度。

我们按照官方技术提供的语句,现在看一下回滚段信息,

如下所示

postgres=# SELECT oid, relname,

postgres-#        pg_size_pretty(pg_relation_size(oid)) AS undsize

postgres-#    FROM pg_class WHERE relkind = 'u';

oid  |  relname   | undsize

------+------------+---------

8101 | pg_undo_1  | 1040 kB

8102 | pg_undo_2  | 1040 kB

8103 | pg_undo_3  | 1040 kB

8104 | pg_undo_4  | 1040 kB

8105 | pg_undo_5  | 1040 kB

8106 | pg_undo_6  | 1040 kB

8107 | pg_undo_7  | 1040 kB

8108 | pg_undo_8  | 1040 kB

8109 | pg_undo_9  | 1040 kB

8110 | pg_undo_10 | 1040 kB

8111 | pg_undo_11 | 32 MB

8112 | pg_undo_12 | 1040 kB

8113 | pg_undo_13 | 1040 kB

8114 | pg_undo_14 | 1040 kB

8115 | pg_undo_15 | 1040 kB

8116 | pg_undo_16 | 1040 kB

8117 | pg_undo_17 | 1040 kB

8118 | pg_undo_18 | 1040 kB

8119 | pg_undo_19 | 1040 kB

8120 | pg_undo_20 | 1040 kB

8121 | pg_undo_21 | 1040 kB

8122 | pg_undo_22 | 1040 kB

8123 | pg_undo_23 | 1040 kB

8124 | pg_undo_24 | 61 MB

8125 | pg_undo_25 | 1040 kB

8126 | pg_undo_26 | 1040 kB

8127 | pg_undo_27 | 1040 kB

8128 | pg_undo_28 | 1192 kB

8129 | pg_undo_29 | 1040 kB

8130 | pg_undo_30 | 1040 kB

8131 | pg_undo_31 | 1040 kB

8132 | pg_undo_32 | 1040 kB

8133 | pg_undo_33 | 1040 kB

8134 | pg_undo_34 | 1040 kB

8135 | pg_undo_35 | 1040 kB

8136 | pg_undo_36 | 1040 kB

8137 | pg_undo_37 | 1040 kB

8138 | pg_undo_38 | 1040 kB

8139 | pg_undo_39 | 1040 kB

8140 | pg_undo_40 | 1040 kB

8141 | pg_undo_41 | 1040 kB

8142 | pg_undo_42 | 1040 kB

8143 | pg_undo_43 | 1040 kB

8144 | pg_undo_44 | 1040 kB

8145 | pg_undo_45 | 1040 kB

8146 | pg_undo_46 | 1040 kB

8147 | pg_undo_47 | 1040 kB

8148 | pg_undo_48 | 1040 kB

8149 | pg_undo_49 | 1040 kB

8150 | pg_undo_50 | 32 MB

8151 | pg_undo_51 | 1040 kB

8152 | pg_undo_52 | 1184 kB

8153 | pg_undo_53 | 1040 kB

8154 | pg_undo_54 | 1040 kB

8155 | pg_undo_55 | 1040 kB

8156 | pg_undo_56 | 1040 kB

8157 | pg_undo_57 | 1040 kB

8158 | pg_undo_58 | 1040 kB

8159 | pg_undo_59 | 1040 kB

8160 | pg_undo_60 | 1040 kB

8161 | pg_undo_61 | 1040 kB

8162 | pg_undo_62 | 1040 kB

8163 | pg_undo_63 | 61 MB

8164 | pg_undo_64 | 1040 kB

确实是有64个回滚段,但回滚段起始大小不全相同,有的是1040 kB,有的是32MB,有的是61MB,但为什么起始大小不尽相同?难道是为了应对个别大事务?这纯属个人猜测,如果大家知道原因,请点拨一下。

那回滚段在放在哪个表空间呢?技术文档说在它有独立的表空间。我们检查一下

redrock=# \db

      List of tablespaces

   Name    |  Owner   | Location

------------+----------+----------

pg_default | postgres |

pg_global  | postgres |

(2 rows)

只有这两个默认的表空间和开源的PG数据库别无二致,没有其它的独立表空间。问了红石PG技术人员,对方回复技术文档写得不太准确,但并没有表述正确的表述。个人又仔细看了红石PG数据库其它官方社区文档,说是撤消的数据和新数据都放在一个数据块中。从中我们可以猜想一下,是不是回滚段实际上就放在业务数据的表空间中,并且由业务表空间进行管理。各位网友可能发出疑问,为什么又是猜想?难道学习数据库技术要靠猜?在技术文档不太完善的情况,我只能推测技术合理性的原因。

注:国产数据库的技术文档还是要加强一下,把一些技术问题的细节讲清楚。


评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2025-9-29 02:43 , Processed in 0.014955 second(s), 9 queries , Redis On.
返回顶部