【经验分享】PT(persistent table)表异常导致gprecoverseg全量恢复失败的探索

本文主要是介绍【经验分享】PT(persistent table)表异常导致gprecoverseg全量恢复失败的探索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

73fb7321-b931-460b-9e54-807a124126d8.jpg

 

了解更多Greenplum相关内容,欢迎访问Greenplum中文社区网站

背景

最近来自中兴通讯的系统架构师、敏捷教练王爱军在工作过程中,遇到gp5.20通过 gprecoverseg -F做全量恢复失败的异常。master和primary的pg_log日志中打印internal error,然后primary crash。本文分享问题的定位过程以及涉及到相关概念,供大家学习参考。

 

一、问题现象

 

1.1 集群状态查看

 

[gpadmin@instance-eqmn04jr pg_log]$ gpstate -s

 

8214e94d-7648-4b3d-ae4f-ef3f64c1e9ed.png

图1 Mirror Down

 

1.2 全量恢复

 

[gpadmin@instance-eqmn04jr pg_log]$ gprecoverseg -F

 

5125f619-e267-43dc-963c-c81ba68685fa.png

图2 gprecoverseg失败

 

1.3 master日志

 

5e10f6d7-914d-492c-86c7-a43057183b48.png

图3 master pg_log

 

  • 日志打印:QE执行command失败

    could not execute command on QE (cdbdisp_query.c:550)","Unexpected internal error (cdbpersistentfilespace.c:1163)。

  • QE:Query Executor对应primary segment。

  • QD:Query Dispatcher对应master。

 

1.4 primary日志

 

cfaceeac-daed-4833-9966-85ff1d51401b.png

图4 master pg_log

 

日志中线索:

  • "cdbpersistentfilespace.c",1163行代码抛异常。
  • PersistentFilespace_AddMirror 被调用
  • gp_add_segment_persistent_entries被调用

 

二、源码分析

 

代码位置:src/backend/cdb/ cdbpersistentfilespace.c

 

2.1 函数入口

 

51e6ecb9-2671-4a95-a513-3c178c7cf601.png

图5 函数入口

 

函数入参数说明:

  • filespace:文件空间oid

  • mirpath:mirror路径

  • pridbid:primary dbid

  • mirdbid:mirror dbid

 

2.2 抛错代码1163行

 

84bcf6d1-d1ee-48ec-8cb5-1eb8f2d78e93.png

图6 抛错代码

 

代码分析可以得到:

  • filespace对应的dbId1和dbId2 都不等于当前的pridbid,因而抛异常。

  • PT表(gp_persistent_filespace_node )数据可能出现不一致。

 

2.3 gp_persistent_filespace_node数据

 

i. utility方式查看filespace的PT信息

 

[gpadmin@instance-eqmn04jr cdb]$ PGOPTIONS='-c gp_session_role=utility' psql -dpostgres -p 25432

 

d6df3c08-bf23-4cfe-acc1-700ec9d13fed.png

图7 PT filespace信息

 

ii. 查看segment信息

 

[gpadmin@instance-eqmn04jr cdb]$ psql -dpostgres

 

ec1ffb79-1ccf-42ee-8542-044f95cf94c0.png

图8 segment信息

 

很明显gp_persistent_filespace_node中的db_id_1=21是一个不存在的dbid,在进行filespace状态同步匹配不到,从而抛错。正确的db_id_1应该为port=25432对应的dbid=2。

 

2.4 问题解决

 

i.更新PT(gp_persistent_filespace_node表)为正确值。

 

  示例:

1c484285-ac3e-4515-87ea-52bcf492ab1c.png

图9 更新PT表

 

(注:i.catalog表修改非常危险不要随意操作)

ii.重启集群,然后再次全量同步恢复mirror。

iii.PT表的修复需要在原厂专业人员指导下操作,否则可能会导致整个集群启动失败。

 

2.5 问题回顾

 

PT表的信息错误,遇到的非常偶然,该故障的定位和修复过程非常曲折,如不修复对整个集群有很大风险。

 

该故障应该是gp5.20的版本bug,已反馈给原厂研发人员,但由于故障难以复现,修复可能需要一些时间。很可能是数据库负荷过重,在做gprecoverseg增量恢复的时候primary segment crash,进而导致的状态同步信息没有正确的更新到对应的PT表中。

 

 

57d25da0-94f1-4e94-9d15-8f3c7e27c783.png

图10 release notes

 

三、概念说明

 

3.1 PT 表

 

PT(persistent table)的包含如下四张表,使用场景为通过gprecoverseg进行segment恢复,跟踪对象恢复的状态。
 

21af7a2c-57d5-4f21-b29b-e56dc1d70a2a.png

表1 PT表

 

3.2 实体对应的层次关系   

 

d8837381-f5f1-44d3-b910-fa7c41f2d0a3.png

图11 实体层次关系

 

为了提升IO能力,文件空间filespace可以指向高速存储,如ssd。表空间建立在对应的filespace,表建立在相应的tablespace上。创建文件空间的命令可以参考gpfilespace用法。PT表和filespace概念适用于gp5.x版本,gp6.x 取消了filespace以及PT表。

 

四、总结

 

本文总结了通过pg_log日志和源代码相结合,进行全量恢复失败的问题定位和解决过程。通过该方式可以洞悉问题的本源,对更好的运维Greenplum数据库提供帮助。

 

五、参考信息

 

https://github.com/greenplum-db/gpdb

https://docs.greenplum.org

https://cn.greenplum.org

 

作者简介

 

王爱军,中兴通讯系统架构师&敏捷教练

20年来一直工作在一线的老码农,目前就职于中兴通讯。主要工作方向为5G网络管理系统架构,近期在使用和研究Greenplum。


up-f175fefbeb33b30075a094498c554b31130.png


 

这篇关于【经验分享】PT(persistent table)表异常导致gprecoverseg全量恢复失败的探索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/162631

相关文章

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.

MySQL8.2.0安装教程分享

《MySQL8.2.0安装教程分享》这篇文章详细介绍了如何在Windows系统上安装MySQL数据库软件,包括下载、安装、配置和设置环境变量的步骤... 目录mysql的安装图文1.python访问网址2javascript.点击3.进入Downloads向下滑动4.选择Community Server5.

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

10个Python自动化办公的脚本分享

《10个Python自动化办公的脚本分享》在日常办公中,我们常常会被繁琐、重复的任务占据大量时间,本文为大家分享了10个实用的Python自动化办公案例及源码,希望对大家有所帮助... 目录1. 批量处理 Excel 文件2. 自动发送邮件3. 批量重命名文件4. 数据清洗5. 生成 PPT6. 自动化测试

10个Python Excel自动化脚本分享

《10个PythonExcel自动化脚本分享》在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式,本文将分享10个实用的Excel自动化脚本,希望可以帮助大家更轻松地掌握这些技能... 目录1. Excel单元格批量填充2. 设置行高与列宽3. 根据条件删除行4. 创建新的Excel工作表5

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

Redis多种内存淘汰策略及配置技巧分享

《Redis多种内存淘汰策略及配置技巧分享》本文介绍了Redis内存满时的淘汰机制,包括内存淘汰机制的概念,Redis提供的8种淘汰策略(如noeviction、volatile-lru等)及其适用场... 目录前言一、什么是 Redis 的内存淘汰机制?二、Redis 内存淘汰策略1. pythonnoe

Git中恢复已删除分支的几种方法

《Git中恢复已删除分支的几种方法》:本文主要介绍在Git中恢复已删除分支的几种方法,包括查找提交记录、恢复分支、推送恢复的分支等步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录1. 恢复本地删除的分支场景方法2. 恢复远程删除的分支场景方法3. 恢复未推送的本地删除分支场景方法4. 恢复