PostgreSQL异常宕机重启时间超长
时间:2022-07-28
本文章向大家介绍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。当磁盘性能比较差的时候耗费时间就比较长。
- 基于OBS的插件开发总结
- Linux从程序到进程
- asp.net 解码gb2312下urlencode后的字符串
- XCode日常使用备忘录
- .net中close和dispose及关闭流操作
- Linux文件管理相关命令
- 实现滑动分页(微博分页方式)
- 腾讯汇赢正式上线,变革2018大连房地产市场营销
- Windows下程序启动时出现0xc000007b错误的解决方案
- 外媒报道:CBM.com、NMA.com等域名齐交易
- ObjectDataSource与GridView配合使用经验总结系列一:数据绑定
- ObjectDataSource与GridView配合使用经验总结系列二:分页
- 网页优化系列二:使用Cache缓存静态文件、图片(asp.net版)
- Linux用户与“最小权限”原则
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 正则表达式入门
- (在模仿中精进数据可视化02) 温室气体排放来源可视化
- ROS机器人URDF建模
- 这是我见过最牛逼的Shell,619行代码!
- 设计模式(五):利用原型模式复制几个葫芦娃
- Vue中数组变动监听
- which命令
- 如何将tensorflow1.x代码改写为pytorch代码(以图注意力网络(GAT)为例)
- tomcat设置好环境变量,依然无法通过cmd startup命令启动
- python调用百度图片识别api
- [Go]GO语言实战-开源WEB客服GO-FLY-gorm下分页的实现
- [Go]GO语言实战-小程序或公众号接口gin框架验证微信服务器消息签名-开源WEB客服
- php一步一步实现mysql协议(一)——抓包本地mysql通信
- [MySQL] 利用explain查看sql语句中使用的哪个索引
- php一步一步实现mysql协议(二) ——握手初始化