这篇文章主要介绍“分析PostgreSQL异常重启postmaster.pid处理”,在日常操作中,相信很多人在分析PostgreSQL异常重启postmaster.pid处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分析PostgreSQL异常重启postmaster.pid处理”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

启动时pid文件即锁文件的处理,若异常宕机,导致pid文件残留,那么重启时会自动将这个文件删除吗?

main>PostmasterMain->CreateDataDirLockFile->CreateLockFile::for(ntries=0;;ntries++){//O_EXCL若存在则返回失败,errno是17fd=open(filename,O_RDWR|O_CREAT|O_EXCL,pg_file_create_mode);if(fd>=0)break;if((errno!=EEXIST&&errno!=EACCES)||ntries>100)//重试100次couldnotcreatelockfilefd=open(filename,O_RDONLY,pg_file_create_mode);...if((len=read(fd,buffer,sizeof(buffer)-1))<0)...close(fd);//0表示检查进程是否存在。ESRCH:没有这个进程;EPERM:操作不允许if(kill(other_pid,0)==0||(errno!=ESRCH&&errno!=EPERM)){lockfile\"%s\"alreadyexists}if(unlink(filename)<0)//删除,然后循环再试创建...}//此时创建成功if(write(fd,buffer,strlen(buffer))!=strlen(buffer))//写入pid内容...if(pg_fsync(fd)!=0)...if(close(fd)!=0)...

说明:

1)会以O_RDWR | O_CREAT | O_EXCL形式open,若存在的话会返回创建文件失败。

2)若创建失败则会重试100次

3)若文件已存在,则以只读的形式再次open并读取文件内容

4)解析出pid,并通过kill(pid,0)判断进程是否存在(注意,若有子进程残留也会判断出来)

5)若有进程不存在,则将这个文件删除,然后进行重试

6)创建成功后,将当前进程信息写入文件并sync持久化。

7)最后将文件句柄关闭

到此,关于“分析PostgreSQL异常重启postmaster.pid处理”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!