暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

postgresql之命令pg_controldata源代码研究

SmallDB 2025-03-11
6

 

之前经常执行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. 1. 入口函数main 里面会判断环境变量里面有没有getenv(PGDATA)这个环境,没有的话需要我们自己传入,不传入会报错,
  2. 2. 拿到数据目录变量之后传入get_controlfile这个函数,这个函数会拼接路径读取global/pg_control
     读取完成之后返回一个结构体,这个结构休里面的数据,就是我们执行命令的大部分输出结果
  3. 3. ControlFileData就是我们返回的结构体
  4. 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论