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();}SyncDataDirectorylstat("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_fnamepre_sync_fname:openpg_flush_data->sync_file_range(fd,0,0,SYNC_FILE_RANGE_WRITE)closedatadir_fsync_fname->fsync_fname_extopenpg_fsync->fsyncclose
4、总结
异常宕机后重启,需要将data目录下所有文件stat、open、sync、close。当磁盘性能比较差的时候耗费时间就比较长。
最后修改时间:2019-11-24 18:33:16
文章转载自yanzongshuaiDBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




