之前经常执行pg_controldata这个命令,来查看数据库是主库还是备库,还是一些日志回放路径
postgres@BJ-015908:/home/daihu/postgresql-14.7/src/bin/pg_controldata$ usr/local/pgsqldebug/bin/pg_controldata -D usr/local/pgsqldebug/data/
pg_control version number: 1300
Catalog version number: 202107181
Database system identifier: 7442158754952278802
Database cluster state: in production
pg_control last modified: Tue Mar 11 09:23:51 2025
Latest checkpoint location: 0/2C423B00
Latest checkpoint's REDO location: 0/2C423B00
Latest checkpoint's REDO WAL file: 00000001000000000000002C
Latest checkpoint's TimeLineID: 1
Latest checkpoint's PrevTimeLineID: 1
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID: 0:761
Latest checkpoint's NextOID: 40972复制
我其实就在想这个文件在哪里读取的,网上肯定有人会说,这个文件是读取的global/pg_control
这个文件,到这可能大部分人已经完事了,到此为止了,我想就知道它的执行过程,代码里都经历了什么,研究PG的周边,可能对我提前PG提高有帮助,仅此而已
下面记录我的研究过程,个人研究,just for fun
主要涉及如下两个文件
src/bin/pg_controldata/pg_controldata.c
src/common/controldata_utils.c复制
pg_controldata
1. 入口函数main 里面会判断环境变量里面有没有getenv(PGDATA)这个环境,没有的话需要我们自己传入,不传入会报错, 2. 拿到数据目录变量之后传入get_controlfile这个函数,这个函数会拼接路径读取 global/pg_control
读取完成之后返回一个结构体,这个结构休里面的数据,就是我们执行命令的大部分输出结果3. ControlFileData就是我们返回的结构体 4. pg_controldata输出展示
int
main(int argc, char *argv[])
{
if (DataDir == NULL)
{
if (optind < argc)
DataDir = argv[optind++];
else
DataDir = getenv("PGDATA");
}
ControlFile = get_controlfile(DataDir, &crc_ok);
WalSegSz = ControlFile->xlog_seg_size;
printf(_("pg_control version number: %u\n"),
ControlFile->pg_control_version);
printf(_("Catalog version number: %u\n"),
ControlFile->catalog_version_no);复制
controldata_utils
ControlFileData *
get_controlfile(const char *DataDir, bool *crc_ok_p)
{
ControlFileData *ControlFile;
int fd;
char ControlFilePath[MAXPGPATH];
pg_crc32c crc;
int r;
AssertArg(crc_ok_p);
ControlFile = palloc(sizeof(ControlFileData));
snprintf(ControlFilePath, MAXPGPATH, "%s/global/pg_control", DataDir);复制
结论
这个文件%s/global/pg_control
什么时候更新呢?它更新会有原子的保证吗?这个我们想过吗?
pg_dump
之后我们研究pg_dump这个小工具,它备份是如何做到备份集是一致性备份集的呢
文章转载自SmallDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。