|
红石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数据库其它官方社区文档,说是撤消的数据和新数据都放在一个数据块中。从中我们可以猜想一下,是不是回滚段实际上就放在业务数据的表空间中,并且由业务表空间进行管理。各位网友可能发出疑问,为什么又是猜想?难道学习数据库技术要靠猜?在技术文档不太完善的情况,我只能推测技术合理性的原因。
注:国产数据库的技术文档还是要加强一下,把一些技术问题的细节讲清楚。
合作电话:010-64087828
社区邮箱:greatsql@greatdb.com