pg_control
pg_control 是一个8KB的二进制文件,它存储了关于PostgreSQL服务器内部状态的各种信息,例如最近的检查点,以及由initdb设置的基本参数。它位于集群的global/目录中。
pg_control是在PostgreSQL 7.1中添加的(提交4d14fe00)。
客户端工具pg_controldata(以及带有-n/--dry-run选项的pg_resetwal)可以显示pg_control文件的内容。从PostgreSQL 9.6开始,以下SQL函数也可以用于从文件中提取信息
pg_control_checkpoint()(关于当前检查点状态的信息)pg_control_system()(关于当前控制文件状态的信息)pg_control_init()(关于集群初始化状态的信息)pg_control_recovery()(关于恢复状态的信息)
源代码
pg_control文件的名称由src/include/access/xlog_internal.h中的XLOG_CONTROL_FILE定义。
pg_control文件的结构由ControlFileData结构定义,该结构包含在头文件src/include/catalog/pg_control.h中,尽管它不是一个系统目录关系。
pg_control文件的大小由PG_CONTROL_FILE_SIZE(也在src/include/catalog/pg_control.h中;PostgreSQL 9.6及更早版本:PG_CONTROL_SIZE)定义,当前为8192字节。然而,实际内容(由ControlFileData结构定义)旨在不超过512字节,以适应典型的磁盘驱动器扇区;请参阅src/include/catalog/pg_control.h中的注释。该文件用零填充以降低过早到达文件末尾错误的发生概率(请参阅src/backend/access/transam/xlog.c中函数WriteControlFile()的注释)。
格式变更
从一个版本到下一个版本,pg_control文件的格式可能会发生变化。这是自PostgreSQL 9.4以来ControlFileData和CheckPoint结构的变化列表。
PostgreSQL 18
添加了以下字段
bool default_char_signedness;(提交44fe30fd)
PostgreSQL 12
添加了以下字段
int max_wal_senders;(提交ea92368c)
删除了以下字段
uint32 nextXidEpoch; /* nextXid 的高位字节 */TransactionId nextXid; /* 下一个空闲 XID */
并替换为
FullTransactionId nextFullXid; /* 下一个空闲完整事务 ID */
(提交2fc7af5e)
PostgreSQL 11
删除了以下字段
XLogRecPtr prevCheckPoint;(提交4b0d28de)
PostgreSQL 10
添加了以下字段
char mock_authentication_nonce[MOCK_AUTH_NONCE_LEN];(提交818fd4a6)
PostgreSQL 9.5
添加了以下字段
bool track_commit_timestamp;
此外,CheckPoint结构添加了以下字段
TransactionId oldestCommitTsXid; /* 具有有效提交时间戳的最旧 Xid */TransactionId newestCommitTsXid; /* 具有有效提交时间戳的最新 Xid */
(所有更改均在提交73c986ad中;请注意,直到提交99dd8b05才增加了PG_CONTROL_VERSION)
PostgreSQL 9.4
添加了以下字段
int max_worker_processes;(提交6bc8ef0b)
恢复pg_control
在pg_control可能损坏的极少数情况下,可能可以使用pg_resetwal(PostgreSQL 9.6及更早版本:pg_resetxlog)来恢复它。
参考资料
- PostgreSQL documentation: WAL Internals
- PostgreSQL documentation: Control Data Functions - PostgreSQL 9.6 及更高版本
