- 浏览: 231021 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
chenxliang:
2016年10月26、27日,上海浦东,Postgres中国用 ...
PostgreSQL的用户、角色和权限管理 -
gejiod:
最近出了SQL:2011標準,希望樓主也更新下
SQL2008标准 -
lincon77:
太长了,又是E文,要是有些例子可能好理解些
SQL2003标准 -
少主丶无翼:
很谢,找了很久
SQL2003标准 -
zeeeitch:
...
PostgreSQL启动过程中的那些事七:初始化共享内存和信号二十:shmem中初始化堆同步扫描、pg子进程相关结构
到pg 服务进程了,打算搞一个完整但简单的查询例子,从解析树到分析树到执行计划树,简论一下pg 对于查询的整个处理过程(复杂点的各种树的图就太大了)。
话说 pg 启动后, postmaster 进程进入无限循环,等待客户端请求并为之提供请求的服务(参见《 pg 启动过程中的那些事十七: serverloop 》)。在无限循环里, postmaster 进程通过调用操作系统接口 select 定期检查是否有客户端服务请求,如果没有,继续循环,如果有,就创建一个 postgres 子进程为其提供服务。
。
1 先上个图,看一下函数调用过程梗概,中间略过部分细节
fork服务进程postgres 方法调用流程图
在 postmaster 进程的 serverloop 方法中,进行中无限循环 等待连接请求到达。 调用OS 的select 接口检查端口上有无请求(看和端口对应的文件句柄有什么改变),调用select 后,如果有请求到达, 阻塞所有信号,为服务请求完成了新建连接后, postmaster 进程再次循环等待不再阻塞信号。
如果有连接请求,从socket 数组 ListenSocket ( ListenSocket 里存放的是服务器上的为 socket 准备的文件描述符 FD ) 上取一个socket ListenSocket[i] ,把这个socket 作为参数调用ConCreate 方法创建一个port 结构,主要是把port 结构的文件描述符设置为服务器本地对应断口的文件描述符,以及给port 结构的本地和远程地址填值,如果port 创建成功,调用 BackendStartup (port) 创建一个 portgres 服务进程 ,并把客户端进程转接到这个新创建的postgres 服务进程上,以后这个进程专门为该客户端进程提供服务,然后把调用streamclose 该客户端进程和postmaster 进程的连接关闭,再调用ConnFree 释放服务器端的port 结构对象。
2
启动 Postgres 服务进程的调用流程图如下:
Postgres 服务进程的调用流程略图
在启动进程里 Main()->SubPostmasterMain() ,调用了如下方法,启动 XLOG 后就结束了生命。
1 ) MemoryContextInt 方法,参见《 PostgresQL 启动过程中的那些事一》;
2 ) InitializeGUCOptions 方法,参见《 PostgresQL 启动过程中的那些事三》;
3 ) Read_backend_variablases 方法,为重组 BackendParameters 结构读取前面存储的文件 pgsql_tmp/pgsql_tmp.backend_var.[pid].[tmpFileNum] ;
4 ) PGSharedMemoryReAttach 方法, attach 进程 postmaster 里的共享内存;
5 ) read_nondefault_variables 方法,读非默认 GUC 参数,参见《 PostgresQL 中的那些事 十一:保存非默认 GUC 参数到文件 》;
6 ) ClosePostmasterPorts 方法,关闭“启动进程”不用的文件句柄,当然,在 postmaster 进程里这些文件还是打开的;
7 ) Securl_initialze 方法,如果设置了客户端和服务器要使用 SSL 连接,初始化 SSL 连接相关对象。 pg 用开源库 openssl 实现了相关功能,安全相关功能以后专题讨论吧,参见《 pg 启动过程中的那些事六》。
8 ) BackendInitialize 方法,初始化后台进程和客户端交互的 libpq 协议相关实例,在 port 结构里设置客户端进程 IP 、端口等。
9 ) InitShmemAccess 方法,在初始化本进程共享内存全局变量:这些 shmem 头的 ShmemSegHdr 、 shmem 起始地址 ShmemBase 和 shmem 结束地址 +1 的 ShmemBase 。定义见下面。
static PGShmemHeader *ShmemSegHdr ; /* shared mem segment header */
static void *ShmemBase; /* start address of shared memory */
static void *ShmemEnd; /* end+1 address of shared memory */
10 ) InitProcess 方法,初始化一个 PGPROC 结构;
11 ) CreateSharedMemoryAndSemaphores 方法,参见《 PostgresQL 中的那些事七》;
12 ) BackendRun 方法,为这个后台进程组织入参(一般为 "postgres db_name" ),然后传入 PostgresMain 方法。
13 ) PostgresMain 方法是后台服务进程 postgres 进程的入口函数,其主要工作都在这个方法里。
SubPostmasterMain 的流程图见下面。根据启动进程的传入参数“ postgres –forkbackend NULL [v_AuxProcType] ”走了 "--forkbackend" 这个分支。还有 AutoVacuumLauncher 进程、 AutoVacuumWorker 进程、归档进程、统计进程以及为前端提供服务的 postgres 进程等在进程初始阶段,几乎没有区别的都走了 1-6 步,然后根据不同入参走了不同的分支,因此以后要讨论到这些进程,就直接从这些分支开始。
SubPostmasterMain 的流程图
第 10 步 InitProcess 初始化了一个每个辅助进程都有一个的 PGPROC 结构。每一个后台进程都在共享内存里有一个 PGPROC 结构,共享内存里有一个未使用的 PGPROC 结构链表,从其中给新的后台进程分配。参见《 PostgresQL 启动过程中的那些事七初始化 ProcGlobal 》。
当等待锁时,这个 PGPROC 结构被链入锁的等待进程队列。回收后的 PGPROC 链入 ProcGlobal 的空闲进程列表。
注意,两阶段提交会为每一个当前已准备事务设置一个假的 PGPROC 。这些 PGPROC 出现在 ProcArray 数据结构里以使已准备事务显示其还在运行并且能正确显示其持有锁。已准备事务的 PGPROC 和真实进程的 PGPROC 的区别是已准备事务的 PGPROC 的 pid 等于 0 。在已准备事务的 PGPROC 里不使用信号和锁行为,但是它的 myProcLocks[] 列表是有效的。
struct PGPROC
{
/* proc ->links 必须是结构的第一个成员 */
SHM_QUEUE links ; /* list link if process is in a list */
PGSemaphoreData sem ; /* ONE semaphore to sleep on */
int waitStatus ; /* STATUS_WAITING, STATUS_OK or STATUS_ERROR */
LocalTransactionId lxid ; /* local id of top-level transaction currently
* being executed by this proc , if running;
* else InvalidLocalTransactionId */
TransactionId xid ; /* id of top-level transaction currently being
* executed by this proc , if running and XID
* is assigned; else InvalidTransactionId */
TransactionId xmin ; /* minimal running XID as it was when we were
* starting our xact , excluding LAZY VACUUM:
* vacuum must not remove tuples deleted by
* xid >= xmin ! */
int pid ; /* Backend's process ID; 0 if prepared xact */
/* 当后台进程仍在启动时这些字段是 0: */
BackendId backendId ; /* This backend's backend ID (if assigned) */
Oid databaseId ; /* OID of database this backend is using */
Oid roleId ; /* OID of role using this backend */
bool inCommit ; /* true if within commit critical section */
uint8 vacuumFlags ; /* vacuum-related flags, see above */
/* 当是热备模式时,显示已为当前事务发出冲突信号。尽管没有要求,当持有 ProcArrayLock 锁事设置 / 消除。如果需要,没有锁可以访问。
bool recoveryConflictPending ;
/* 如果有,是进程当前正在等待的轻量锁的信息 */
bool lwWaiting ; /* true if waiting for an LW lock */
bool lwExclusive ; /* true if waiting for exclusive access */
struct PGPROC * lwWaitLink ; /* next waiter for same LW lock */
/* 如果有,进程当前正在等待的锁的信息 */
/* 如果当前没有等待的锁, waitLock 和 waitProcLock 是 NULL */
LOCK * waitLock ; /* Lock object we're sleeping on ... */
PROCLOCK * waitProcLock ; /* Per-holder info for awaited lock */
LOCKMODE waitLockMode ; /* type of lock we're waiting for */
LOCKMASK heldLocks ; /* bitmask for lock types already held on this
* lock object by this backend */
Latch procLatch ; /* generic latch for process */
/* 如果需要,是允许本进程等待同步复制的信息。如果没有等待的话 waitLSN 的值是 InvalidXLogRecPtr ;仅由用户后台进程设置。除非属主进程或 WALSender 进程可以 touch syncRepState 。仅当持有 SyncRepLock 锁时才可以用 syncRepLinks 。
*/
XLogRecPtr waitLSN ; /* waiting for this LSN or higher */
int syncRepState ; /* wait state for sync rep */
SHM_QUEUE syncRepLinks ; /* list link if process is in syncrep queue */
/* 为锁持有的所有 PROCLOCK 对象或者由该后台进程等待的 PROCLOCK 被链入这些链表中的一个,根据他们锁的分区号。
所有为持有锁或者有后台进程等待的 PROCLOCK 对象被链到这个列表,股他们锁的发布号。
*/
SHM_QUEUE myProcLocks [NUM_LOCK_PARTITIONS];
struct XidCache subxids ; /* cache for subtransaction XIDs */
};
typedef struct SHM_QUEUE
{
struct SHM_QUEUE * prev ;
struct SHM_QUEUE * next ;
} SHM_QUEUE ;
第 12 步调用 BackendRun 方法,根据在客户端进程的请求,为 postgres 服务进程组织了入参(一般为 "postgres db_name" ),以这个入参调用 PostgresMain 方法。
第 13 步调用 PostgresMain 方法,这个方法 是后台服务进程 postgres 进程的入口函数,其主要工作都在这个方法里。
先到这儿吧,下一篇接着讨论 PostgresMain 方法。
------------
转载请著明出处,来自博客:
blog.csdn.net/beiigang
beigang.iteye.com
发表评论
-
PostgreSQL服务过程中的那些事三:pg服务进程中的内存上下文
2012-12-31 15:07 2065题外话:年底了,就以这篇博文结束2012 ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询六:执行器执行
2012-11-07 20:13 1824话说 查询“ select c ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询五:规划成plantree
2012-10-31 20:37 1732话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询四:分析重写成querytree
2012-10-24 19:27 1437话说 查询“ select cname, comp ... -
postgresql 小技巧
2012-10-16 19:36 1380Note : #PostgreSQL and ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询三:获取内存快照
2012-10-16 19:31 1762话说 查询“ select cname, comp ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询二:SQL解析为parsetree
2012-10-09 19:50 1529话说 查询“ select cname, comp fr ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询一:开启事务
2012-09-25 19:55 1887在《 PostgreSQL 服务过程中的那些事二: ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.八:加载DB基础设施,完成服务进程初始化
2012-09-18 21:02 1805话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.七:初始化portal管理环境
2012-09-11 19:58 1631话说调用 In ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.六:初始化系统表缓存catcache
2012-09-04 20:51 1856话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程一.五:初始化relcache管理环境
2012-08-28 20:47 1314话说调用 InitPostgres ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程三:初始化relcache管理环境
2012-08-28 20:46 0<!-- [if gte mso 9]><x ... -
PostgreSQL服务过程中的那些事二:Pg服务进程处理简单查询梗概
2012-08-21 21:04 1258话说客户端发起请求, pg 服务器为该请求启动一个 ... -
PostgreSQL服务过程中的那些事一:启动postgres服务进程二:建立连接完成
2012-08-13 18:50 15773 这节主要讨论 pg 服务进程 pos ... -
PostgreSQL启动过程中的那些事十九:walwriter进程二
2012-08-03 16:53 13813 这节主要讨论 walwrit ... -
PostgreSQL启动过程中的那些事十九:walwriter进程一
2012-08-01 17:26 1614话说 main()->Po ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程二
2012-07-27 07:25 14323 这节主要讨论 bgwr ... -
PostgreSQL启动过程中的那些事十八:bgwriter进程一
2012-07-23 20:18 1641话说 main()->Postm ... -
PostgreSQL启动过程中的那些事十六:启动进程三:CheckPointGuts刷出共享内存里所有数据
2012-07-12 16:24 1480话说启动进程调用 Startup ...
相关推荐
- **服务器设置和操作**:包括启动、停止数据库服务,以及日常运维操作。 - **服务器配置**:详细介绍了配置参数的意义及其对数据库性能的影响。 - **用户认证**:支持多种认证方式,如密码验证、证书验证等。 - **...
这将做很多事,包括建立 PostgreSQL 需要运行的数据结构以及初始化一个可工作的数据库:template1。你需要使用 postgres 用户来运行 initdb 工具。 ``` pg$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data `...
### Linux下PostgreSQL安装与开机启动详解 #### 1. 添加用户及创建目录 为了确保PostgreSQL服务的安全性,我们通常会为它创建一个独立的系统用户。这一步骤包括了用户创建、密码设定以及相关目录的搭建。 ##### ...
- "bootstrap":这部分代码用于初始化数据库模板,建立系统表,是PostgreSQL启动的基石。 - "main":检查命令行参数和标志,决定启动postmaster还是postgres进程。 - "postmaster":管理PostgreSQL服务器的启动和...
1. **postgres主进程**:这是启动数据库集群的父进程,负责管理其他子进程,如背景工作者和服务进程。 2. **后台工作者**:包括检查点进程、归档进程、统计收集器、Wal Writer等,它们执行各种后台任务,确保数据库...
### 一、服务器进程的启动和关闭 PostgreSQL服务器的管理通常通过`pg_ctl`命令进行,它是对`postgres`命令的封装,提供了更为便捷的使用方式。以下是`pg_ctl`的常用选项: 1. **初始化数据库**: - `pg_ctl init...
在安装 PostgreSQL 之前,需要创建一个名为 postgres 的用户和组,以便 PostgreSQL 进程可以安全地运行。使用以下命令创建用户和组: ``` groupadd postgres useradd -g postgres postgres ``` 然后,需要配置环境...
- 如果在安装过程中没有启动服务,可以在服务管理器中找到 "postgresql-x64-9.2" 或 "postgresql-9.2" 服务并手动启动。 - 使用命令行工具 `pg_ctl` 或图形化工具如 pgAdmin 来管理数据库服务,包括启动、停止和...
如果命令行显示了与PostgreSQL相关的进程,则表示PostgreSQL已安装在系统中。此时可以通过以下命令卸载: ```bash # 卸载所有PostgreSQL相关包 yum -y remove postgresql* # 如果有必要,可以进一步清理遗留的RPM...
相比之下,PostgreSQL的实例启动依赖于`Postmaster`进程,通常通过`pg_ctl`命令执行。一个实例同样可以管理多个数据库,但这些数据库被组织成一个集群,存储在一个初始化时设定的磁盘区域中,该区域由一个目录构成,...
1. **Postmaster**:这是PostgreSQL启动后创建的第一个进程,负责创建共享内存、初始化锁表和数据库缓冲区等内部数据结构,并监听用户请求,根据需要创建`postgres`进程来处理用户的服务请求。此进程在整个数据库...
以上就是安装PostgreSQL数据库在Unix系统上的详细过程,包括依赖库的安装、编译配置、权限设置、数据库的初始化、启动和服务调试等关键步骤。这些步骤确保了PostgreSQL能够在Unix环境下正确且安全地运行。
1. PostgreSQL的二进制文件:这是运行数据库服务的核心部分,包括postgres主进程和其他相关服务。 2. 数据库管理工具:如pgAdmin,用于图形化管理数据库,进行创建、查询、备份等操作。 3. 系统库和依赖:这些是...
- **后端进程 (Postgres)**:每个查询执行时都会启动一个独立的后端进程。 - **数据写入器 (Datawriter)**:负责将更改的数据从内存刷到磁盘。 - **归档进程 (Archiver)**:用于归档重做日志(WAL)文件。 - **统计...
- 介绍了如何启动和关闭PostgreSQL服务器进程。 8. PostgreSQL的角色和权限: - 提供了关于数据库角色的管理和权限分配的知识。 9. PostgreSQL的数据库管理: - 概述了数据库管理的基本概念和操作。 10. ...
然而,当PostgreSQL服务启动后占用CPU达到100%,甚至导致系统卡死,这显然是一个严重的问题。本文将探讨这个问题的可能原因及解决方案。 首先,我们要理解PostgreSQL为何会消耗大量CPU资源。这通常与以下因素有关:...
本项目提供了一个工具类源码,用于将PostgreSQL数据库的表结构和数据转换到SQLite数据库中,这对于开发、测试或部署在轻量级环境中的应用非常有用。这个工具基于Spring Boot框架,因此它具有良好的可扩展性和易用性...
2. **可执行文件**:如`postgres.exe`,这是PostgreSQL服务的主要进程,负责启动、管理和运行数据库实例。还有其他如`pg_ctl.exe`用于控制数据库服务的启动、停止和状态检查。 3. **数据目录**:在pgsql目录下可能...