• Greenplum数据库故障分析——版本升级后gpstart -a为何返回失败


    案例背景

    现场项目进行Greenplum数据库小版本升级时,升级脚本报错,提示数据库启动失败。但是我们从跳板机进入数据库节点使用gpstart交互模式启动集群时,集群是能够启动的,standby master是不可用的。什么原因造成了使用gpstart -a启动失败,使用gpstart启动就能成功呢?作为团队入职两年的小开发一枚,秉承通过故障分析才能快速切入学习数据库路径的原则,接下了这个活,难免需要加个班处理一下。

    分析过程

    首先我们发现gpstart和gpstart -a除了交互外,会尝试对standby master进行启动,如果不能启动则跳过。我们的排除方向也应该是这边,首先复现场景后,使用gpstart -m只拉起master节点,utility模式登陆进master节点,执行select * from gp_segment_configuration where content = -1;查找master和standby master对应的记录。这里发现standby master在系统表中标记为正常,但是我们在standby master节点的gpseg-1目录下发现其数据文件并不是很全,比如就没有postgresql.conf。因此判定肯定是gpinitstandby脚本运行出错,查看日志如下所示:

    gpinitstandby:xxx:gpadmin-[ERROR]:-Error initializing standby master: Standby master not configured
    gpinitstandby:xxx:gpadmin-[ERROR]:-Request mode to remove warm master standby, but no standby located.
    gpinitstandby:xxx:gpadmin-[ERROR]:-Error removing standby master: no standby configured
    gpinitstandby:xxx:gpadmin-[INFO]:-Validating environment and parameters for standby initialization...
    gpinitstandby:xxx:gpadmin-[INFO]:-------------------------------------------
    gpinitstandby:xxx:gpadmin-[INFO]:Greenplum standby master initialization parameters
    gpinitstandby:xxx:gpadmin-[INFO]:-------------------------------------------
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum master hostname					= xxx
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum master data directory			= /home/gpadmin/data/master/default/gpseg-1
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum master port						= 5432
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum standby master hostname			= xxx
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum standby master port				= 5432
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum standby master data directory	= /home/gpadmin/data/master/default/gpseg-1
    gpinitstandby:xxx:gpadmin-[INFO]:-Greenplum update system catalog			= On
    gpinitstandby:xxx:gpadmin-[INFO]:-Syncing Greenplum Database extensions to standby
    gpinitstandby:xxx:gpadmin-[INFO]:-The packages on xxx are consistent
    gpinitstandby:xxx:gpadmin-[INFO]:-Adding standby master to catalog...
    gpinitstandby:xxx:gpadmin-[INFO]:-Database catalog updated successfully.
    gpinitstandby:xxx:gpadmin-[INFO]:-Updating pg_hba.conf file...
    gpinitstandby:xxx:gpadmin-[INFO]:-pg_hba.conf files updated successfully.
    gpinitstandby:xxx:gpadmin-[ERROR]:-Failed to copy data directory from master to standby.
    gpinitstandby:xxx:gpadmin-[ERROR]:-Failed to create standby
    gpinitstandby:xxx:gpadmin-[WARNING]-Trying to rollback changes that have been made...
    gpinitstandby:xxx:gpadmin-[INFO]:-Rolling back catalog change...
    gpinitstandby:xxx:gpadmin-[ERROR]:-Failed to remove standby from master catalog.
    gpinitstandby:xxx:gpadmin-[INFO]:-Restoring pg_hba.conf file...
    gpinitstandby:xxx:gpadmin-[INFO]:-Cleaning up pg_hba.conf backup files...
    gpinitstandby:xxx:gpadmin-[INFO]:-Backup files of pg_hba.conf cleaned up successfully.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    从上面日志可以看出在升级前HA组件在修复standby master,gpinitstandby运行到从master数据目录拷贝数据到standby master时,升级脚本关闭了greenplum集群,导致的失败。由于greenplum集群关闭了,回滚gp_segment_configuration中的standby记录失败。因此使用gpstart -a启动时,脚本认为standby master是正常的,就尝试去启动,当然会失败啦。

    产生原因

    在升级前HA组件在修复standby master,gpinitstandby运行到从master数据目录拷贝数据到standby master时,升级脚本关闭了greenplum集群,导致的失败。由于greenplum集群关闭了,回滚gp_segment_configuration中的standby记录失败。

    解决方案

    考虑三种方案:

    1. gpstart -am启动master节点;执行PGOPTIONS="-c gp_session_role=utility" psql -d postgres -c "select gp_remove_master_standby()";执行gpstop -ar
    2. gpstart -am启动master节点;执行PGOPTIONS="-c gp_session_role=utility" psql -d postgres -c "set allow_system_table_modes=true; update gp_segment_configuration set status = 'd' where content = -1 an role = 'm'; ";执行gpstop -ar
    3. gpstart -aS。加上大写的S参数会直接跳过standby master启动
      采用第3中方案,升级后由HA来处理standby master的修复启动问题。
  • 相关阅读:
    Docker基础入门:Docker基础总结篇--超详细
    LightDB兼容Oracle table_exists_action功能
    G1D17-研究方向&rce45-49&不快乐就去敲敲代码
    C语言volatile关键字
    同花顺_代码解析_交易系统_J01_08
    基于SSM+Vue的亿互游在线平台的设计与开发
    【C语言数据结构————————二叉树】
    低代码 系列 —— 可视化编辑器2
    LeetCode-1206-设计跳表
    C++周周练【第一周】
  • 原文地址:https://blog.csdn.net/asmartkiller/article/details/126072103