一、Postgres在启动后,可分别以一下四种形式启动进程:
* SubPostmasterMain
* AuxiliaryProcessMain
* PostgresMain
* PostmasterMain
PostmasterMain
1. 设置进程ID
2. 初始化内存池
3. 设置路径、时间等变量
4. 初始化GUC选项,处理输入参数并载入hba和ident
5. 设置共享内存和信号量,初始化共享数据结构
6. 设置信号处理句柄
7. 启动守护进程:
8. 由参数forkboot启动一个backend
9. 绑定到TCP socket,监听连接请求
PostgresMain(--single)
1. 设置进程ID
2. 初始化内存池
3. 设置路径、时间等变量
4. 初始化GUC选项,处理输入参数和其他startup packet中的参数
5. 设置信号处理句柄
6. 初始化一个backend(无论它是否由postmaster生成):ipc,lock,file,storage,buffer
7. 启动XLOG
8. 加载FreeSpaceMap
9. 初始化进程
10. 初始化表缓存和系统目录访问
11. 处理预加载的库
12. 转到MessageContext内存池
13. 进入查询处理主循环
SubPostmasterMain(--fork)
1. 指明由postmaster派生
2. 设置进程ID
3. 初始化内存池
4. 处理输入参数
5. 运行相应的backend或子进程
AuxiliaryProcessMain(--boot)
1. 设置进程ID
2. 初始化内存池
3. 设置路径、时间等变量
4. 初始化GUC选项,处理输入参数
5. 以BootstrapProcessing模式初始化一个backend:ipc,buffer
6. 设置信号处理句柄
7. 以NormalProcessing状态针对不同auxType分别进行以下处理
二、CATALOG的导入
1. 获取存放数据的目录DataDir
2. 创建该目录及其子目录
3. 初始化内存池
4. 以BootstrapProcessing模式初始化一个backend:ipc,buffer
5. 以NormalProcessing模式BootStrapXLOG和启动XLOG
6. 以BootstrapProcessing模式做类似backend的初始化
7. 读入bki文件,解析并执行
8. 设置checkpoint确保所有更新被写入磁盘
三、CATALOG的读取
1. PostgresMain中的1-9
2. 初始化relation description cache,创建一个空的cache哈希表
3. 初始化system catalogs cache
4. 启动事务系统
5. 使用formrdesc(仅用于pg_class、pg_attribute、pg_proc和pg_type)读取预计算好的relcache入口(或 nailed-in-cache relations的最小集的phony入口)
6. 在非bootstrapping模式下,确保可以访问critical system indexes
7. 访问并更新所有从formrdesc和relcache cache file中获得的数据。
8. 完成所有catcaches的初始化,预载最重要的系统目录和索引,并写入到relcache cache file供将来backend使用。
注:此文章转自如下链接http://hi.baidu.com/roo7/blog/item/3432ce017ee95306728da554.html