`

PostgreSQL的存储系统一:控制文件存储结构

阅读更多

 

Pg 控制文件 pg_control 里存储的数据是一个 ControlFileData 结构。 控制文件尽量保持小于 512 个字节以使其适合一个典型的磁盘驱动的物理簇的大小。这会减少由于电源故障而写控制文件直接失败的可能性。但控制文件的物理大小是 8K ,这个远大于 512 个字节。这样做是为了控制文件格式变化时保持物理大小不变,如果正在读一个不兼容的文件,以使 ReadControlFile 能传递一个合适的错误版本控制文件信息而代替一个读错误。系统里定义了和自己匹配的控制文件版本变量 PG_CONTROL_VERSION ,启动时会做系统和控制文件的匹配校验。

1

控制文件里存储了唯一系统标识符、系统状态数据、数据库启动前系统必须恢复到的最小点、检查服务器硬件架构计算能力的字节排序和浮点数格式、数据库的配置兼容 backend 进程执行的参数、指明类型 timestamp interval time 内部格式的标志、指明不同类型传值( pass-by-value )状态的标志以及所有这些信息的经验和。具体见下面 ControlFileData 结构。

 

typedef struct ControlFileData

{

    /* 唯一系统标识符——保证控制文件和产生 XLOG 文件的数据库一致 */

    uint64      system_identifier ;

    /*

版本标识符信息。保持这些制度在同一个偏移量,特别是 pg_control_version ;如果它们改变了他们就不再有用。(由于历史原因他们必须在文件里是 8 字节,而不是在最前面。)

    pg_control_version 标识 pg_control 自身的格式。

    catalog_version_no 标识系统 catalog 的格式。

    在私有文件里有额外的版本标识符;例如, WAL 日志文件每页包含的 magic 数可以作为 WAL 日志的版本。

      */

    uint32      pg_control_version ;      /* PG_CONTROL_VERSION */

    uint32      catalog_version_no ;      /* see catversion.h */

 

    /* 系统状态数据 */

    DBState        state ;        /* see enum above */

    pg_time_t   time ;         /* time stamp of last pg_control update */

    XLogRecPtr checkPoint ;       /* last check point record ptr */

    XLogRecPtr prevCheckPoint ; /* previous check point record ptr */

 

    CheckPoint checkPointCopy ; /* copy of last check point record */

 

    /*

这两个值确定数据库启动前我们必须恢复到的最小点:

    我们在归档恢复期间刷出数据的时候 minRecoveryPoint 被更新到最后重放的 LSN 。这保证了归档恢复,退出并且在更早的停止位置启动 并恢复到这个位置。如果我们已经从内存里把新的 WAL 记录 X 刷出到磁盘,没有到达 X 我们决不能启动。没有做归档恢复时 minRecoveryPoint 0

    backupStartPoint :如果我们正在从在线备份恢复而且还没有到达备份的结尾, backupStartPoint 是备份开始检查点的 redo 指针。到达备份结尾后置 backupStartPoint 0 并且到达它之前我们不能启动数据库。负责一个布尔值就足够了,但是当我们看到一个 end-of-backup 记录时我们用这个 redo 指针做检查,以保证这个 end-of-backup 记录是我们正在基于其恢复的那个基础备份。

      */

    XLogRecPtr minRecoveryPoint ;

    XLogRecPtr backupStartPoint ;

 

    /* 确定 WAL 能被用于归档或双机热备的参数设置 */

    int         wal_level ;

    int         MaxConnections ;

    int         max_prepared_xacts ;

    int         max_locks_per_xact ;

 

    /*

这些数据用来检查数据库和 backend 进程在其上执行的硬件架构计算能力。我们不需要显式检查字节顺序( endianness ),因为对于一个不同字节顺序的机器控制文件版本会看到问题,但我们需要担心字节对齐和浮点格式。(注意:磁盘存储布局通常依赖于 SHORTALIGN INTALIGN ,但实际上在所有感兴趣的架构上它们是相同的。)

    对于浮点兼容仅测试一个 double 值不是个刀枪不入的测试,但会满足大多数场合。

      */

    uint32      maxAlign ;     /* alignment requirement for tuples */

    double      floatFormat ;  /* constant 1234567.0 */

#define FLOATFORMAT_VALUE   1234567.0

 

    /* 这些数据用来确保数据库的配置兼容 backend 进程执行 */

    uint32      blcksz ;           /* data block size for this DB */

    uint32      relseg_size ;  /* blocks per segment of large relation */

 

    uint32      xlog_blcksz ;  /* block size within WAL files */

    uint32      xlog_seg_size ;    /* size of each WAL segment */

 

    uint32      nameDataLen ;  /* catalog name field width */

    uint32      indexMaxKeys ; /* max number of columns in an index */

 

    uint32      toast_max_chunk_size ;    /* chunk size in TOAST tables */

 

    /* 指明内部 timestamp interval time 内部格式的标志 */

    bool        enableIntTimes ; /* int64 storage enabled? */

 

    /* 指明不同类型 pass-by-value 状态的标志 */

    bool        float4ByVal ;  /* float4 pass-by-value? */

    bool        float8ByVal ;  /* float8, int8, etc pass-by-value? */

 

    /* CRC of all above ... MUST BE LAST! */

    pg_crc32    crc ;

} ControlFileData;

 

    其中的成员 state checkPointCopy checkPoint prevCheckPoint minRecoveryPoint backupStartPoint 需要说明

 

2

成员 state DBState 枚举类型变量。作系统状态指示器。存储于控制文件,如果改变了该枚举类型,必须修改控制文件版本和系统内变量 PG_CONTROL_VERSION 定义见下面。

 

typedef enum DBState

{

    DB_STARTUP = 0,

    DB_SHUTDOWNED ,

    DB_SHUTDOWNED_IN_RECOVERY ,

    DB_SHUTDOWNING ,

    DB_IN_CRASH_RECOVERY ,

    DB_IN_ARCHIVE_RECOVERY ,

    DB_IN_PRODUCTION

} DBState ;

 

3

成员 checkPointCopy CheckPoint 类型变量,就是常说的检查点,是最后的那个检查点的拷贝,以备灾难恢复是使用,改变该结构定义要求改变控制文件版本和系统内变量 PG_CONTROL_VERSION 。定义见下面。

 

typedef struct CheckPoint

{

    XLogRecPtr redo ;         /* 开始创建一个检查点时下一个 XLOG 记录的位置 */

    TimeLineID ThisTimeLineID ; /* 当前时间线 */

    uint32      nextXidEpoch ; /* 下一个事务 ID 的高排序位 */

    TransactionId nextXid ;      /* 下一个空闲事务 ID */

    Oid         nextOid ;      /* 下一个空闲 OID */

    MultiXactId nextMulti ;      /* 下一个空闲多事务 ID */

    MultiXactOffset nextMultiOffset ;   /* next free MultiXact offset */

    TransactionId oldestXid ; /* cluster-wide minimum datfrozenxid */

    Oid         oldestXidDB ;  /* database with minimum datfrozenxid */

    pg_time_t   time ;         /* 检查点时间戳 */

 

    /*

仍在运行的最早的事务 ID XID )。只有在从一个在线检查点初始化热备模式时才需要,以使在 GUC 参数 wal_level hot_standby 时我们不用为在线检查点计算运行最早的 XID 。否则设置为常量 InvalidTransactionId

      */

    TransactionId oldestActiveXid ;

} CheckPoint ;

 

4

    成员 checkPoint prevCheckPoint minRecoveryPoint backupStartPoint XLogRecPtr 结构类型的变量。先看 XLogRecPtr 结构类型,用于记录 XLOG 记录在 XLOG 日志文件中的位置,下面是其结构定义:

typedef struct XLogRecPtr

{

    uint32      xlogid ;           /* 逻辑 XLOG 日志文件 ID ,从 0 开始 */

    uint32      xrecoff ;      /* XLOG 日志文件里的字节偏移量 */

} XLogRecPtr ;

 

注意:这儿容易引起理解错乱,这个 xlogid (对应实际 XLOG 文件名字的中间八位)表示逻辑 XLOG 日志文件 ID ,因为组成 XLOG 逻辑文件的实际物理文件远小于 4Gb 。组成对应这个 xlogid 的逻辑日志文件的每一个实际物理文件是一个 XLogSegSize 字节大小的“段”( "segment" ,段号是实际 XLOG 文件名字的后八位)。前面加上用八位表示的一个时间线 ID 、逻辑日志文件号和段号一起标识一个物理的 XLOG 日志文件(“段”)。段号和物理文件里的偏移量由 xrecoff/XLogSegSize xrecoff%XLogSegSize 计算。

 

checkPoint 表示最后的检查点记录指针、 prevCheckPoint 表示最后检查点的前一个检查点记录指针、 minRecoveryPoint 表示数据库从归档恢复的时候的最小恢复点、 backupStartPoint 表示数据库从备份恢复的时候的备份起始点。

 

 ------------
转载请著明出处,来自博客:
blog.csdn.net/beiigang
beigang.iteye.com

0
5
分享到:
评论

相关推荐

    PostgreSQL 存储体系结构

    本文档将通过一系列的图片和示例,深入探讨PostgreSQL的内部存储结构,主要包括内部存储方式、索引结构以及系统表之间的关系等内容。 #### 二、内部存储方式 PostgreSQL的存储结构主要分为以下几个层次: 1. **...

    postgresql第二课:体系结构和特色用法1

    【PostgreSQL 体系结构与特色】 PostgreSQL,作为大数据时代备受推崇的数据库系统,是由加州大学伯克利分校计算机系于90年代开发的。这个学府同样孕育了如Spark这样的大数据处理框架,其在数据库领域的影响力...

    PostgreSQL 存储结构1

    PostgreSQL 是一个强大的开源关系型数据库管理系统,其存储结构对于理解和优化数据库性能至关重要。本文将深入探讨 PostgreSQL 的存储结构,特别是“Heap File”,也就是堆表。 堆表是 PostgreSQL 中存储数据的基本...

    Postgresql之体系结构篇

    文件分布体系结构: 在服务器端,PostgreSQL的数据文件和配置文件有其特定的存储位置和结构。数据文件通常保存在数据目录中,其中包括基础文件、临时文件、索引文件、表文件等。配置文件则包含了控制服务器行为的...

    2023最新临时文件上传存储分享系统 临时文件网盘系统源码

    对于开发者来说,这个源码是一个很好的学习资源,可以帮助理解文件存储系统的实现细节,提升Web开发能力。同时,也可根据实际需求,对源码进行二次开发,定制符合特定业务场景的服务。 总的来说,这款2023年最新...

    PostgreSQL博客1

    PostgreSQL是一款开源的关系型数据库管理系统(RDBMS),以其强大的功能、高度的可扩展性和稳定性而受到广泛赞誉。它支持SQL标准,并提供丰富的数据类型和高级编程接口,使得开发者能够构建复杂的应用程序。 **...

    postgresql--内核分析--多进程结构

    当这些代码经过编译、链接等步骤形成可执行文件,并在操作系统中运行起来后,就被赋予了一个新的身份——进程。进程不仅包含了程序的代码,还包括了数据、内存映射以及操作系统为其分配的资源等。 **进程创建**: - ...

    非结构化数据的存储

    文件存储(如NFS、CIFS)保留了文件系统的层次结构,适合存储和共享文件。NoSQL数据库(如MongoDB、Cassandra)则提供了一种灵活的数据模型,可以存储半结构化或非结构化数据,适用于处理大规模、高性能的数据场景。...

    PostgreSQL_原理简介

    - **文件存储 (File Storage)**:包括数据文件、索引文件等。 - **实用工具进程 (Utility Processes)**:如备份、恢复等特殊任务。 #### 二、进程结构 PostgreSQL 采用的是“每个用户一个进程”的模型。这是因为:...

    PostgreSQL DBA内部培训讲义

    3. PostgreSQL逻辑存储结构: 在PostgreSQL中,数据库(Database)指的是存储数据和相关对象的物理文件集合。实例(Instance)是操作系统进程的一系列集合以及这些进程所管理的内存区域。集群(Cluster)则是指一组...

    顶级PostgreSQL DBA日常工作分享

    PostgreSQL是一个开放源代码的对象关系数据库系统(ORDBMS),它具有强大的功能和灵活性,支持广泛的SQL标准,并且能够处理大量的数据。作为一个开源数据库,PostgreSQL拥有活跃的社区和丰富的文档资源。 DBA...

    Postgresql之体系结构全掌握

    PostgreSQL是一种开源的对象关系型数据库管理系统,其体系结构复杂而精细,旨在提供高效、稳定且功能丰富的数据存储和管理解决方案。以下将详细解析PostgreSQL的主要组成部分及其作用。 1. **核心组件** - **...

    postgresql

    PostgreSQL是一种开源的对象关系型数据库管理系统(ORDBMS),它以其强大的功能、高度的稳定性、良好的社区支持和丰富的数据类型而闻名。标题“postgresql”直接指出了我们要讨论的主题,即PostgreSQL数据库系统。...

    postgresql-cmd-12.0.zip

    数据库管理系统(DBMS)是用于存储和管理数据的应用程序,而PostgreSQL作为一款DBMS,支持多种数据类型,如字符串、整数、浮点数、日期/时间、二进制数据以及自定义类型。它还支持事务处理,确保数据的一致性和完整...

    postgresql 12、15离线安装包

    PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性和可靠性而受到全球开发者的广泛赞誉。在标题和描述中提到的“postgresql 12、15离线安装包”指的是为这两个版本提供的安装程序,适用于没有互联网...

    postgresql离线一键安装

    PostgreSQL是一种开源的关系型数据库管理系统,因其强大、稳定和灵活的特性而被广泛使用。离线安装意味着在没有网络连接的情况下进行安装,这对于网络环境受限或者安全要求较高的环境尤其重要。 【描述】:描述中...

    postgresql-9.1.11-1-windows-binaries

    PostgreSQL 是一个强大的开源关系型数据库管理系统,以其稳定性和丰富的功能在IT行业内备受推崇。这里的“postgresql-9.1.11-1-windows-binaries”指的是PostgreSQL的9.1.11版本针对Windows操作系统的二进制发行版,...

Global site tag (gtag.js) - Google Analytics