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
文件的结构由头文件 src/include/catalog/pg_control.h 中包含的结构 ControlFileData
定义,即使它不是堆关系。
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 中的注释。该文件用零填充以减少提前 EOF 错误的可能性(请参阅 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 及更高版本