PostgreSQL异常重启postmaster.pid处理

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: PostgreSQL异常重启postmaster.pid处理

本文介绍启动时pid文件即锁文件的处理。

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

    main>PostmasterMain->CreateDataDirLockFile->CreateLockFile::
      for (ntries = 0;; ntries++){
        // O_EXCL若存在则返回失败,errno是17
        fd = open(filename, O_RDWR | O_CREAT | O_EXCL, pg_file_create_mode);
        if (fd >= 0)
          break;  
        if ((errno != EEXIST && errno != EACCES) || ntries > 100)//重试100次
        could not create lock file
        fd = 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)){
          lock file \"%s\" already exists
        }
        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)最后将文件句柄关闭


    相关实践学习
    使用PolarDB和ECS搭建门户网站
    本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
    阿里云数据库产品家族及特性
    阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
    目录
    相关文章
    |
    6月前
    |
    关系型数据库 MySQL Linux
    Linux启动停止重启Mysql数据库针对各个版本的数据库
    Linux启动停止重启Mysql数据库针对各个版本的数据库
    41 0
    |
    6月前
    |
    关系型数据库 MySQL API
    |
    关系型数据库 PostgreSQL Docker
    harbor-db重启报错:initdb: error: directory "/var/lib/postgresql/da..
    harbor-db重启报错:initdb: error: directory "/var/lib/postgresql/da..
    480 1
    |
    1月前
    |
    关系型数据库 MySQL Linux
    易优CMS请重启MYSQL数据库,或者联系空间服务商处理[错误报错·····]出现以下提示该怎么办?-eyoucms
    易优CMS请重启MYSQL数据库,或者联系空间服务商处理[错误报错·····]出现以下提示该怎么办?-eyoucms
    |
    关系型数据库 Java Go
    解决 MyBatis-Plus + PostgreSQL 中的 org.postgresql.util.PSQLException 异常
    解决 MyBatis-Plus + PostgreSQL 中的 org.postgresql.util.PSQLException 异常
    1204 0
    |
    2月前
    |
    关系型数据库 数据库 网络虚拟化
    Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例
    由于时间和空间限制,我将在后续的回答中分别涉及到“Python中采用lasso、SCAD、LARS技术分析棒球运动员薪资的案例集锦”以及“Docker环境下重启PostgreSQL数据库服务的全面指南与代码示例”。如果你有任何一个问题的优先顺序或需要立即回答的,请告知。
    69 0
    |
    5月前
    |
    NoSQL 关系型数据库 MySQL
    linux服务器重启php,nginx,redis,mysql命令
    linux服务器重启php,nginx,redis,mysql命令
    118 1
    |
    6月前
    |
    安全 关系型数据库 MySQL
    |
    6月前
    |
    关系型数据库 MySQL Linux
    linux下开启、关闭、重启mysql服务
    linux下开启、关闭、重启mysql服务
    127 0
    |
    6月前
    |
    SQL 关系型数据库 MySQL
    PostgreSQL【异常 01】java.io.IOException:Tried to send an out-of-range integer as a 2-byte value 分析+解决
    PostgreSQL【异常 01】java.io.IOException:Tried to send an out-of-range integer as a 2-byte value 分析+解决
    440 1