`

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

阅读更多

 

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

 

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

    下面讨论第( 7 )步, EnablePortalManager 方法初始化 portal 的管理环境。 portal 表示一个正在运行或可运行 query 的执行状态的抽象,具体情况到后续《 pg 服务过程中的那些事二》讨论 pg 处理简单查询时再具体讨论。 EnablePortalManager 方法先调用 AllocSetContextCreate 方法创建内存上下文 "PortalMemory" ,然后调用 hash_create 在这个内存上下文里创建 哈西表 "Portal hash" 。“ EnablePortalManager 调用序列图”见下面,为了图能大一点, PostgresMain 以前的调用流程序列就从下面的图中省略了,要回顾可以参考上面的“ InitPostgres 方法的调用序列梗概图 ”。

 

 

EnablePortalManager 调用序列图

 

Portal 是指向 PortalData 结构的指针类型。相关定义和结构图见下面。

typedef struct PortalData * Portal ;

 

typedef struct PortalData

{

    /* Bookkeeping data */

    const char * name ;        /* portal's name */

    const char * prepStmtName ;   /* source prepared statement (NULL if none) */

    MemoryContext heap ;         /* subsidiary memory for portal */

    ResourceOwner resowner ;     /* resources owned by portal */

    void        (* cleanup ) ( Portal portal);     /* cleanup hook */

    SubTransactionId createSubid ;      /* the ID of the creating subxact */

 

    /*

      * if createSubid is InvalidSubTransactionId, the portal is held over from

      * a previous transaction

      */

 

    /* The query or queries the portal will execute */

    const char * sourceText ;     /* text of query (as of 8.4, never NULL) */

    const char * commandTag ;     /* command tag for original query */

    List       * stmts ;        /* PlannedStmts and/or utility statements */

    CachedPlan * cplan ;          /* CachedPlan, if stmts are from one */

 

    ParamListInfo portalParams ; /* params to pass to query */

 

    /* Features/options */

    PortalStrategy strategy ; /* see above */

    int         cursorOptions ;    /* DECLARE CURSOR option bits */

 

    /* Status data */

    PortalStatus status ;     /* see above */

    bool        portalPinned ; /* a pinned portal can't be dropped */

 

    /* If not NULL, Executor is active; call ExecutorEnd eventually: */

    QueryDesc   * queryDesc ;       /* info needed for executor invocation */

 

    /* If portal returns tuples, this is their tupdesc : */

    TupleDesc   tupDesc ;      /* descriptor for result tuples */

    /* and these are the format codes to use for the columns: */

    int16      * formats ;      /* a format code for each column */

 

    /*

      * Where we store tuples for a held cursor or a PORTAL_ONE_RETURNING or

      * PORTAL_UTIL_SELECT query.  (A cursor held past the end of its

      * transaction no longer has any active executor state.)

      */

    Tuplestorestate * holdStore ; /* store for holdable cursors */

    MemoryContext holdContext ;  /* memory containing holdStore */

 

    /*

      * atStart, atEnd and portalPos indicate the current cursor position.

      * portalPos is zero before the first row, N after fetching N'th row of

      * query.  After we run off the end, portalPos = # of rows in query, and

      * atEnd is true.  If portalPos overflows, set posOverflow (this causes us

      * to stop relying on its value for navigation).  Note that atStart

      * implies portalPos == 0, but not the reverse (portalPos could have

      * overflowed).

      */

    bool        atStart ;

    bool        atEnd ;

    bool        posOverflow ;

    long        portalPos ;

 

    /* Presentation data, primarily used by the pg_cursors system view */

    TimestampTz creation_time ;  /* time at which this portal was defined */

    bool        visible ;      /* include this portal in pg_cursors? */

}   PortalData ;

 

#define NAMEDATALEN 64

 

#define MAX_PORTALNAME_LEN       NAMEDATALEN

 

typedef struct portalhashent

{

    char        portalname [MAX_PORTALNAME_LEN ];

    Portal      portal ;

} PortalHashEnt ;

 

static HTAB *PortalHashTable = NULL;



管理 portal PostalHashTable

 

 

 

 

 

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

  • 大小: 37.4 KB
  • 大小: 80.1 KB
0
2
分享到:
评论

相关推荐

    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

    七、初始化数据库目录 使用 initdb 命令初始化数据库目录: ./initdb -D PGDATA/postgres 八、启动数据库 使用以下命令启动数据库: ./postgres -D PGDATA/postgres 九、配置开机启动 为了使数据库在开机时...

    PostgreSQL(postgresql-13.5.tar.bz2)

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

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

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

    PostgreSQL中文手册9.2

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

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

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

    jeecgboot(postgreSQL).pdf

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

    nacos支持postgres

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

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

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

    postgres中文文档.pdf

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

    postgres-REL_14_5.tar.gz

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

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

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

    Postgres.app ( PostgreSQL Server App on the Mac )

    在Mac操作系统上轻松启动和管理PostgreSQL数据库服务器,Postgres.app提供了一种便捷的方式。PostgreSQL,通常简称为Postgres,是一种强大的开源关系型数据库管理系统(RDBMS),因其高度可扩展性、稳定性以及支持...

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

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

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

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

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

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

Global site tag (gtag.js) - Google Analytics