PostgreSQL检查点——关闭

  

PostgreSQL在关闭时会进行检查站。其流程如下。

  

1,在主进程中,会首先注册一个信号处理函数收割者,用于向检查站等子进程发送信号。向检查站进程发送SIGUSR2信号

  

PostmasterMain (int命令行参数个数,字符 argv [])
pqsignal_no_restart (SIGCHLD,收割者);/
处理孩子终止*/
死神:
, ((pid=waitpid(1,和exitstatus WNOHANG))比;0){

如果(pid==CheckpointerPID) {
,
SignalChildren (SIGUSR2);
}
,
}
,
PostmasterStateMachine();//向检查站进程发送SIGUSR2信号
| - - - - - - - - - - - - - - - - - - - - - - - -
|如果(pmState==PM_WAIT_BACKENDS) {
|如果CountChildren (BACKEND_TYPE_NORMAL | BACKEND_TYPE_WORKER)==0,,
| StartupPID==0,,
| WalReceiverPID==0,,
| BgWriterPID==0,,
| (CheckpointerPID==0 | | (!FatalError,,关闭& lt;ImmediateShutdown)),,
| WalWriterPID==0,,
| AutoVacPID==0) {
|//pg_ctl立即停止- m不会向检查站进程发送信号,即不会做检查点
|如果(关闭祝辞=ImmediateShutdown | | FatalError) {
| pmState=PM_WAIT_DEAD_END;
|}其他{
|如果(CheckpointerPID !=0) {
| signal_child (CheckpointerPID SIGUSR2);
| pmState=PM_SHUTDOWN;
|}
}
|}
| - - - - - - -}
2,检查点进程,也会注册一个信号处理函数ReqShutdownHandler,用于处理主进程发送过来的SIGUSR2信号。接收到该信号后将shutdown_requested置为真的。在检查站进程的为循环中,如果shutdown_requested为真,则进入关闭流程:停止每个发送方进程,所有发送方进程停止后,根据条件进行检查点:CreateRestartPoint后者CreateCheckPoint

  

CheckpointerMain (void)→
//为信号SIGUSR2安装信号处理函数ReqShutdownHandler
pqsignal (SIGUSR2 ReqShutdownHandler);请求关闭/ /
……
(,)如果(shutdown_requested) {{

/关闭数据库/
ShutdownXLOG (0, 0),
|——WalSndInitStopping();//向每个发送方进程发送信号修改到停止状态
| WalSndWaitStopping ();
|如果(RecoveryInProgress ())
| CreateRestartPoint (CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
|其他{
|如果XLogArchivingActive (),,XLogArchiveCommandSet ())
| RequestXLogSwitch(假);
| CreateCheckPoint (CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE);
|}
|——…
proc_exit (0);
}
,

检查站}
3, ReqShutdownHandler函数将shutdown_requested置为真正的

  

ReqShutdownHandler (SIGNAL_ARGS)
{
shutdown_requested=true;
SetLatch (MyLatch);
}

PostgreSQL检查点——关闭