前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostgreSQL异常宕机重启时间超长

PostgreSQL异常宕机重启时间超长

作者头像
yzsDBA
发布2020-10-28 09:39:36
1.2K0
发布2020-10-28 09:39:36
举报
文章被收录于专栏:PostgreSQL研究与原理解析

1、现象

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

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

3、原理分析

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

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

代码语言:javascript
复制
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。当磁盘性能比较差的时候耗费时间就比较长。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yanzongshuaiDBA 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档