PostgreSQL异常宕机重启时间超长

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: PostgreSQL异常宕机重启时间超长

1、现象

异常关闭后,重启后一直打印starting up,持续时间很长。并且,异常关闭前没有大量write的业务,也就是说没有需要大量恢复的redo日志。那么时间耗费在哪里了?

2、通过pstack工具,定位到堆栈在StartupXLOG->SyncDataDirectory这个函数中

3、原理分析

crash后再次重启,需执行2个动作:创建新的WAL文件时,pg_wal目录可能仍然残留临时WAL文件,因此重启时需要执行清理动作;

write data后,可能存在发起fsync但是还没执行。因此断点后可能造成丢失数据,为了避免这种事情发生,需要fsync整个data目录。


StartupXLOG:
  if (ControlFile->state != DB_SHUTDOWNED &&
    ControlFile->state != DB_SHUTDOWNED_IN_RECOVERY){
    RemoveTempXlogFiles();//删除xlogtemp开头的临时文件
    SyncDataDirectory();
  }
SyncDataDirectory
  lstat("pg_wal", &st);
  //对目录进行递归,进行pre_sync_fname动作
  walkdir(".", pre_sync_fname, false, DEBUG1);
  walkdir("pg_tblspc", pre_sync_fname, true, DEBUG1)
  walkdir(".", datadir_fsync_fname, false, LOG);
  walkdir("pg_tblspc", datadir_fsync_fname, true, LOG);
walkdir->opendir
       ->readdir
     ->lstat
     ->pre_sync_fname | datadir_fsync_fname
pre_sync_fname:
  open
  pg_flush_data->sync_file_range(fd,0,0,SYNC_FILE_RANGE_WRITE)
  close
datadir_fsync_fname->fsync_fname_ext
  open
  pg_fsync->fsync
  close

 

4、总结

异常宕机后重启,需要将data目录下所有文件stat、open、sync、close。当磁盘性能比较差的时候耗费时间就比较长。


相关实践学习
使用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 异常
390 0
|
3月前
|
关系型数据库 MySQL Linux
linux环境下查看mysql服务状态和重启命令
linux环境下查看mysql服务状态和重启命令
112 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 分析+解决
107 1
|
9月前
|
关系型数据库 PostgreSQL
PostgreSQL异常重启postmaster.pid处理
PostgreSQL异常重启postmaster.pid处理
100 0
|
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
|
关系型数据库 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 ?
318 0