Pg 控制文件pg_control里存储的数据是一个ControlFileData结构。控制文件尽量保持小于512个字节以使其适合一个典型的磁盘驱动的物理簇的大小。这会减少由于电源故障而写控制文件直接失败的可能性。但控制文件的物理大小是8K,这个远大于512个字节。这样做是为了控制文件格式变化时保持物理大小不变,如果正在读一个不兼容的文件,以使ReadControlFile能传递一个合适的错误版本控制文件信息而代替一个读错误。系统里定义了和自己匹配的控制文件版本变量PG_CONTROL_VERSION,启动时会做系统和控制文件的匹配校验。
1
控制文件里存储了唯一系统标识符、系统状态数据、数据库启动前系统必须恢复到的最小点、检查服务器硬件架构计算能力的字节排序和浮点数格式、数据库的配置兼容backend进程执行的参数、指明类型timestamp、interval、time内部格式的标志、指明不同类型传值(pass-by-value)状态的标志以及所有这些信息的经验和。具体见下面ControlFileData结构。
typedefstruct 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; /* seecatversion.h */
/*系统状态数据*/
DBState state; /* see enum above */
pg_time_t time; /* time stamp of last pg_control update */
XLogRecPtrcheckPoint; /* last check point record ptr*/
XLogRecPtrprevCheckPoint;/* previous check point recordptr */
CheckPointcheckPointCopy;/* copy of last check point record */
/*
这两个值确定数据库启动前我们必须恢复到的最小点:
我们在归档恢复期间刷出数据的时候