`

PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache

阅读更多

         话说调用 InitPostgres 方法给 portgres 服务进程做相关初始化,这个方法里初始化了 relcache catcache ,初始化了执行查询计划的 portal 的管理器,填充本进程 PGPROC 结构相关部分成员等,上一节讨论了 relcache 管理环境的初始化,这一节继续讨论 catcache 的初始化。

 

1

先看 InitPostgres 方法的调用序列梗概图


 

InitPostgres 方法的调用序列梗概图

         InitPostgres 方法为初始化这个 postgres 服务进程做了一系列的工作,具体如下:

1 )调用 InitProcessPhas e2 方法,把本进程的 PGPROC 结构注册到 PGPROC 数组,就是让 共享内存里的 PGPROC 数组( 初始化 PGPROC 数组的文章见《 PostgreSQL 启动过程中的那些事七:初始化共享内存和信号十一: shmem 中初始化 SharedProcArray )的第一个空元素指向这个 PGPROC 结构 ,并注册退出时做内存清理的函数。

2 )调用 SharedInvalBackendInit 方法,在该后台进程数据的 共享失效管理器数组获取一个 ProcState 结构(相关数据结果见《 PostgreSQL 启动过程中的那些事七:初始化共享内存和信号十三: shmem 中初始化 SharedInvalidationState 》)给该进程并初始化相关项,并注册退出方法以在退出时标记本进程的项非活跃。

3 )调用 ProcSignalInit 方法, ProcSignalSlot 结构 数组(关于 ProcSignalSlot 结构 数组参见《 PostgreSQL 启动过程中的那些事七:初始化共享内存和信号十四: shmem 中初始化 PMSignal 》) ProcSignalSlot s 里给当前进程获取一个元素,元素下标是 MyBackendId-1 ,并注册以在进程退出时释放这个槽。

4 )为访问 XLOG ,调用 RecoveryInProgress 方法做共享内存相关初始化。

5 )调用 RelationCacheInitlisze 方法做管理 relcache 的环境的初始化。

6 )调用 InitCatalogCache 方法做管理 catcache 的环境的初始化。

7 )调用 EnablePortalManager 方法初始化 portal 管理器。

8 )调用 RelationCacheInitializePhase2 方法初始化共享系统表。

9 )调用 GetTransactionSnapshot 方法获取一个事务快照。这个方法在后面讨论简单查询时再讨论。

10 )调用 PerformAuthentication 方法根据 hba 文件设置进行客户端认证。

11 )调用 GetDatabaseTuple 方法根据数据库名字从 pg_database 系统表获取要访问的数据库对应的元组。

12 )调用 RelationCacheInitializePhase3 方法完成 relcache 初始化。

13 )调用 CheckMyDatabase 方法检查当前用户的数据库访问权限,从 cache 里的 pg_database 取当前数据库的相关属性字段。

14 )调用 InitializeClientEncoding 方法初始化客户端字符编码。

15 )调用 pgstat_bestart 方法在 PgBackendStatus 设置本进程状态。

 

2

下面讨论第( 6 )步, InitCatalogCache 方法初始化 relcache 相关对象。 Relcache 是存放系统表元组的地方。为了图能大一点, PostgresMain 以前的调用流程序列就从下面的图中省略了,要回顾可以参考上面的“ InitPostgres 方法的调用序列梗概图 ”。

 


相关方法调用序列图

 

InitCatalogCache -> InitCatCache -> MemoryContextSwitchTo 将内存上下文切换到 "CacheMemoryContext" ,然后 InitCatalogCache -> InitCatCache -> palloc 在内存上下文 "CacheMemoryContext" 里分配管理 catcache 的相关结构。相关结构和图形见下面。

 

定义一个 syscache 的信息

struct cachedesc

{

    Oid         reloid ;           /* OID of the relation being cached */

    Oid         indoid ;           /* OID of index relation for this cache */

    int         nkeys ;        /* # of keys needed for cache lookup */

    int         key [4];           /* attribute numbers of key attrs */

    int         nbuckets ;     /* number of hash buckets for this cache */

};

 

static const struct cachedesc cacheinfo [] = {

    {AggregateRelationId,       /* AGGFNOID */

       AggregateFnoidIndexId,

       1,

       {

           Anum_pg_aggregate_aggfnoid,

           0,

           0,

           0

       },

       32

    },

    …… ,

…… ,

…… ,

    {UserMappingRelationId,     /* USERMAPPINGOID */

       UserMappingOidIndexId,

       1,

       {

           ObjectIdAttributeNumber,

           0,

           0,

           0

       },

       128

    },

    {UserMappingRelationId,     /* USERMAPPINGUSERSERVER */

       UserMappingUserServerIndexId,

       2,

       {

           Anum_pg_user_mapping_umuser,

           Anum_pg_user_mapping_umserver,

           0,

           0

       },

       128

    }

};

 

 

typedef struct catcache

{

    int         id ;           /* cache identifier --- see syscache.h */

    struct catcache * cc_next ;   /* link to next catcache */

    const char * cc_relname ;     /* name of relation the tuples come from */

    Oid         cc_reloid ;    /* OID of relation the tuples come from */

    Oid         cc_indexoid ;  /* OID of index matching cache keys */

    bool        cc_relisshared ; /* is relation shared across databases? */

    TupleDesc   cc_tupdesc ;       /* tuple descriptor (copied from reldesc ) */

    int         cc_ntup ;      /* # of tuples currently in this cache */

    int         cc_nbuckets ;  /* # of hash buckets in this cache */

    int         cc_nkeys ;     /* # of keys (1..CATCACHE_MAXKEYS) */

    int         cc_key [CATCACHE_MAXKEYS];       /* AttrNumber of each key */

    PGFunction cc_hashfunc [CATCACHE_MAXKEYS];  /* hash function for each key */

    ScanKeyData cc_skey [CATCACHE_MAXKEYS];    /* precomputed key info for

                                            * heap scans */

    bool        cc_isname [CATCACHE_MAXKEYS];    /* flag "name" key columns */

    Dllist      cc_lists ;     /* list of CatCList structs */

#ifdef CATCACHE_STATS

    long        cc_searches;  /* total # searches against this cache */

    long        cc_hits;      /* # of matches against existing entry */

    long        cc_neg_hits;  /* # of matches against negative entry */

    long        cc_newloads;  /* # of successful loads of new entry */

 

    /*

      * cc_searches - (cc_hits + cc_neg_hits + cc_newloads) is number of failed

      * searches, each of which will result in loading a negative entry

      */

    long        cc_invals;    /* # of entries invalidated from cache */

    long        cc_lsearches; /* total # list-searches */

    long        cc_lhits;     /* # of matches against existing lists */

#endif

    Dllist      cc_bucket [1]; /* hash buckets --- VARIABLE LENGTH ARRAY */

} CatCache ;                     /* VARIABLE LENGTH STRUCT */

 

       struct catcacheheader :   管理所有 cache 的信息 .

typedef struct catcacheheader

{

    CatCache    * ch_caches ;       /* head of list of CatCache structs */

    int         ch_ntup ;      /* # of tuples in all caches */

} CatCacheHeader ;

 


catcache 和管理它的相关结构图

         系统表和 SysCache 中的 catcache 一一对应。静态数组 cacheinfo 的元素 cachedesc 描述系统表的 catcache 信息。系统表中的元组存放在 catcache 的双向链表数组 cc_bucket 的元素 Dllist 里。




------------
转载请著明出处,来自博客:
blog.csdn.net/beiigang
beigang.iteye.com


  • 大小: 95.6 KB
  • 大小: 41.4 KB
  • 大小: 75.6 KB
0
1
分享到:
评论

相关推荐

    postgresql安装包

    PostgreSQL是一种开源的对象关系型数据库管理系统(ORDBMS),它以其强大的功能、高度的稳定性、良好的社区支持和丰富的数据类型而受到全球开发者的青睐。在本文中,我们将深入探讨PostgreSQL的安装过程,以及如何...

    postgresql-11.0.tar.gz

    3. **初始化数据库**:安装完成后,使用`initdb`命令创建一个新的数据库集群,这是PostgreSQL运行的基础。你可以通过指定数据存储路径、字符集等参数来自定义初始化。 4. **启动与停止服务**:PostgreSQL服务器可以...

    PostGreSQL安装部署系列:Centos 7.9 安装指定PostGreSQL-15版本数据库

    初始化数据库是PostgreSQL安装过程中必不可少的一步,可以通过执行以下命令完成: ```bash sudo /usr/pgsql-15/bin/postgresql-15-setup initdb ``` 初始化完成后,将会创建数据库目录并设置默认权限。 ##### 3.4...

    使用Druid数据连接池连接PostgreSQL简单例子

    在这个过程中,Druid会根据配置自动初始化并管理连接池,当应用程序需要连接时,可以从池中获取;使用完毕后,连接会被返回到池中,以便后续使用。这种管理模式既提高了程序运行效率,也降低了数据库的压力。 通过...

    MySQL和PostgreSQL的比较

    一个实例同样可以管理多个数据库,但这些数据库被组织成一个集群,存储在一个初始化时设定的磁盘区域中,该区域由一个目录构成,存储着所有数据。首次数据库创建则通过`initdb`命令完成。值得注意的是,PostgreSQL也...

    postgresql-9.2.24-1-windows-binaries.zip

    4. **初始化数据库**:使用`initdb`命令创建一个新的数据目录,然后使用`pg_ctl`启动服务。 5. **安全性**:为默认的`postgres`超级用户设置强密码,并考虑启用SSL加密连接以提高安全性。 总之,"postgresql-9.2.24...

    PostgreSQL 架构介绍1

    当创建如表、视图、过程、函数等数据对象时,默认情况下会被放置在一个名为 `public` 的模式中。 例如,以下命令展示了如何查看当前用户能够访问的所有模式: ```sql postgres@[local]:1921=# \dn ``` 一个连接只能...

    Postgresql之体系结构全掌握

    PostgreSQL是一种开源的对象关系型数据库管理系统,其体系结构复杂而精细,旨在提供高效、稳定且功能丰富的数据存储和管理解决方案。以下将详细解析PostgreSQL的主要组成部分及其作用。 1. **核心组件** - **...

    postgresql数据库源码包

    - **权限**:某些操作可能需要管理员权限,如写入系统目录或启动服务。 - **配置选项**:根据你的需求选择合适的编译选项,如启用或禁用特定功能,设置端口号,配置数据存储位置等。 3. **部署与初始化** - **...

    linux postgresql-9.5.4

    **Linux系统下的PostgreSQL 9.5.4详解** PostgreSQL是一种开源的对象关系数据库管理系统(ORDBMS),在Linux平台上广泛使用。版本9.5.4是 PostgreSQL 的一个稳定版本,它提供了许多增强功能和优化,以提升性能、...

    postgresql-ha镜像补充

    在IT行业中,数据库管理系统是核心组件之一,而PostgreSQL作为一款开源的关系型数据库,因其强大的功能和稳定性,被广泛应用于各种场景。特别是在集群环境中,为了实现高可用性(HA),PostgreSQL的高可用解决方案...

    postgresql-11.2-1-windows-x64.rar

    3. **服务配置**:安装过程中会创建一个名为`postgresql-x64-11.2`的服务,该服务会在系统启动时自动运行,确保数据库系统始终可用。 4. **权限问题**:在Windows 10中,由于更严格的权限控制,可能会出现`icacls`...

    postgresql内核源码调用思维导图

    这包括初始化进程、后台进程的启动以及内存结构的设置。"postgresSQL程序结构图-v8-wangteacher-v1.0.xmind"这份思维导图可能详细描绘了这些步骤,其中的“xmind”标签表明这是一个可视化表示,有助于我们直观地理解...

    postgres-15.2-1-windows-x64

    PostgreSQL 是一个强大的开源对象关系数据库系统,以其稳定性和丰富的功能而受到全球开发者的广泛欢迎。"postgres-15.2-1-windows-x64" 是 PostgreSQL 的一个针对 Windows 操作系统的64位版本,其版本号为15.2。这个...

    pg12.2+pgpool4.3.2 for Centos7安装包及依赖包

    2. 安装PostgreSQL 12.2服务器,配置数据目录和初始化数据库。 3. 设置PostgreSQL服务启动和自动启动。 4. 配置PgPool-II,包括连接池大小、监听端口、数据库连接信息等。 5. 启动PgPool-II服务,并检查其与...

    基于podman-compose的jumpserver v3.1.1单机部署配置

    4. **启动服务** - 使用`podman-compose up -d`命令启动所有服务,`-d`参数表示在后台运行。 - podman-compose会自动处理服务间的依赖关系,如先启动PostgreSQL,再启动Jumpserver。 5. **验证部署** - 访问配置...

    Redash部署教程-CentOS7-去除访问凭据-20220526-JasonLee

    1. 初始化并启动 PostgreSQL 数据库服务: ``` sudo systemctl start postgresql sudo systemctl enable postgresql ``` 2. 创建 Redash 用户和数据库: ``` sudo -u postgres psql CREATE DATABASE redash; CREATE...

    centos7 下安装odoo8

    在 CentOS7 系统上安装 Odoo 8 这个过程涉及到多个步骤,包括系统更新、配置 YUM 源、安装 PostgreSQL 数据库、安装 EPEL 和 yum-utils、部署必要的依赖包,以及最终的 Odoo 服务安装与配置。下面我们将详细探讨这些...

    tbase单机版安装介质

    运行TBase的启动脚本(如`postgres`或`tbase_server`),启动数据库服务。检查日志文件确认服务是否成功启动。 8. **连接与验证** 使用客户端工具(如`psql`)连接到TBase,验证安装是否成功。可以通过查询系统表...

    PostgreSQL的架构

    1. Postmaster(Daemon) Process,这是PostgreSQL启动时第一个启动的主后台驻留进程,它负责恢复和初始化共享内存,启动后台进程,并在有客户端请求连接时创建后端进程。 2. Background Process,包括多个后台进程如...

Global site tag (gtag.js) - Google Analytics