PostgreSQL异常重启postmaster.pid处理

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
    目录
    相关文章
    |
    3月前
    |
    关系型数据库 MySQL API
    |
    6月前
    |
    关系型数据库 Java Go
    解决 MyBatis-Plus + PostgreSQL 中的 org.postgresql.util.PSQLException 异常
    解决 MyBatis-Plus + PostgreSQL 中的 org.postgresql.util.PSQLException 异常
    396 0
    |
    3月前
    |
    关系型数据库 MySQL Linux
    linux环境下查看mysql服务状态和重启命令
    linux环境下查看mysql服务状态和重启命令
    113 0
    |
    4月前
    |
    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 分析+解决
    110 1
    |
    8月前
    |
    关系型数据库 Java MySQL
    Java 最常见的面试题:一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
    Java 最常见的面试题:一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
    |
    8月前
    |
    监控 Oracle druid
    Springboot2.1.9+druid+mybatits(不重启项目动态添加mysql和oracle数据源)和数据监控
    Springboot2.1.9+druid+mybatits(不重启项目动态添加mysql和oracle数据源)和数据监控
    195 0
    |
    9月前
    |
    关系型数据库 PostgreSQL
    PostgreSQL异常宕机重启时间超长
    PostgreSQL异常宕机重启时间超长
    80 0
    |
    关系型数据库 MySQL Linux
    linux下开启、关闭、重启mysql服务命令
    linux下开启、关闭、重启mysql服务命令
    390 0
    |
    关系型数据库 MySQL
    Windows10 开启、关闭、重启MySQL服务
    Windows10 开启、关闭、重启MySQL服务
    391 0
    Windows10 开启、关闭、重启MySQL服务
    |
    关系型数据库 MySQL 数据库
    mysql:一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ?
    mysql:一张表,里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把Mysql重启,再insert一条记录,这条记录的ID是18还是15 ?
    319 0