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 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中;请注意,PG_CONTROL_VERSION
直到99dd8b05才更新)
PostgreSQL 9.4
添加以下字段
int max_worker_processes;
(提交6bc8ef0b)
恢复pg_control
在pg_control
损坏的极不可能的情况下,可能可以使用pg_resetwal(PostgreSQL 9.6及更早版本:pg_resetxlog)恢复它。
参考文献
- PostgreSQL文档: WAL内部机制
- PostgreSQL文档: 控制数据函数 - PostgreSQL 9.6及更高版本