`

PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境

 
阅读更多

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

 

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

    下面讨论第( 5 )步, RelationCacheInitialize 方法初始化管理 relcache 相关对象。   Relcache 是存放用户定义表的模式信息的地方 为了图能大一点, PostgresMain 以前的调用流程序列就从下面的图中省略了,要回顾可以参考上面的“ InitPostgres 方法的调用序列梗概图 ”。



RelationCacheInitialize 方法的调用序列图

 

RelationCacheInitialize 方法里首先调用 CreateCacheMemoryContext 方法创建了内存上下文 "CacheMemoryContext" 。然后调用 hash_create 方法先创建了内存上下文 "Relcache by OID" ,然后在该内存上下文里创建了管理 relcache 里个关系 schema 的同名哈西表 "Relcache by OID"

 

下面是管理 relcache 的哈西表 "Relcache by OID" 的图和相关结构定义:
 

 

管理 relcache 的哈西表 ”Relcache by OID”

 

typedef struct relidcacheent

{

    Oid         reloid ;

    Relation    reldesc ;

} RelIdCacheEnt ;

 

接着调用 RelationMapInitlize 方法将记录关系和对应的文件节点的 RelMapFile 类型各变量初始化为 0 ,因为现在我们不能访问数据库,还没有加载数据库相关的基础设施。这些变量包括:

static RelMapFile shared_map ;

static RelMapFile local_map;

 

static RelMapFile active_shared_updates;

static RelMapFile active_local_updates;

static RelMapFile pending_shared_updates;

static RelMapFile pending_local_updates;

相关结构和图形见下面:

typedef struct RelMapping

{

    Oid         mapoid ;           /* OID of a catalog */

    Oid         mapfilenode ;  /* its filenode number */

} RelMapping ;

 

typedef struct RelMapFile

{

    int32       magic ;        /* always RELMAPPER_FILEMAGIC 总是文件映射器版本 */

    int32       num_mappings ; /* number of valid RelMapping entries */

    RelMapping mappings [MAX_MAPPINGS];

    int32       crc ;          /* CRC of all above */

    int32       pad ;          /* to make the struct size be 512 exactly */

} RelMapFile ;

 

 

RelMapFile 结构图

 

    就到这儿吧,下接接着讨论 postgres 访问进程的后续初始化 catcache portalManager 等操作。



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

 


0
4
分享到:
评论

相关推荐

    postgres-42.2.5 jar包

    postgres-42.2.5 jar包是PostgreSQL数据库管理系统的一个特定版本的Java存档(JAR)文件。PostgreSQL是一种开源的关系型数据库系统,它以其强大的功能、稳定性以及高度的可扩展性而受到广大开发者的青睐。这个jar包...

    postgresql-42.3.3-API文档-中文版.zip

    赠送jar包:postgresql-42.3.3.jar; 赠送原API文档:postgresql-42.3.3-javadoc.jar; 赠送源代码:postgresql-42.3.3-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    PostgreSQL学习笔记搭建了Postgres在Windows上的编译调试环境.doc

    - "postgres":处理客户端连接,每个连接会启动一个新的postgres后台服务进程。 通过以上步骤,你将具备在Windows环境下分析PostgreSQL源代码的基础。持续学习和实践,结合相关书籍和文档,将有助于深入理解这个...

    postgres_exporter-0.9.0.linux-amd64.tar.gz

    它是一个独立的服务,运行在与PostgreSQL服务器相同的网络环境中,可以安全地访问数据库。通过配置,Postgres Exporter能够定期执行SQL查询,将查询结果转化为Prometheus可读的metrics。这些metrics可以包括数据库的...

    Rails.Angular.Postgres.and.Bootstrap.2nd.Edition

    Embrace the full stack of web development, from styling with Bootstrap, building an interactive user interface with Angular 2, to storing data quickly and reliably in PostgreSQL. With this fully ...

    Ubuntu 下源码安装Postgresql

    五、初始化数据库 安装完成后,需要初始化数据库。首先,切换到 Postgresql 的安装目录下,然后创建一个名为 PGDATA 的目录,并在该目录下创建一个名为 postgres 的目录: cd $PostgresqlPath/bin mkdir PGDATA ...

    PostgreSQL(postgresql-13.5.tar.bz2)

    PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现...

    PyPI 官网下载 | dbnd-postgres-0.53.5.tar.gz

    在云原生环境下,dbnd-postgres可能利用了容器化技术来封装和隔离运行环境,确保代码在不同环境中的一致性。此外,通过服务发现机制,它能够在动态变化的网络环境中找到并连接到PostgreSQL实例。同时,可能还采用了...

    PostgreSQL中文手册9.2

    一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: 一、服务器进程的启动和关闭: . 50 PostgreSQL PostgreSQL...

    postgresql12.3-glibc-2.28-aarch64.tar.gz.gz

    6. 启动服务:使用系统服务管理工具(如`systemd`或`sysvinit`)启动PostgreSQL服务器。 7. 配置和安全管理:设置防火墙规则,创建用户和数据库,调整性能参数,启用SSL加密等。 这个压缩包对于那些在ARM架构上运行...

    jeecgboot(postgreSQL).pdf

    PostgreSQL 是一个功能强大且免费的开源关系数据库管理系统。本文将指导您如何将 Jeecgboot 与 PostgreSQL 集成,以便更好地使用 PostgreSQL 的强大功能。 1. 更改数据源 要将 Jeecgboot 集成到 PostgreSQL,需要...

    postgres-REL_14_5.tar.gz

    6. 初始化数据库集群。 7. 配置服务器参数(如 "postgresql.conf")。 8. 创建并设置用户权限。 9. 启动 PostgreSQL 服务。 为了充分利用 PostgreSQL 14.5,开发者和数据库管理员应该熟悉 SQL 语言、PostgreSQL 的...

    postgres9.6 离线安装部署(centos7.x)

    PostgreSQL 9.6 离线安装部署在 CentOS 7.x 操作系统上是一项关键任务,尤其对于那些没有互联网连接或者网络环境受限的环境。离线安装允许管理员提前下载所有必需的文件,并在本地进行安装,避免了在线安装过程中...

    nacos支持postgres

    4. **启动Nacos**:配置完成后,重新启动Nacos服务,它将尝试连接到配置的PostgreSQL数据库并进行初始化操作。如果一切配置正确,Nacos将能够成功启动并使用PostgreSQL作为其数据存储。 5. **注意事项**:虽然Nacos...

    PyPI 官网下载 | dbnd-postgres-0.29.1.tar.gz

    PostgreSQL,通常简称为Postgres,是一种开源的对象关系型数据库管理系统(RDBMS)。它以其强大的功能、高度的稳定性和良好的ACID(原子性、一致性、隔离性、持久性)特性而受到广泛赞誉。Postgres支持多种编程语言...

    postgres中文文档.pdf

    随着Ingres的商业化,研究团队决定开发一个新的系统,最终形成了PostgreSQL的前身——Postgres95。自1996年起,PostgreSQL由全球开发团队维护,并持续更新至今。 - **版权**:PostgreSQL的版权归属于1996-2013年间的...

    PyPI 官网下载 | dbnd-postgres-0.32.5.tar.gz

    dbnd-postgres库是Data and Business Nervous System (dbnd)项目的一部分,dbnd是一个自动化数据任务管理框架,它提供了一种声明式的方式来定义、执行和监控数据任务。dbnd-postgres库是dbnd框架与PostgreSQL数据库...

    C#连接Postgresql的两个dll文件:Npgsql.dll Mono.Security.dll

    在.NET开发环境中,C#是一种常用的编程语言,而PostgreSQL是一种功能强大、开源的关系型数据库管理系统。当需要在C#应用程序中与PostgreSQL数据库进行交互时,就需要借助于特定的库来实现。在这个场景中,"Npgsql....

    centos7下Postgres13安装包带依赖,附安装脚本

    如果`install_postgres.sh`是安装脚本,那么执行此脚本会自动化整个安装过程,包括配置、初始化数据库以及启动服务。这个脚本可能会包含以下步骤: 1. 检查系统环境和依赖。 2. 安装或更新缺失的依赖。 3. 解压或...

    postgresql-embedded,嵌入式PostgreSQL服务器.zip

    这个项目的目的是简化在各种开发环境中的集成工作,特别是在进行单元测试时,可以轻松地启动和停止数据库实例,便于进行数据初始化、测试执行和清理。 【压缩包子文件的文件名称列表】中提到的"postgresql-embedded...

Global site tag (gtag.js) - Google Analytics