openGauss升级问题临时处理措施

本文主要通过两个升级问题案例介绍升级问题的一些临时处理措施。

就地升级失败导致gsql无法连接数据库,数据无法取出

问题

如图,在就地升级过程中,重建pg_proc_oid_index失败导致升级失败

升级失败后集群状态虽然正常,但是在使用gsql连接数据库的时候出现报错,无法连接数据库,且无法继续升级也无法回退,数据也无法取出

临时处理措施

查看代码发现该问题已在9个月前修复

从修复代码可以看到是由于少执行了一条重建命令,但是现在由于gsql等客户端无法登录数据库,所以需要使用其他方式登录数据库执行该命令。

(1)先停掉数据库,然后以单用户模式登录数据库,命令如下

gaussdb --single -D /home/gbase/gbase_data/install/data/dn/ postgres

登录后界面是这样的

(2)登录后执行如下命令

alter index pg_proc_oid_index rebuild;

在该模式下需要注意,不能使用元命令例如\d等,不能输入【退格键】,所以如果输入错误,回车重新输入即可,执行完成后,按ctrl + d即可退出。

  1. 然后正常启动数据库,正常使用gsql即可登录postgres库
  2. 注意,此时可能其他库仍然无法使用gsql直接登录,可以先登录进入postgres库,然后使用如下命令
\c 库名

切换到其他库,然后再次执行以上重建pg_proc_oid_index的命令即可。

升级成功但是部分命令由于升级导致使用出现问题

问题

ERROR: function pgcatalog.gs.catalog_attribute_records(unknown) is not unique【M】 · Issue #I942SL · openGauss/openGauss-server - Gitee.com

修复pr:

修复升级后报错pg_catalog.gs_catalog_attribute_records函数不唯一问题 · Pull Request !4983 · openGauss/openGauss-server - Gitee.com

问题根因是由于升级脚本有误

临时处理措施

对于已经升级提交完成但是出现这个问题的环境,提供两个小脚本可以用于修复该问题

replace_attribute.sh,内容如下

#!/bin/bash
port=$1

# 表示进入灰度升级模式,如果升级处于尚未提交状态,则此脚本中可以不用修改该参数
gs_guc reload -I all -N all -c "upgrade_mode=2"
for db in `gsql -tA -d postgres -p $port -c "select datname from pg_database;"`
do
    echo $db
    gsql -d $db -p $port -f create_func.sql --variable=ON_ERROR_STOP=on
done

# 表示结束升级模式,如果升级处于尚未提交状态,则千万不要手动修改该参数为0,改为0就表示提交了,就不能再回退了
gs_guc reload -I all -N all -c "upgrade_mode=0"

其中的create_func.sql内容如下

start transaction;

SET IsInplaceUpgrade = on;

DROP FUNCTION IF EXISTS pg_catalog.gs_catalog_attribute_records(oid);

SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, 8010;

CREATE OR REPLACE FUNCTION pg_catalog.gs_catalog_attribute_records(IN relid oid, OUT attrelid oid, OUT attname name, OUT atttypid oid, OUT attstattarget integer, OUT attlen smallint, OUT attnum smallint, OUT attndims integer, OUT attcacheoff integer, OUT atttypmod integer, OUT attbyval boolean, OUT attstorage "char", OUT attalign "char", OUT attnotnull boolean, OUT atthasdef boolean, OUT attisdropped boolean, OUT attislocal boolean, OUT attcmprmode tinyint, OUT attinhcount integer, OUT attcollation oid, OUT attacl aclitem[], OUT attoptions text[], OUT attfdwoptions text[], OUT attinitdefval bytea, OUT attkvtype tinyint) RETURNS SETOF RECORD STRICT STABLE ROWS 1000 LANGUAGE INTERNAL AS 'gs_catalog_attribute_records';



commit;

使用方法:

将这两个脚本放到环境上同一目录下,source环境变量后,运行replace_attribute.sh脚本,脚本唯一参数为数据库端口号

对该方法做一些简要介绍:

该方法就是模拟执行升级脚本的过程,除了执行的升级脚本不同,其他的动作都是一致的。

首先修改升级模式upgrade_mode,表示开始进入升级模式。

然后开始执行升级事务,执行升级事务首先要将IsInplaceUpgrade设置为on,表示该处于升级过程中。

最后执行完升级事务提交后,再将升级模式upgrade_mode改回0。

需要注意的是如果在此之前,数据库未处于升级状态,则无需修改upgrade_mode,直接执行对应的升级脚本即可。

3个升级参数的说明如下

 所以如果遇到其他类似的问题,也可以使用该方法进行修复,只需修改对应的关键升级语句即可。

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值