首页 > 其他分享 >MogDB openGauss故障排查流程

MogDB openGauss故障排查流程

时间:2024-03-14 12:12:18浏览次数:14  
标签:-- 内存 MogDB 排查 pg openGauss tup xlog size

MogDB/openGauss 故障排查流程

前提

如果有反馈说数据库响应慢或者压测过程中数据库有报错,第一步先收集数据库服务器资源使用情况,这一步是处理所有故障的前提。

--负载
top 命令
htop 命令

--cpu
lscpu 命令

--内存大小
free -g

--磁盘大小
df-Th

--磁盘使用跟踪
nohup iostat -xmt 1 > iostat.log 2>&1 &

--网络延时
应用程序与数据库之间的网络延时,集群内主库与同步备库之间的网络延时
nohup ping 目标ip | awk '{ print $0"\t" strftime("%Y-%m-%d %H:%M:%S",systime())}' > ping.log 2>&1 &

*模拟网络延时小知识*
模拟同城机房网络延迟在0.7ms ~ 0.9ms
添加网络延迟模拟:tc qdisc add dev enp23s0f1(网卡) root netem delay 0.8ms 0.1ms
删除网络延时模拟:tc qdisc dev dev enp23s0f1(网卡) root netem delay 0.8ms 0.1ms

常见问题

xlog 目录磁盘空间不足

xlog 日志目录满的原因有以下几个

1、集群内有宕机的备节点,或者主备节点之间的网络不通
2、无效的复制槽未及时清理
3、开启归档,但归档失败
4、xlog 保留数量过多

备节点故障

通过网络及数据库日志信息,判断节点故障原因,并尽快恢复主备节点之间的复制关系,当故障无法快速解决时,建议修改数据库参数来改变主库 xlog 保留大小

enable_xlog_prune = on
max_size_for_xlog_prune:默认是2T,建议修改值为104857600 (100GB),或根据磁盘空间自行调整
无效复制槽

查看是否存在无效的复制槽导致 xlog 清理不及时,需要将延时最大的复制槽删除

--查看复制槽
select slot_name,coalesce(plugin,'_') as plugin,
       slot_type,datoid,coalesce(database,'_') as database,
       active,coalesce(xmin,'_') as xmin,
       pg_size_pretty(pg_xlog_location_diff(CASE WHEN pg_is_in_recovery() THEN pg_last_xlog_receive_location() ELSE pg_current_xlog_location() END , restart_lsn))  AS retained_bytes
from pg_replication_slots;

--清理复制槽
select pg_drop_replication_slot('slot_name');
归档失效

先检查归档目录是否有归档日志,如果没有,需要查看数据库日志归档失效的原因。

xlog 参数不合理

检查数据库 xlog 保留参数值是否合理: wal_keep_segments

CPU 使用率高

除了数据库 BUG、其他程序耗 cpu 高影响数据库外,绝大部分原因是 SQL 执行慢且并发量大引起

1、当前正在执行的SQL汇总
select query,count(*) from pg_stat_activity group by query order by 2 desc limit 5;

2、查看sql的执行计划
explain (analyze,costs,buffers,timing) QUERY

3、sql涉及的表是否有表膨胀、索引失效或缺失或重复 的情况,这步可以处理80%的慢sql

--表结构
\d+ 表名

--表及索引占空间大小
SELECT CURRENT_CATALOG AS datname,nsp.nspname,rel.relname,
        pg_size_pretty(pg_total_relation_size(rel.oid))       AS totalsize,
        pg_size_pretty(pg_relation_size(rel.oid))             AS relsize,
        pg_size_pretty(pg_indexes_size(rel.oid))              AS indexsize,
        pg_size_pretty(pg_total_relation_size(reltoastrelid)) AS toastsize
FROM pg_namespace nsp
JOIN pg_class rel ON nsp.oid = rel.relnamespace
WHERE nspname NOT IN ('pg_catalog', 'information_schema') AND rel.relkind = 'r'
order by pg_total_relation_size(rel.oid) desc
limit 20;

--表膨胀
select schemaname,relname,n_live_tup,n_dead_tup,
	round((n_dead_tup::numeric/(case (n_dead_tup+n_live_tup) when 0 then 1 else (n_dead_tup+n_live_tup) end ) *100),2) as dead_rate
from pg_stat_user_tables
where n_live_tup > 0 and (n_dead_tup::numeric/(n_dead_tup+n_live_tup))>0
order by 5 desc limit 50;

--索引使用率
select schemaname||'.'||relname tablename,schemaname||'.'||indexrelname indexname,idx_scan,idx_tup_read,idx_tup_fetch from pg_stat_user_indexes;

--重复索引
SELECT pg_size_pretty(SUM(pg_relation_size(idx))::BIGINT) AS SIZE,
       (array_agg(idx))[1] AS idx1, (array_agg(idx))[2] AS idx2,
       (array_agg(idx))[3] AS idx3, (array_agg(idx))[4] AS idx4
FROM (
    SELECT indexrelid::regclass AS idx, (indrelid::text ||E'\n'|| indclass::text ||E'\n'|| indkey::text ||E'\n'||COALESCE(indexprs::text,'')||E'\n' || COALESCE(indpred::text,'')) AS KEY
    FROM pg_index) sub
GROUP BY KEY HAVING COUNT(*)>1
ORDER BY SUM(pg_relation_size(idx)) DESC;

4、根据执行计划判断sql是否需要改写

内存不足

1、查看服务器物理内存整体使用情况。
2、检查数据库内存参数设置是否合理:
max_process_memory 建议设置物理内存 80%
shared_buffers 建议设置为物理内存的 40%

数据库内存使用分布

查看整体内存使用情况,当 dynamic_used_memory 与 max_dynamic_memory 的值接近时说明动态内存可能不足,如果 dynamic_peak_memory 超过了 max_dynamic_memory,说明曾经发生过 oom

select * from gs_total_memory_detail;
连接过多耗尽内存

主要排除是连接数过多导致内存不足的场景

查看连接数分布
select state,count(*) from pg_stat_activity group by state;

各状态连接占用总内存情况
select state,pg_size_pretty(sum(totalsize))
from gs_session_memory_detail m,pg_stat_activity a
where substring_inner(sessid,position('.' in sessid)+1)=a.sessionid
group by state;

单会话占用内存排序
select sessid,pg_size_pretty(sum(totalsize)),pg_size_pretty(sum(freesize)) from gs_session_memory_detail group by sessid order by sum(totalsize) desc limit 10;
缓存机制

会话的缓存机制不合理,也会导致内存无法快速释放,可能与参数 local_syscache_threshold 有关系。

内存上下文使用内存分布
select contextname,pg_size_pretty(sum(totalsize)),pg_size_pretty(sum(freesize)) from gs_session_memory_detail group by contextname order by sum(totalsize) desc limit 10;
总结

动态内存高一般有以下几个原因:
1、连接数过多会导致动态内存耗尽,
如果是 idle 连接多,可能是开发端长连接保留数量不合理;
如果是 active 连接多,可能是硬件内存不足,需要扩内存。

2、单个会话占用内存多,需要根据 sql 去分析占用内存情况

标签:--,内存,MogDB,排查,pg,openGauss,tup,xlog,size
From: https://www.cnblogs.com/renxyz/p/18072560

相关文章

  • MogDB openGauss数据库扩缩容的几种方式
    MogDB/openGauss数据库扩缩容的几种方式文本出处:https://www.modb.pro/db/453105随着业务的发展,业务系统对数据库的架构要求也在变化,比如需要读负载均衡、机房搬迁、服务器硬件替换等等,这需要在原数据库主备架构的基础上进行扩/缩容操作,目前MogDB数据库安装方式有三种,分别是......
  • openGauss分区表
    openGauss分区表概述openGauss是基于PostgreSQL9.2.4的内核开发的,在PostgreSQL10之前要达到实现分区表的效果可以有两种方式,一种是使用继承的触发器函数来实现,一种是安装pg_pathman的插件来实现,直到PostgreSQL10才引入了partition的语法;而opengauss从开源发布就可......
  • openGauss备库wal-replay与query冲突
    openGauss备库walreplay与query冲突概述openGauss的物理流复制逻辑继承了PostgreSQL,当一条数据从主库做变更到可以在备库查询到最新的值,在PostgreSQL备库分为三个阶段,分别是写入备库操作系统(remote_write),将缓存中的数据刷入到磁盘(on==flush),从磁盘将数据库回放(remot......
  • openGauss SQL引擎插件开发指导
    开发流程①在openGauss社区Plugin仓进行兼容性相关开发(https://gitee.com/opengauss/Plugin)②通过fastcheck自测以及CI门禁③提供checkin测试报告和开发文档并通过SIG组评审开发要点开放接口函数DLL_PUBLICPG_FUNCTION_INFO_V1_PUBLIC统一管理为了避免......
  • openGauss SQL引擎插件开发指导
    开发流程①在openGauss社区Plugin仓进行兼容性相关开发(https://gitee.com/opengauss/Plugin)②通过fastcheck自测以及CI门禁③提供checkin测试报告和开发文档并通过SIG组评审开发要点开放接口函数DLL_PUBLICPG_FUNCTION_INFO_V1_PUBLIC统一管理为了避免......
  • openGauss账本数据库,你不知道的那些事儿
    openGauss账本数据库,你不知道的那些事儿摘要本文将通过对比官方文档关于“设置账本数据库”中的几个章节,结合源码来说说文档中操作步骤背后的原理。账本数据库概述你知道的那些事儿官方文档账本数据库融合了区块链思想,将用户操作记录至两种历史表中:用户历史表和全局区块表......
  • 轻松掌握锁冲突问题的排查方法——《OceanBase诊断系列》之八
    1.前言OceanBase数据库通过两阶段封锁机制确保读写事务并发控制的正确性。在高冲突场景下,事务处理中经常会遇到行锁冲突的问题。然而,许多OceanBase用户对于何时发生锁冲突,锁冲突的表现如何,以及如何排查锁冲突的原因,甚至于定位具体的行与锁冲突的会话。本文为读者提供一个系统......
  • Smb3.0多通道技术及故障排查
    Smb3.0多通道技术有RSS和RDMA网卡或两种网卡叠加实现微软是建议网卡带有RSS和RDMA,因为RDMA网卡很贵我没有条件测试。以下针对RSS-SMBRSS(receivesidescaling)功能中文名叫“接收端调整”,CPU多核心时,每核心(非超线程)可用一个线程发起一个通道。SMB多通道的要求由于默认情......
  • k8s生产中遇到什么特别映像深刻的问题吗,问题排查解决思路是怎么样的?
    答:前端的lb负载均衡服务器上的keepalived出现过脑裂现象。1、当时问题现象是这样的,vip同时出现在主服务器和备服务器上,但业务上又没受到影响;2、这时首先去查看备服务器上的keepalived日志,发现有日志信息显示凌晨的时候备服务器出现了vrrp协议超时,所以才导致了备服务器接管了vip;查......
  • 排查 dotNET Core 程序内存暴涨的问题
    0.问题新版本上线之后,发现内存猛涨,入站流量猛增,不清楚具体原因,部分接口提示OOM异常,随后Pod直接崩溃无限重启。1.准备Pod已经接入了NewRelic和Graylog,但是仍然没有办法找到真正的罪魁祸手,此时只能进入Pod容器当中抓取内存Dump信息。我们容器的基础镜像是基于Apli......