设为首页 收藏本站
查看: 1724|回复: 0

[经验分享] PostgreSQL的数据存储(八)---数据存储

[复制链接]

尚未签到

发表于 2016-11-20 11:37:53 | 显示全部楼层 |阅读模式
4.2  数据的内部格式
4.2.1 页的存储数据结构
  在操作系统层面,数据存储,只是一些二进制信息,这个层次,是不知道文件内容的含义的。文件的逻辑含义,取决于应用层面。
  数据库系统的文件组织,也如此。在外存存储,以二进制格式存放,读写文件,以块(8k)为单位,读入的数据,存放与数据缓冲区,所以,数据的逻辑含义,始于数据缓冲区。
  在bufpage.h文件中,有如下定义:
  typedef struct PageHeaderData
  {
  /* XXX LSN is member of *any* block, not only page-organized ones */
  XLogRecPtr pd_lsn; /* LSN: next byte after last byte of xlog
  * record for last change to this page */
  uint16 pd_tli;  /* least significant bits of the TimeLineID
  * containing the LSN */
  uint16 pd_flags; /* flag bits, see below */
  LocationIndex pd_lower; /* offset to start of free space */
  LocationIndex pd_upper; /* offset to end of free space */
  LocationIndex pd_special; /* offset to start of special space */
  uint16 pd_pagesize_version;
  TransactionId pd_prune_xid; /* oldest prunable XID, or zero if none */
  ItemIdData pd_linp[1]; /* beginning of line pointer array */
  } PageHeaderData;
  这个结构,描述了数据页的页头信息。一个数据页,是一个块大小,即8k。这个页的初始部分,完全由PageHeaderData这个结构定义。
  结构成员名称
  类型
  功能
  pd_lsn
  XLogRecPtr
  写到redo日志中的记录的结束位置的位置标识,用以把数据页和redo日志关联,用于恢复数据时校验日志文件和数据文件的一致性
  pd_tli
  uint16
  与redo日志相关,上一个记录了redo日志的文件id和偏移,本标志记载了redo日志的“timeline”时间线。在redo日志中,完整标识一个日志文件,是靠时间线和日志id;完整标识一个日志位置,是靠时间线和日志id和日志文件中的偏移值
  pd_flags
  uint16
  标识本页面的数据存储情况,是半满页、满页、、还是有冗余数据(数据对于一些用户是否可见,与事务相关,与PG实现的MVCC相关)
  pd_lower
  LocationIndex
  指向空闲空间的开始位置
  pd_upper
  LocationIndex
  指向空闲空间的结束位置
  pd_special
  LocationIndex
  指向页面尾部的一个特殊块的位置处,通过PageInit函数可以了解不同调用函数通常有不同的特殊块存在。如gin索引对应的页面、hash页面、BTree索引页面都有特殊的块标识特别的信息
  pd_pagesize_version
  uint16
  标识数据页的页面版本,不同PG的版本,数据页格式可能发生变化,用以标识变化的。这样,就存在根据页面版本号读取不同信息的可能
  pd_prune_xid
  TransactionId
  记载本页面上最老的事务ID值,在做vacuum操作时使用
  pd_linp[1]
  ItemIdData
  指向页面上存在的tuple(记录)的指针
  相关代码:
  src/include/storage/itemid.h

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-302885-1-1.html 上篇帖子: PostgreSQL的数据存储(九)---数据存储 下篇帖子: PostgreSQL的数据存储(六)---数据存储
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表