当前位置:数据库 > SQLServer >>

PostgreSQL启动过程中的那些事七:初始化共享内存和信号二:shmem中初始化xlog

 pg初始化完shmem,给其加上索引"ShmemIndex"后,接着就在shmem里初始化xlog。

1先上个图,看一下函数调用过程梗概,中间略过部分细节

 

\

 

初始化xlog方法调用流程图

 

2初始化xlog相关结构

        话说main()->…->PostmasterMain()->…->reset_shared() ->CreateSharedMemoryAndSemaphores()>…->XLOGSHmemInit(),初始化控制文件data/global/pg_control相关数据结构及事务日志xlog相关数据结构,相关结构定义在下面。

typedef struct ControlFileData

{

       /*

        * Unique system identifier --- to ensure wematch up xlog files with the

        * installation that produced them.

        */

       uint64           system_identifier;

 

       /*

        * Version identifier information.   Keep these fields at the same offset,

        * especially pg_control_version; they won't bereal useful if they move

        * around.   (Forhistorical reasons they must be 8 bytes into the file

        * rather than immediately at the front.)

        *

        * pg_control_version identifies the format ofpg_control itself.

        * catalog_version_no identifies the format ofthe system catalogs.

        *

        * There are additional version identifiers inindividual files; for

        * example, WAL logs contain per-page magic numbersthat can serve as

        * version cues for the WAL log.

        */

       uint32           pg_control_version;         /* PG_CONTROL_VERSION */

       uint32           catalog_version_no;        /* see catversion.h */

 

       /*

        * System status data

        */

       DBState        state;                   /*see enum above */

       pg_time_t    time;                    /*time stamp of last pg_control update */

       XLogRecPtr  checkPoint;        /*last check point record ptr */

       XLogRecPtr  prevCheckPoint; /* previous check point recordptr */

 

       CheckPoint checkPointCopy; /* copy of last check pointrecord */

 

       /*

        * These two values determine the minimum pointwe must recover up to

        * before starting up:

        *

        * minRecoveryPoint is updated to the latestreplayed LSN whenever we

        * flush a data change during archive recovery.That guards against

        * starting archive recovery, aborting it, andrestarting with an earlier

        * stop location. If we've already flushed datachanges from WAL record X

        * to disk, we mustn't start up until we reachX again. Zero when not

        * doing archive recovery.

        *

        * backupStartPoint is the redo pointer of thebackup start checkpoint, if

        * we are recovering from an online backup andhaven't reached the end of

        * backup yet. It is reset to zero when the endof backup is reached, and

        * we mustn't start up before that. A booleanwould suffice otherwise, but

        * we use the redo pointer as a cross-checkwhen we see an end-of-backup

        * record, to make sure the end-of-backuprecord corresponds the base

        * backup we're recovering from.

        */

       XLogRecPtr  minRecoveryPoint;

       XLogRecPtr  backupStartPoint;

 

       /*

        * Parameter settings that determine if the WALcan be used for archival

        * or hot standby.

        */

       int                 wal_level;

       int                 MaxConnections;

       int                 max_prepared_xacts;

       int                 max_locks_per_xact;

 

       /*

        * This data is used to check for hardware-architecturecompatibility of

        * the database and the backendexecutable.  We need not check endianness

        * explicitly, since the pg_control versionwill surely look wrong to a

        * machine of different endianness, but we doneed to worry about MAXALIGN

        * and floating-point format.  (Note: storage layout nominally also

        * depends on SHORTALIGN and INTALIGN, but inpractice these are the same

        * on all architectures of interest.)

       &nbs

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,