掘金 后端 ( ) • 2024-06-13 10:02

theme: awesome-green

作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验,
Oracle、PostgreSQL ACE
CSDN博客专家及B站知名UP主,全网粉丝10万+
擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,
安装迁移,性能优化、故障应急处理
•••

@TOC

@TOC

前言

某制造业大厂,企业核心的生产系统使用openGauss国产数据库集群,突发备库节点服务器操作系统无法启用,同时发现主库核心的数据目录异常,部分数据目录被客户误删除,主节无法启动,修复过程分享给大家。

1.故障现象

通过现场沟通了解到,客户机房由于异常掉电,造成一套openGauss集群的备库节点操作系统主异常无法启动,还好主节点正常,启动集群失败,此时只能通过启动单节点方式进行恢复

2.故障处理

2.1 单节点启动

由于备机已经无法访问了,导致om启动不了
通过以下命令启动即可
[omm@node1 ~]$ gs_ctl start -D /u01/opengauss/data/db -M primary

--通过此命令我们查询,集群备节点异常
[omm@node1 ~]$ gs_om -t status --detail

--登陆数据库,业务恢复正常
[omm@node1 ~]$ gsql -d postgres

2.2 全库备份

--全库数据量查询
SELECT d.datname as "Name",
       pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
       pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
       d.datcollate as "Collate",
       d.datctype as "Ctype",
 d.datacl AS "Access privileges",
       --pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges",
       CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
            THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
            ELSE 'No Access'
       END as "Size",
       t.spcname as "Tablespace",
       pg_catalog.shobj_description(d.oid, 'pg_database') as "Description"
FROM pg_catalog.pg_database d
  JOIN pg_catalog.pg_tablespace t on d.dattablespace = t.oid
-- where d.datname = 'database_name'
ORDER BY 1;

--全库备份
gs_dumpall -f /home/omm/bkpall_20240607.sql -p 5432

3.备机重建

如果新的备机Ip改了,需要主备库参数修改后重建整个集群

主机:

gs_guc set -D /u01/opengauss/data/db -c "replconninfo1='localhost=主机ip localport=port+1 localheartbeatport=port+4 localservice=port+5 remotehost=备机IP remoteport=port+1 remoteheartbeatport=port+4 remoteservice=port+5'"
gs_guc set -D /u01/opengauss/data/db -c 'remote_read_mode=off';
gs_guc set -D /u01/opengauss/data/db -c 'replication_type=1';
gs_guc set -D /u01/opengauss/data/db -h "host all omm 主机ip/32 trust"        
gs_guc set -D /u01/opengauss/data/db -h "host all omm 备机IP/32 trust" 
gs_guc set -D /u01/opengauss/data/db -c "port=主机端口"
gs_guc set -D /u01/opengauss/data/db -c "listen_addresses='主机ip'"


备机:
gs_guc set -D /u01/opengauss/data/db -c "replconninfo1='localhost=备机ip localport=port+1 localheartbeatport=port+4 localservice=port+5 remotehost=主机IP remoteport=port+1 remoteheartbeatport=port+4 remoteservice=port+5'"
gs_guc set -D /u01/opengauss/data/db -c 'remote_read_mode=off';
gs_guc set -D /u01/opengauss/data/db -c 'replication_type=1';
gs_guc set -D /u01/opengauss/data/db -h "host all omm 主机ip/32 trust"        
gs_guc set -D /u01/opengauss/data/db -h "host all omm 备机IP/32 trust" 
gs_guc set -D /u01/opengauss/data/db -c "port=备机端口"
gs_guc set -D /u01/opengauss/data/db -c "listen_addresses='备机IP'"

主机启动:
gs_ctl start -D /u01/opengauss/data/db -M primary

备机启动
gs_ctl start -D /u01/opengauss/data/db -M standby
gs_ctl build -D /u01/opengauss/data/db -M standby -b full

如果备机修复好,还可以用,直接建逻辑复制通道后,gs_ctl build -D 数据库目录即可恢复集群

4.cm_ctl集群工具

cm_ctl是openGauss提供的用来控制数据库实例服务的工具。该工具主要供OM调用,及数据库实例服务自恢复时使用。cm_ctl的主要功能有:
● 启动数据库实例服务、AZ的所有实例、单个主机上的所有实例或单独启动某个实例进程。
● 停止数据库实例服务、AZ的所有实例、单个主机上的所有实例或单独停止某个节点实例进程。
● 重启逻辑数据库实例服务。
● 查询数据库实例状态或者单个主机的状态。
● 切换主备实例或重置实例状态。
● 重建备机。
● 查看数据库实例配置文件。
● 设置日志级别,一主多备数据库实例部署下cm_server的仲裁模式、AZ之间的切换模式。
● 获取日志级别,一主多备数据库实例部署下cm_server的仲裁模式、AZ之间的切换模式。
● 检测实例进程状态。

5.总结

本次故障我们发现,其实国产数据库openGauss的集群故障的处理机制还是蛮完善的,尤其备库的重构很不错的