pg_resetwal的参数

ControlFile结构及pg_resetwal参数影响的字段

static struct option long_options[] = {{"commit-timestamp-ids", required_argument, NULL, 'c'},{"pgdata", required_argument, NULL, 'D'},{"epoch", required_argument, NULL, 'e'},{"force", no_argument, NULL, 'f'},{"next-wal-file", required_argument, NULL, 'l'},{"multixact-ids", required_argument, NULL, 'm'},{"dry-run", no_argument, NULL, 'n'},{"next-oid", required_argument, NULL, 'o'},{"multixact-offset", required_argument, NULL, 'O'},{"next-transaction-id", required_argument, NULL, 'x'},{"wal-segsize", required_argument, NULL, 1},{NULL, 0, NULL, 0}};

介绍

PG11允许用户在线修改WAL段文件大小。以往版本需要重新编译,并且不同--wal-segsize设置的PG相互不兼容。这个值范围1—1024,为2的平方且单位M。当改变大小时建议和-l参数一起使用,设置下一个WAL文件名,防止重复使用之前的名字。下一个段文件名要比当前已存在的都要大,

该工具会将WAL目录下日志全部删除,并生成一个新WAL段文件。该文件名起名规则:

1、-l指定的段文件名解析出段号minXlogSegNo

2、FindEndOfXLOG扫描WAL目录下所有文件得到最大的文件号:

1)newXlogSegNo为pg_control文件中记录的ckp所属段号

2)若目录下由比这个号大的,则更新newXlogSegNo为该段号

3)该段号转换成WAL长度后,除以新段文件大小得到新段文件段号newXlogSegNo,将之+1作为新段文件的段号

3、原pg_control文件中的ckp作为CHECKPOINT记录写入新段文件里面。该段文件仅写这一个WAL,后面的大小全部清0。

4、新pg_control文件的checkpoint位置为该文件中CHECKPOINT记录位置。

5、这个工具比较危险,慎用。

6、在主备环境中,备机启动不起来,且日志损坏时,主机数据量非常大,全量重新拷贝又耗费时间特别长,此时可以尝试使用这个工具:

1)比较备机和主机的pg_control文件的checkpoint位置,若备机和主机记录的checkpoint位置相等,则可以执行pg_resetwal,这样重新启动后可以正常构建流复制,数据也不会丢

2)若备机的checkpoint小,使用这个pg_control文件进行pg_resetwal可能重启后构建不起来流复制。使用主机的pg_control文件进行pg_resetwal,重启后可构建流复制,但丢数据

3)若备机的checkpoint大,使用这个pg_control文件进行pg_resetwal,可能重启后构建不起来流复制,即使构建起来也丢数据。使用主机的pg_control文件进行pg_resetwal,应该也可以正常。

4)备机的时间线文件需要清理

流程

pg_control文件的更新,然后调用KillExistingXLOG删除pg_wal目录下的所有WAL文件:

       while(errno = 0, (xlde = readdir(xldir)) != NULL){if(IsXLogFileName(xlde->d_name) || IsPartialXLogFileName(xlde->d_name)){snprintf(path,sizeof(path), "%s/%s", XLOGDIR, xlde->d_name);if(unlink(path) < 0){pg_log_error("couldnot delete file \"%s\": %m", path);exit(1);}}}

调用函数KillExistingArchiveStatus删除archive_status目录下.ready,.done和.partial.ready、.partial.done文件:

       while(errno = 0, (xlde = readdir(xldir)) != NULL){if(strspn(xlde->d_name, "0123456789ABCDEF") == XLOG_FNAME_LEN&&(strcmp(xlde->d_name+ XLOG_FNAME_LEN, ".ready") == 0 ||strcmp(xlde->d_name + XLOG_FNAME_LEN,".done") == 0 ||strcmp(xlde->d_name + XLOG_FNAME_LEN,".partial.ready") == 0 ||strcmp(xlde->d_name + XLOG_FNAME_LEN,".partial.done") == 0)){snprintf(path,sizeof(path), "%s/%s", ARCHSTATDIR, xlde->d_name);if(unlink(path) < 0){pg_log_error("couldnot delete file \"%s\": %m", path);exit(1);}}}

最后调用函数WriteEmptyXLOG创建一个新WAL段文件,并仅写入一个checkpoint记录,其中checkpoint记录来自ControlFile结构

PostgreSQL pg_resetwal处理机制相关推荐

  1. PostgreSQL 的 MVCC 机制解析

    为什么80%的码农都做不了架构师?>>>    导语 PostgreSQL是通过MVCC(Multi-Version Concurrency Control)来保证事务的原子性和隔离 ...

  2. 也谈PostgreSQL的Vacuum机制及其最佳实践

    点击▲关注 "数据和云"   给公众号标星置顶 更多精彩 第一时间直达 前几天,我们就如何对数据库,表进行合适的vacuum策略,对已有方法进行了总结,回顾 新特性:postgre ...

  3. PostgreSQL数据库锁机制——SpinLock

    SpinLock是最底层的锁,使用互斥信号量实现,与操作系统和硬件环境联系紧密.SpinLock分为与机器相关的实现方法(定义在s_lock.c中)和与机器不相关的实现方法(定义在Spin.c中).S ...

  4. postgresql ident验证机制的实现

    2019独角兽企业重金招聘Python工程师标准>>> postgresql 数据库中提供了ident验证机制.postgresql中的ident验证机制的实现方式是向客户端的113 ...

  5. Postgresql的Listen-Notify机制

    Postgresql提供 监听 - 通知 的订阅服务,使得数据库客户端向服务端的指定通道注册为监听客户端,服务端在发出Notify通知时,所有已注册的监听客户端将能够收到该通知. 使用示例 服务端 - ...

  6. PostgreSQL下如何修改用户权限的介绍以及hook机制对超级用户的权限修改

    2019独角兽企业重金招聘Python工程师标准>>> 要想修改PG的用户权限,那么首先要对PG权限控制做一下了解: PG的权限控制是针对到各个对象的.大家可以看一下,所有系统表(p ...

  7. oracle的mvcc解析,PostgreSQL原理:Oracle 和 MySQL 中MVCC机制详解

    MVCC,Multi-version Concurrency Control ,顾名思义指的是多版本并发控制.在介绍MVCC之前我们先来简单了解下事务的隔离级别: read uncommitted:脏 ...

  8. PostgreSQL锁机制

    PostgreSQL中有两类锁:表级锁和行级锁.当要查询.插入.更新.删除表中数据时,首先要获得表级锁,然后获得行级锁. 下面对PostgreSQL数据库锁机制的理解,大部分来自与<Postgr ...

  9. python 操作 postgresql 数据库

    目录 一 简介 历史 描述 特征 函数 索引 触发器 多版本并发控制 规则 数据类型 用户定义对象 二 数据库连接 2.1 安装 psycopg2 2.2 连接数据库 三 创建表 四 插入操作 4.1 ...

最新文章

  1. 隐私全无!错发1700多条Alexa录音,上报后亚马逊淡定回应是“个人错误”
  2. 【Auto Layout】Xcode6及以上版本,创建Auto Layout 约束时产生的一些变化【iOS开发教程】...
  3. BAPI:KBPP_EXTERN_UPDATE_CO, TCODE:CJ30/CJ40
  4. java关于23种设计模式的有趣见解
  5. poj 1469 COURSES 解题报告
  6. python class类里给列表排序_python笔记:Class(类)
  7. 一个随机数发生器(一)
  8. java集合类练习_JAVA集合类练习
  9. ue4小白人骨骼定义_【Blender】用SkinModifier+骨骼顶点“灵活”快速创建雕刻需要用的基本人物模型...
  10. 7.18 day13
  11. Understand-4.0.877-Linux-64bit.tgz最新版本2017年源代码阅读利器,养眼theme之配置
  12. go java 垃圾回收_JAVA什么时候执行垃圾回收以及回收流程-Go语言中文社区
  13. 将ubuntu引导项加入windowsXP启动菜单中
  14. 计算机编程方面的电子书大汇总 阿里云盘
  15. go-sqlite3 “database is locked”问题解决方案
  16. Skywalking vs Pinpoint
  17. python random.sample
  18. 自我监督学习:提高深度学习数据效率的计划
  19. The little Schemer
  20. developer.biao.daily.20140628

热门文章

  1. Visual Studio 2019无法安装
  2. Tips Tricks
  3. 绘图软件:Autodesk AutoCAD 2012 简体中文正式版下载(32/64位)
  4. 水声通信软件无线电OMAP平台的硬件设计与实现
  5. 【竞赛那些事】追忆本科首次参加数学建模获得第一名特等奖
  6. Drawer打开关闭
  7. 小说源码seo利于优化模板两套带采集规则
  8. JZOJ 5775. 【NOIP2008模拟】农夫约的假期
  9. nginx location 配置中 try_files, alias, root, index 的
  10. 使用uni-poup制作日历弹出框