PostgreSQL DBA之数据库指标监控

常规监控

  • 连接数使用超过95%告警,最大连接数和当前连接数

  select (select count(*) from pg_stat_activity) /(select setting from pg_settings where name = 'max_connections') ::numeric >0.95;
  • 存在空闲连接idle in transaction大于5秒的连,如果长期存在这样的连接说明应用有问题,并且会造成数据库出现异常

 select count(*) from pg_stat_activity where state = 'idle in transaction' and now()-query_start>'5s'::interval);
  • 长事务,超过30分钟的慢sql

 select count(*) from pg_stat_activity where state <> 'idle' and (backend_xid is not null or backend_xmin is not null) and now()-xact_start > interval '1800 sec'::interval;
  • 数据库占用空间

 select pg_size_pretty(pg_database_size('postgres'));select datname, pg_size_pretty(pg_database_size(datname)) from pg_database;
  • 数据库中存在长时间阻塞的锁,阻塞超过3分钟

 selectkl.pid as 阻塞pid,a.usename as blocked_user,ka.query as 阻塞sql,ka.state as 阻塞sql状态,now()- ka.query_start as 阻塞语句执行时长,--阻塞的语句执行时长bl.pid as 被阻塞pid,ka.usename as 被阻塞用户,a.query as 被阻塞sql,now()- a.query_start as 被阻塞语句执行时长--被阻塞语句执行时长frompg_locks bljoin pg_stat_activity a ona.pid = bl.pidjoin pg_locks kl onkl.transactionid = bl.transactionidand kl.pid != bl.pidjoin pg_stat_activity ka onka.pid = kl.pidwherenot bl.grantedand now()- ka.query_start >'60s'::interval;--阻塞时长超过1分钟--阻塞pid对应的是数据库中pid,可以使用select pg_terminate_backend(pid);进行kill
  • 坏元组超过10000行,且占比超过20%的表

 select current_database(),schemaname||'.'||relname,n_dead_tup,n_live_tup,round(n_dead_tup*100/ (n_live_tup )::numeric,2)||'%' AS dead_tup_ratioFROMpg_stat_all_tablesWHEREn_dead_tup >= 10000 and n_live_tup>0 and (n_dead_tup)/(n_live_tup)::numeric>0.25 and schemaname not in ('pg_toast','pg_catalog','information_schema')ORDER BY dead_tup_ratio DESCLIMIT 10;
  • wal日志生成量

 --'AD/FAFFF2A8'是5分钟前select pg_current_wal_lsn()获取的值select pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),'AD/FAFFF2A8'));
  • 表缓存命中率和索引缓存命中率,命中率低于80%说明缓存不足

  • 注意,不常用的库缓存可能为0

 SELECT'index hit rate' AS name,(sum(idx_blks_hit)) / nullif(sum(idx_blks_hit + idx_blks_read),0) AS ratioFROM pg_statio_user_indexesUNION ALLSELECT'table hit rate' AS name,sum(heap_blks_hit) / nullif(sum(heap_blks_hit) + sum(heap_blks_read),0) AS ratioFROM pg_statio_user_tables;
  • 数据库年龄监控

  • 当age达到2亿会触发自动清理,如果大于5亿则告警

 select datname,age(datfrozenxid),pg_size_pretty(pg_database_size(oid)) from pg_database where age(datfrozenxid) > 500000000 order by age(datfrozenxid) desc limit 10 ;
  • 表年龄(用于查看详情,默认数据库年龄会存储表年龄最大的一条)

 select sp.nspname,relname,age(relfrozenxid), pg_size_pretty(pg_table_size(cl.oid)) from pg_class cl join pg_namespace sp on cl.relnamespace = sp.oid where relkind in ('t','r') order by age(relfrozenxid) desc limit 10;-- 说明:当age到达2亿(默认)时触发自动清理,期间会大量占用系统资源。提前做好监控避免在业务高峰时发生。可在库级别操作,也可在表基本操作。
  • 事务提交,事务回滚,全表扫描,索引扫描,插入记录,更新记录

 select sum(xact_commit),sum(xact_rollback),sum(tup_returned),sum(tup_fetched),sum(tup_inserted),sum(tup_updated),sum(tup_deleted),sum(conflicts),sum(deadlocks) from pg_stat_database;-- pg_stat_get_db_xact_commit 为stable函数,一个事务中两次调用之间只执行一次,所以需要外部多次执行。

回滚率计算:select xact_rollback/(xact_commit+xact_rollback),如果超过10%则代表回滚率较高

  • 过去5分钟内生成wal个数,可以判断当前数据库的dml频繁程度

 select count(1) from pg_catalog.pg_ls_waldir() where modification > CURRENT_TIMESTAMP - '5 minutes' :: INTERVAL ;
  • wal写入速率

  • lsn是一个递增的值

 SELECT CASE WHEN pg_is_in_recovery() THEN pg_last_wal_replay_lsn() ELSE pg_current_wal_lsn() END - '0/0' as wal_lsn;

高可用,逻辑复制

  • 现场使用arrs或者高可用,出现异常后并不知情,可监控复制状态,以及日志堆积大小判断当前复制情况

pg10+

  • 复制状态,true表示正常,false表示异常

  select active from pg_replication_slots;
  • 备库applay延迟,以及堆积情况

 selectapplication_name,client_addr,client_hostname,client_port,state,sync_priority,sync_state,pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn)),pg_wal_lsn_diff(pg_current_wal_lsn(),write_lsn) write_delay,pg_wal_lsn_diff(pg_current_wal_lsn(),flush_lsn) flush_delay,pg_wal_lsn_diff(pg_current_wal_lsn(),replay_lsn) replay_delyfrom pg_stat_replication ;
  • arrs复制延迟,以及堆积情况

  select slot_name, plugin, slot_type,temporary, active, active_pid,pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn)) frompg_replication_slots ;

pg10以下

  • 备库applay延迟,复制堆积超过1GB

 selectapplication_name,client_addr,client_hostname,client_port,state,sync_priority,sync_state,pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(),replay_location)),pg_xlog_location_diff(pg_current_xlog_location(),write_location) write_delay,pg_xlog_location_diff(pg_current_xlog_location(),flush_location) flush_delay,pg_xlog_location_diff(pg_current_xlog_location(),replay_location) replay_delyfrom pg_stat_replication;select slot_name, plugin, slot_type,active, active_pid,pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(), restart_lsn)) frompg_replication_slots;
  • 主从流复制延时时间 (从库执行)

 SELECT CASE WHEN pg_last_xlog_receive_location() = pg_last_xlog_replay_location() THEN 0 ELSE EXTRACT (EPOCH FROM now() - pg_last_xact_replay_timestamp()) END10 版本及以后SELECT CASE WHEN pg_last_wal_receive_lsn() = pg_last_wal_replay_lsn() THEN 0 ELSE EXTRACT (EPOCH FROM now() - pg_last_xact_replay_timestamp()) END;-- 主从复制延迟字节 (主库执行)select greatest(0,pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)) from pg_stat_replication ; where client_addr = '从库

慢SQL监控

  • 数据库需要安装插件pg_stat_statements

  • 在数据库中当前频繁执行的SQL TOP5

 SELECT C.rolname,b.datname,A.total_time / A.calls per_call_time,A.*FROMpg_stat_statements A,pg_database b,pg_authid CWHEREA.userid = C.oidAND A.dbid = b.oidORDER BYA.total_time DESCLIMIT 5
  • 最耗时 SQL,单次调用最耗时 SQL TOP5

 select userid::regrole, dbid, query from pg_stat_statements order by mean_time desc limit 5;
  • 最耗共享内存 SQL

 select userid::regrole, dbid, query from pg_stat_statements order by (shared_blks_hit+shared_blks_dirtied) desc limit 5;
  • 总最耗IO SQL TOP5

 select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time) desc limit 5;
  • 最耗IO SQL,单次调用最耗IO SQL TOP5

 select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time)/calls desc limit 5;
  • QPS

  witha as(select sum(calls)s from pg_stat_statements),b as(select sum(calls)s from pg_stat_statements,pg_sleep(1))select b.s-a.s --QPSfrom a,b;
  • 长期(30天)未更新统计信息的表,坏元组比例超过10%就应该触发更新统计信息(警告)

 SELECTto_char((now() - last_analyze), 'DD'), to_char((now() - last_autoanalyze),'DD' ) ,current_database(),schemaname||'.'||relname,n_live_tup,n_dead_tup,round(n_dead_tup*100/n_live_tup::numeric,2)||'%' as dead_tup_ratioFROMpg_stat_all_tablesWHEREschemaname not in( 'pg_toast','pg_catalog','information_schema' )AND (last_analyze IS null OR to_char((now() - last_analyze), 'DD') :: NUMERIC > 30)AND (last_autovacuum IS null OR to_char((now() - last_autovacuum),'DD') :: NUMERIC > 30)AND (last_autoanalyze IS null OR to_char((now() - last_autoanalyze),'DD' ) :: NUMERIC > 30)and n_dead_tup >= 10000 and n_live_tup>0 and (n_dead_tup)/(n_live_tup)::numeric > 0.1;
  • 未使用的索引

 SELECTschemaname || '.' || relname AS table,indexrelname AS index,pg_size_pretty(pg_relation_size(i.indexrelid)) AS index_size,idx_scan as index_scansFROM pg_stat_user_indexes uiJOIN pg_index i ON ui.indexrelid = i.indexrelidWHERE NOT indisuniqueAND idx_scan < 5AND pg_relation_size(relid) > 5 * 8192ORDER BY pg_relation_size(i.indexrelid) / nullif(idx_scan, 0) DESC NULLS FIRST,pg_relation_size(i.indexrelid) DESC;--修改后:SELECTschemaname || '.' || relname AS table,indexrelname AS index,pg_size_pretty(pg_relation_size(i.indexrelid)) AS index_size,pg_size_pretty(pg_relation_size(relid)),idx_scan as index_scansFROM pg_stat_user_indexes uiJOIN pg_index i ON ui.indexrelid = i.indexrelidWHERE NOT indisuniqueAND idx_scan < 5AND pg_relation_size(relid) > 5 * 8192*1000ORDER BY pg_relation_size(i.indexrelid) desc limit 5;
  • 表未创建主键

 SELECTcurrent_database (),ns.nspname,obj.relnameFROMpg_class obj,pg_namespace nsWHEREobj.relnamespace = ns.oidAND obj.relkind = 'r'AND ns.nspname NOT IN ('pg_toast','pg_catalog','information_schema')AND obj.oid NOT IN (SELECTobj.oid FROMpg_class obj,pg_index idxWHEREobj.oid = idx.indrelidAND idx.indisprimary = 'true')limit 10;
  • 数据库中存在触发器

 SELECTcurrent_database (),ns.nspname,rel.relname,tri.tgnameFROMpg_class rel,pg_namespace ns,pg_trigger triWHEREns.nspname NOT IN ('pg_toast','pg_catalog','information_schema')AND rel.oid = tri.tgrelidAND rel.relnamespace = ns.oidAND rel.relhastriggers = true and tgisinternal= = false;
  • 上班期间存在备份进程

 select st.application_name,st.datname,st.query_start,st.client_addr,client_hostname,query from pg_stat_activity st where state='active' and application_name='pg_dump';
  • 上班期间存在创建索引进程

 select st.application_name,st.datname,st.query_start,st.client_addr,client_hostnamefrom pg_stat_activity st where state='active' and (st.query ilike 'create index%' or st.query ilike 'create uniuqe index%');
  • 上班期间重建索引

 select st.application_name,st.datname,st.query_start,st.client_addr,client_hostname from pg_stat_activity st where state='active' and query ilike 'reindex%';
  • vacuum full进程

 select st.application_name,st.datname,st.query_start,st.client_addr,client_hostname,query from pg_stat_activity st where state='active' and query ilike 'vacuum full%';
  • 重复索引

 select allindx.schemaname,allindx.relname,allindx.indexrelname,ind.indexdef FROM pg_stat_all_indexes allindx,pg_indexes ind where allindx.relname=ind.tablename and allindx.indexrelname=ind.indexname and allindx.indexrelid :: VARCHARIN (SELECT regexp_split_to_table(indexs, $$,$$)FROM(SELECT string_agg (idx :: VARCHAR, $$,$$) AS indexsFROM(SELECT indexrelid :: oid AS idx,(indrelid :: TEXT || $$BB$$ || indclass :: TEXT || $$BB$$ || indkey :: TEXT || $$BB$$ || COALESCE (indexprs :: TEXT, $$BB$$) || $$BB$$ || COALESCE (indpred :: TEXT, $$BB$$)) AS val FROM pg_index ) subGROUP BYval HAVINGCOUNT (*) > 1ORDER BY SUM (pg_relation_size(idx)) desc) arr) and allindx.schemaname not in ('pg_toast','pg_catalog');

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/219636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EXCEL】vlookup,index/match查找函数

区别&#xff1a; 1.Vlookup函数只能查找列数据&#xff0c;即纵向查找&#xff0c;而IndexMatch函数&#xff0c;既可以纵向查找&#xff0c;也可以横向查找&#xff1b; 2、Vlookup函数查找的依据(第一个参数)必须位于数据源的第一列&#xff0c;IndexMatch函数组合则无此限制…

matlab操作方法(三)——matlab中的数字图像(读取、显示、保存)

数字图像是二维图像用有限数字数值像素的表示。通常像素在计算机中保存为二维整数数组的光栅图像&#xff0c;这些值经常用压缩格式进行传输和存储。 二值图像&#xff1a;图像中每个像素的亮度值仅可以取自0或1的图像&#xff0c;因此也称为1bit图像 灰度图像&#xff1a;图…

华为配置基本QinQ示例

组网需求 如图1所示&#xff0c;网络中有两个企业&#xff0c;企业1有两个分支&#xff0c;企业2有两个分支。这两个企业的各办公地的企业网都分别和运营商网络中的SwitchA和SwitchB相连&#xff0c;且公网中存在其它厂商设备&#xff0c;其外层VLAN Tag的TPID值为0x9100。 现…

方法命名约定

Java从第一天起就遵循这个命名约定。类似地&#xff0c;大多数Java-8引入的类都包含这个of(...)方法 Stream.of(...) LocalDate.of(year, month, dayOfMonth) Instant.ofEpochSecond(epochSecond) and many more. 不仅有valueOf或of方法可用&#xff0c;而且在不同的类中&…

StatusBar、NavigationBar窗口显示在Activity下面之aosp14窗口类bug线索征集

背景&#xff1a; hi&#xff0c;粉丝朋友们&#xff1a; 从上次帮助国际学员解决了一个分屏有黑屏的bug后&#xff0c;相关blog和解决方法 https://blog.csdn.net/learnframework/article/details/134708393 解决方法看b站视频&#xff1a; https://www.bilibili.com/video/B…

Spring的AOP基于注解之准备工作(需要添加的依赖以及配置文件)

添加完依赖会爆红&#xff0c;点击m标刷新即可 使用SpringAspectJ的AOP需要引入的依赖如下&#xff1a; <repositories><!--spring6里程碑版本的仓库--><repository><id>repository.spring.milestone</id><name>Spring Milestone Reposi…

《使用ThinkPHP6开发项目》 - 登录接口二

《使用ThinkPHP6开发项目》 - 登录接口一-CSDN博客 说到登录&#xff0c;这就涉及到数据验证和数据库 这里要创建数据库以及登录要用到的用户表 1&#xff09;创建管理员表 CREATE TABLE vanus_system_admin (id smallint(5) unsigned NOT NULL AUTO_INCREMENT COMMENT 管理…

【delphi11】delphi基础探索【二、 Delphi 的基本语法:变量声明、数据类型、控制语句】

一、变量声明 在 Delphi 中&#xff0c;变量声明是一个重要的概念。变量可以在程序的不同部分声明&#xff0c;例如在全局范围、局部范围或在类的定义中。以下是 Delphi 中各种变量声明方式的详细介绍&#xff1a; 1. 全局变量声明 全局变量在程序的单元&#xff08;Unit&…

路由器静态路由的配置

路由器静态路由的配置步骤如下&#xff1a; 进入系统视图。输入命令sys进入系统视图。配置路由器的接口IP地址。命令格式为int g0/0/0&#xff0c;其中g0/0/0表示路由器的接口&#xff0c;可以根据实际情况进行修改。然后使用命令ip add配置接口的IP地址。配置下一跳地址。在静…

【起草】1-2 讨论 ChatGPT 在自然语言处理领域的重要性和应用价值

【小结&#xff1a;ChatGPT 在自然语言处理领域的八种典型应用】 ChatGPT是一种基于Transformer模型的端到端生成式对话系统&#xff0c;采用自监督学习的方式ChatGPT是一种基于Transformer模型的端到端生成式对话系统&#xff0c;采用自监督学习的方式在海量无标注数据集上进…

PyTorch : torch.cuda.amp: 自动混合精度详解

amp : 全称为 Automatic mixed precision&#xff0c;自动混合精度 amp功能&#xff1a; 可以在神经网络推理过程中&#xff0c;针对不同的层&#xff0c;采用不同的数据精度进行计算&#xff0c;从而实现节省显存和加快速度的目的。 通常&#xff0c;深度学习中使用的精度为…

C# 编写Windows服务程序

1.什么是windows服务&#xff1f; Microsoft Windows 服务&#xff08;即&#xff0c;以前的 NT 服务&#xff09;使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动&#xff0c;可以暂停和重新启动而且不显示任何用…

Web前端 ---- 【Vue】Vue路由传参(query和params)

目录 前言 为什么用路由 路由route和路由器router Vue中路由的工作原理 安装配置vue-router 使用VueRouter 多级路由 路由传参 query传参 params传参 前言 本文介绍路由相关知识路由传参 为什么用路由 为了单页面应用开发&#xff0c;只更换组件&#xff0c;不频繁刷…

什么软件可以压缩视频大小?超级简单

什么软件可以压缩视频大小&#xff1f;当我们想将视频上传到网上时&#xff0c;有时候会遇到视频因为体积太大而无法上传的问题&#xff0c;这种情况就需要将视频进行压缩了。那什么软件可以压缩视频大小呢&#xff1f;下面小编就来为大家介绍压缩视频的方法&#xff0c;支持批…

django-release-debug-apache-mod-wsgi-原理解析

文章目录 1.django-release2.mod_wsgi2.1.winnt模式2.2.worker模式2.3.preforker模式2.4.小节 3.apache配置参数3.1.全局参数3.2.主机参数 4.总结 1.django-release 由于django处理静态资源的效率偏低&#xff0c;顾在release模式不支持静态资源&#xff0c;这种情况需要在apa…

极新AIGC行业峰会 | 圆桌对话:探索中国AGI迭代之路

“AGI正处在一个巨大的研发范式革命的起点。” 整理 | 周梦婕 编辑 | 小白 出品&#xff5c;极新 2023年11月28日&#xff0c;极新AIGC行业峰会在北京东升国际科学院拉开帷幕&#xff0c;峰会上午的圆桌环节由凡卓资本合伙人王梦菲主持&#xff0c;深势科技战略副总裁何雯…

SpringCache使用配置

项目中引入SpringCache pom文件引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId> </dependency>配置文件指定缓存类型 spring:cache:type: redis启动类开启缓存注解…

TikTok卖家攻略!如何保证账号安全和多账号防关联?

TIKTOK的火爆程度&#xff0c;大家都有目共睹。随之而来的是越来越多的人在上面开展在线业务。作为TikTok的卖家&#xff0c;保障账号安全和防止多账号关联是非常重要的。在这篇博客文章中&#xff0c;我们将分享一些关于如何保护TikTok账号安全和防止多账号关联的实用建议。 …

Spring Boot 3.x.x Spring Security 6.x.x @PreAuthorize 失效

Spring Boot 3.x.x Spring Security 6.x.x PreAuthorize 失效 背景问题解决备注 背景 最近在搞一个后端项目&#xff0c;登录、接口权限、token认证。 版本 Spring Boot 3.2.0 JDK 21 Spring Security 6.2.0 问题 PreAuthorize 失效&#xff0c;没有走认证。 解决 给PreAu…

生成小程序URLlink链接遇到的坑

这里写自定义目录标题 前端生成小程序URL link背景用户打开小程序的常用方法短链接短链接优缺点优点缺点 生成短链接步骤 可能会遇到的问题&#xff1a;其他 注意&#x1f4e2; 前端生成小程序URL link ![h5打开小程序](https://img-blog.csdnimg.cn/direct/a4cfe3ef6d184c6d9…