启动其他子进程。such as the bgwriter, walwriter, walreceiver, bootstrapper and the shared memory checker code.
包括 src/backend/postmaster/postmaster.c 中的
#define StartupDataBase() StartChildProcess(StartupProcess)
#define StartBackgroundWriter() StartChildProcess(BgWriterProcess)
#define StartCheckpointer() StartChildProcess(CheckpointerProcess)
#define StartWalWriter() StartChildProcess(WalWriterProcess)
#define StartWalReceiver() StartChildProcess(WalReceiverProcess)
1. 在数据库进行检查(权限,文件,文件夹等)之后,会先进行 StartupDataBase(),启动数据库进程。
2. 随后,运行ServerLoop() 函数, 其他的子进程会被启动。(ServerLoop函数具体位置请参考数据库启动-backend启动)
函数位置
src/backend/postmaster/postmaster.c StartChildProcess(AuxProcType type) --> AuxiliaryProcessMain
backend/bootstrap/bootstrap.c AuxiliaryProcessMain(int argc, char *argv[]) --> StartupProcessMain
src/backend/postmaster/startup.c StartupProcessMain(void)
if (IsUnderPostmaster)
{
const char *statmsg;
switch (MyAuxProcType)
{
case StartupProcess:
statmsg = pgstat_get_backend_desc(B_STARTUP);
break;
case BgWriterProcess:
statmsg = pgstat_get_backend_desc(B_BG_WRITER);
break;
case CheckpointerProcess:
statmsg = pgstat_get_backend_desc(B_CHECKPOINTER);
break;
case WalWriterProcess:
statmsg = pgstat_get_backend_desc(B_WAL_WRITER);
break;
case WalReceiverProcess:
statmsg = pgstat_get_backend_desc(B_WAL_RECEIVER);
break;
default:
statmsg = "??? process";
break;
}
所有进程启动完成。