2.6.4 初始化Postgres的运行环境
基本参数和信号量处理函数初始化完成之后,将进行Postgres进程运行环境的初始化工作。Postgres进程首先会检查DataDir变量,确保给定的DataDir字符串是一个格式正确的数据目录路径。在多用户模式下,此工作由Postmaster进程完成。在有效数据目录路径下,检查PG_VERSION文件中的版本信息是否与当前版本的程序兼容。在版本兼容的前提下,将当前工作目录转到DataDir字符串表示的目录,以方便Postmaster进程及其他后台进程使用相对路径访问数据目录。
路径设置完成后,Postgres的初始化工作分为两个阶段:首先调用BaseInit函数来完成基本初始化,之后调用InitPostgres来完成Postgres的初始化。之所以将BaseInit和InitPostgres划分为两个阶段,是因为与XLog相关的初始化工作必须在InitPostgres之前。
在BaseInit中,第一步调用InitCommunication创建共享内存和信号量并进行初始化,第二步调用DebugFileOpen初始化input/output/debugging文件描述符,第三步调用InitFileAccess初始化文件访问,第四步调用Smgrinit初始化或者关闭存储管理器,最后调用InitBufferPoolAccess初始化共享缓冲区存储器。在整个BaseInit阶段,将完成Postgres进程的内存、信号量以及文件句柄的创建和初始化工作。
在InitPostgres中,以数据库名或者数据库OID、用户名为参数,如果参数给出的是数据库的OID,该函数还将把对应的数据库名返回给调用者,在bootstrap模式不需要参数。在InitPostgres中获取数据库的路径并设置该路径的环境变量,完成PGPROC结构的填充并将其添加到ProcArray,即可使得其对其他后台可见。填充PGPROC结构后,开始一系列的初始化操作,包含初始化后端缓冲池、Xlog访问、关系Cache、系统表Cache、查询计划Cache、Portal管理器、状态收集器以及退出码的设置。完成初始化工作后,即开始一个新的事务并创建相应的锁对象,再次检查数据库对象保证数据操作安全。
【责任编辑:云霞 TEL:(010)68476606】