openGauss
开源数据库
openGauss社区官网
开源社区
openGauss监控场景处理
2021-01-28openGauss异常处理
openGauss 监控场景处理
死锁数量异常
判断方法:
select sum(deadlocks) as deadlocks from dbe_perf.GLOBAL_STAT_DATABASE
异常分析:
- 请求与保持条件:获取资源的进程可以同时申请新的资源。
- 非剥夺条件:已经分配的资源不能从该进程剥夺。
- 循环等待条件:多个进程构成环路,并且每个进程都在等待相邻进程正占用的资源。
- 互斥条件:资源只能被一个进程使用。
解决方案
- 检索出死锁进程的 ID(select oid,relname from pg_class where relname=‘all_date’;),检索出来的字段中,waiting 字段数据为 t 的那条就是死锁进程,找到对应的 procpid 列的值。
- 将进程杀掉,select pg_cancel_backend(‘死锁那条数据的 procpid 值’),运行之后再次更新这个表,sql 顺利执行。
- 如果 pg_stat_activity 没有记录,则查询 pg_locks 是否有这个对象的锁,select pid_locks where relation=‘上面查询出来的 oid’;然后杀掉进程。
运维建议
- 在所有事务中都以相同的次序使用资源。
- 使事务尽可能简单并在一个批处理中。
- 为死锁超时参数设置一个合理范围。
- 避免在事务内和用户进行交互,减少资源锁定时间。
- 使用较低的隔离级别。
主备复制状态异常
判断方法
gs_om -t status|grep cluster_state|grep Normal|wc -l
异常分析
- 可能存在批量处理大量数据导致主从节点宕机,主节点重启后从节点 WAL 同步信息不完整。
- 主库宕机或者失联 3.备库宕机或者失联。
解决方案
- 通过查看主备状态判断是主节点还是备节点故障。
- 主节点故障可以尝试重启主节点,若不生效,可以再备节点使用 gs_ctl failover -D “备节点的数据目录”,然后刷新机器(gs_om -t refreshconf),这时如果主机好了,直接启动出现两主,这时使用 gs_ctl build -D “主节点的数据目录” -b incremental。
- -b 参数为指定重建备机的模式,incremental 为取主备差异的数据增量修复备机。
备机回放 gap 使用空间异常
判断方法
select read_ptr-last_replayed_read_ptr as replay_gap from dbe_perf.GLOBAL_REDO_STATUS
异常分析
- 开启了数据文件的 checksum,因为回放时需要大量的 CPU 资源,在进行 checksum 时会消耗 startup 进程的资源。
- 主库频繁的离散 IO 操作,如大量的索引变更,大量的 vacuum 操作。
- 频繁和大量的系统调用。
解决方案
- 关闭 checksum,除非要防御物理篡改。
- 删除没有必要的索引。
- 根据业务调整垃圾回收的调度。
- 检查点拉长,可以减少 full page 的量。
- 加大备库的 shared buffer。
- 关闭 IO 时间的跟踪。
- 备库使用 IOPS 能力更强,IO 延迟更低的机器。
- 调整内核参数,使用并行 apply。
- 如果有多个备库,备库可以关闭 fsync。
- 将冻结年龄加大,可以减少冻结产生的 redo。
- 增加单个进程可打开的文件数。
长查询时间异常
判断方法
select EXTRACT (epoch from max(current_timestamp - query_start)) from dbe_perf.SESSION_STAT_SCTIVITY where query_start is not null and state=‘active’ and application_name not like ‘dn_%’;
异常分析
- SQL 未经过优化,没有走合适的索引。
- 可能存在锁争用问题。
- 可能存在全表扫描问题。
解决方案
- 查看对应语句的执行计划并作出相应的优化。
- 创建合适的索引。