`

PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:加载DB基础设施,完成服务进程初始化

阅读更多

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

这一节概论第 8 步到第 15 步。先看一下后续方法的调用序列图,为了图能大一点, PostgresMain 以前的调用流程序列就从下面的图中省略了,要回顾可以参考上面的“ InitPostgres 方法的调用序列梗概图 ”。



相关方法 调用序列图

 

下面讨论第( 8 )步, RelationCacheInitializePhase2 方法初始化共享 catalog 。先看一下为什么要有第( 5 )、( 8 )、( 12 )步三步来初始化 relcache 。当前还处在数据库服务器和客户端建立连接的过程中,数据库服务器的服务进程要根据连接串中指定数据库加载其相关对象,但此时服务器端还没有加载访问数据库的基础设施,比如系统表 "pg_database" "pg_authid" "pg_auth_members" 等的描述符及其相关索引 信息,因此无法通过系统表访问数据库的相关信息。第( 5 )步初始化 relcache 的管理环境,参见《

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

》。第( 8 )步通过 "global/pg_filenode.map" "global/pg_internal.init" 文件初始化共享 catalog "pg_catalog" ,将系统表 "pg_database" "pg_authid" "pg_auth_members" 等的描述符信息加载到 relcache 里。 "global/pg_filenode.map" 文件里存放的是数据库中关系和文件节点的映射信息, "global/pg_internal.init" 文件里存放的是 "pg_class" "pg_attribute" "pg_proc" "pg_type" 等系统关系信息。然后完成设置数据库快照(第 9 步)、根据 hba 文件完成客户端认证(第 10 步)、 pg_database 获取客户端要访问的数据库的对应元组(第11步),第 12 )步根据要访问的数据库 ID ,加载该数据库本地的 "pg_filenode.map" "pg_internal.init" 文件完成初始化。加载 "pg_class" "pg_attribute" "pg_proc" "pg_type" 等及其索引信息。如果从相关 "pg_filenode.map" "pg_internal.init" 文件初始化失败,系统会从硬编码的代码中初始化基础设施相关关系信息,下面摘录了 "pg_database" "pg_authid" "pg_auth_members" 的硬编码信息。不管加载那个文件,完成相关信息初始化后如有必要将重新该文件。重写时先写临时文件,写完后改文件名为正式文件。这样做是为了避免并发的后台进程读相关文件时崩溃。关于文件名举个例子,例如文件 "data/global/pg_internal.init" ,对应的临时文件名是 "data/global/pg_internal.init.pid" ,最后的 "pid" 是当前进程 ID

第( 13 )步调用 CheckMyDatabase 方法检查当前用户的数据库访问权限,从 cache 里的 pg_database 取当前数据库的相关属性字段。第( 14 )调用 InitializeClientEncoding 方法初始化客户端字符编码。第( 15 )调用 pgstat_bestart 方法在 PgBackendStatus 设置本进程状态。至此 pg 服务进程的初始化工作告一段落。

下面是部分系统关系硬编码信息:

DATA(insert OID = 11 ( "pg_catalog" PGUID _null_ ));

DESCR( "system catalog schema" );

#define PG_CATALOG_NAMESPACE 11

 

 

 

#define DatabaseRelationId  1262

#define DatabaseRelation_Rowtype_Id  1248

 

CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_MACRO

{

    NameData   datname;      /* database name */

    Oid        datdba;           /* owner of database */

    int4       encoding;     /* character encoding */

    NameData   datcollate;       /* LC_COLLATE setting */

    NameData   datctype;     /* LC_CTYPE setting */

    bool        datistemplate;    /* allowed as CREATE DATABASE template? */

    bool        datallowconn; /* new connections allowed? */

    int4       datconnlimit; /* max connections allowed (-1=no limit) */

    Oid        datlastsysoid;    /* highest OID to consider a system OID */

    TransactionId datfrozenxid; /* all Xids < this are frozen in this DB */

    Oid        dattablespace;    /* default table space for this DB */

    aclitem       datacl[1];    /* access permissions (VAR LENGTH) */

} FormData_pg_database;

 

/* ----------------

  *     Form_pg_database corresponds to a pointer to a tuple with

  *     the format of pg_database relation.

  * ----------------

  */

typedef FormData_pg_database * Form_pg_database ;

 

 

 

/* ----------------

  *     pg_authid definition.  cpp turns this into

  *     typedef struct FormData_pg_authid

  * ----------------

  */

#define AuthIdRelationId 1260

#define AuthIdRelation_Rowtype_Id   2842

 

CATALOG(pg_authid,1260) BKI_SHARED_RELATION BKI_ROWTYPE_OID(2842) BKI_SCHEMA_MACRO

{

    NameData   rolname;      /* name of role */

    bool        rolsuper;     /* read this field via superuser() only! */

    bool        rolinherit;       /* inherit privileges from other roles? */

    bool        rolcreaterole;    /* allowed to create more roles? */

    bool        rolcreatedb;  /* allowed to create databases? */

    bool        rolcatupdate; /* allowed to alter catalogs manually? */

    bool        rolcanlogin;  /* allowed to log in as session user? */

    bool        rolreplication; /* role used for streaming replication */

    int4       rolconnlimit; /* max connections allowed (-1=no limit) */

 

    /* remaining fields may be null; use heap_getattr to read them! */

    text       rolpassword;  /* password, if any */

    timestamptz rolvaliduntil;  /* password expiration time, if any */

} FormData_pg_authid;

 

#undef timestamptz

 

 

/* ----------------

  *     Form_pg_authid corresponds to a pointer to a tuple with

  *     the format of pg_authid relation.

  * ----------------

  */

typedef FormData_pg_authid * Form_pg_authid ;

 

 

 

/* ----------------

  *     pg_auth_members definition.  cpp turns this into

  *     typedef struct FormData_pg_auth_members

  * ----------------

  */

#define AuthMemRelationId   1261

#define AuthMemRelation_Rowtype_Id 2843

 

CATALOG(pg_auth_members,1261) BKI_SHARED_RELATION BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(2843) BKI_SCHEMA_MACRO

{

    Oid        roleid;           /* ID of a role */

    Oid        member;           /* ID of a member of that role */

    Oid        grantor;      /* who granted the membership */

    bool        admin_option; /* granted with admin option? */

} FormData_pg_auth_members;

 

/* ----------------

  *     Form_pg_auth_members corresponds to a pointer to a tuple with

  *     the format of pg_auth_members relation.

  * ----------------

  */

typedef FormData_pg_auth_members * Form_pg_auth_members ;

 

就到这儿吧!




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


  • 大小: 95.6 KB
  • 大小: 74.2 KB
0
0
分享到:
评论

相关推荐

    OLEDB驱动程序大全 PostgreSQL-OleDB-Provider

    在本话题中,我们将深入探讨“OLEDB驱动程序大全”中的一个特定组件——PostgreSQL OLEDB Provider。 PostgreSQL OLEDB Provider是用于连接和操作PostgreSQL数据库的OLEDB驱动程序。PostgreSQL是一种开源的关系型...

    postgresql及tomcat安装文档

    初始化数据库并启用自动启动,命令为:/usr/pgsql-9.3/bin/postgresql93-setup initdb、systemctl enable postgresql-9.3 和 systemctl start postgresql-9.3 四、添加新用户和新数据库 1. 新建一个 Linux 新用户...

    postgresql 离线安装教程

    9. **初始化数据库**: ```bash /opt/pgsql/bin/initdb -D /opt/pgsql/data ``` 10. **启动数据库服务**: ```bash /opt/pgsql/bin/pg_ctl -D /opt/pgsql/data -l logfile start ``` 11. **创建数据库**: ...

    timescaledb2.3.1+pg11.7 for Centos7安装包及依赖包

    《在CentOS7上安装TimescaleDB 2.3.1和PostgreSQL 11.7的详细步骤》 在数据库领域,TimescaleDB和PostgreSQL是两个备受瞩目的组件。TimescaleDB是一款专为时间序列数据设计的开源扩展,它构建于PostgreSQL之上,...

    postgresql源码包编译安装.docx

    本文介绍了如何从源码包编译安装 Postgresql,包括创建 LV、创建数据库软件用户、解压软件包、源码包编译安装、初始化数据库、启动数据库和登录数据库实例等步骤。这些步骤适用于所有的源码包安装。

    Postgresql及timescaledb

    安装过程中,用户可以选择安装路径、设置数据库端口号、创建初始管理员用户(例如,'postgres')以及配置数据存储目录。安装完成后,可以通过pgAdmin或其他图形化管理工具来管理和操作数据库。 **TimescaleDB:** ...

    PostgreSQL教程(十一):服务器配置

    ### 一、服务器进程的启动和关闭 PostgreSQL服务器的管理通常通过`pg_ctl`命令进行,它是对`postgres`命令的封装,提供了更为便捷的使用方式。以下是`pg_ctl`的常用选项: 1. **初始化数据库**: - `pg_ctl init...

    Centos6.8安装Postgresql11数据库.docx

    CentOS 6.8 安装 PostgreSQL 11 数据库...这篇文章详细介绍了 Centos 6.8 安装 PostgreSQL 11 数据库的步骤,包括安装存储库 RPM、安装客户端软件包、安装服务、初始化数据库、修改数据库存储路径、添加用户和授权等。

    通过虚拟机安装Postgresql.docx

    然后,我们需要初始化数据库,启动和停止数据库服务。具体命令如下: ``` $mkdir /home/postgres/pgsql_data $vi .bash_profile 修改 PATH 为:PATH=$PATH:$HOME/bin:/home/postgres/pgsql/bin 加入 export PGDATA=...

    rh9 linux下subversion服务器、php环境、postgres&mysql服务器安装配置

    - 初始化仓库:`svnadmin create /usr/local/subversion/repos/myrepo` 5. **设置权限**: - `chown -R apache:apache /usr/local/subversion/repos` - `chmod -R 755 /usr/local/subversion/repos` 6. **配置 ...

    从Java到Go的过渡:实现一个移动应用后端服务.docx

    - `var x int = 10` 是一种变量声明方式,同时初始化变量。 - `y := 20` 使用了简短变量声明语法(`:=`),这在Go语言中是一种非常常见的写法,尤其在函数内部使用。 - `sum := x + y` 同样使用简短变量声明语法,...

    C#如何连接postgres数据库.rar

    3. 创建连接对象:使用`NpgsqlConnection`(如果使用Npgsql)或`OleDbConnection`(如果使用PgOleDb)类创建连接对象,并用上面的连接字符串初始化。 4. 打开连接:调用`Open()`方法来建立到数据库的连接。 5. ...

    postgresql-13.2.tar.gz

    PostgreSQL,简称Postgres,是一个强大的、高度可扩展的开源关系数据库管理系统(RDBMS)。它的版本13.2是该系统的最新稳定版,提供了诸多改进和新特性,旨在提升性能、可靠性和易用性。这个“postgresql-13.2.tar....

    pgpool postgresql异步流复制 数据库集群及负载的配置方法.doc

    - 启动PostgreSQL服务,例如`pg_ctl -D /usr/local/pgsql -l /home/postgres/postgresql.log start`。 - 设置`postgres`用户的密码,如`alter user postgres with password '123456';`。 3. **数据库流复制配置**...

    PostgreSQL环境搭建及部署文档手册.docx

    **2.4 初始化和启动服务** - **初始化**:创建数据库实例所需的目录结构和文件。 ```shell /usr/pgsql-11/bin/postgresql-11-setup initdb ``` - **启动服务**:通过Systemd服务管理工具启动PostgreSQL服务。 ``...

    Go-一个使用Golang和PostgreSQL的GraphQL完整例子

    在`main.go`文件中,我们将初始化GraphQL服务器,并设置解析器。解析器是GraphQL服务的核心,它接收查询并返回结果。你可以使用`graphql.NewObject`和`graphql.Field`函数来创建GraphQL对象和字段,然后将它们组装成...

    ansible-docker-postgres:在Docker容器中管理和运行PostgreSQL角色

    它使用数据容器进行持久化,与主机卷相比,这是一种更为优雅的方法。 要求 Ubuntu 14.04已通过测试。 该角色使用Ansible的docker模块,因此要求。 角色变量 这是具有默认值的默认变量的列表: postgres_docker_...

    timescaledb1.7.5+pg10.7 for Centos7安装包及依赖包

    在IT行业中,数据库管理系统是核心组件之一,而TimescaleDB和PostgreSQL是两个备受瞩目的开源解决方案。本文将深入探讨“timescaledb1.7.5+pg10.7 for Centos7”安装包及依赖包的相关知识点,旨在帮助您理解和安装这...

    2022中职网络搭建国赛公布题postgresql数据库题解题

    - 初始化数据库是安装后的关键步骤,使用`postgresql-setup --initdb`命令来完成,这会创建默认的数据目录,例如 `/var/lib/pgsql/data`。 - 配置启动服务以便在系统启动时自动运行PostgreSQL,通过`systemctl ...

Global site tag (gtag.js) - Google Analytics