您的位置:首页 > 数据库

PostgreSQL异常宕机重启时间超长

2020-03-02 04:38 585 查看

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。当磁盘性能比较差的时候耗费时间就比较长。

  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
yzs87 博客专家 发布了291 篇原创文章 · 获赞 89 · 访问量 27万+ 他的留言板 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: