数据库对象
表膨胀
监控原因: 在更新数据时,是不直接删除老数据的。一个 update 操作执行后,被更改的数据的旧版本也被保留下来,直到对表做 vacuum 操作的时候,才考虑回收旧版本。做数据更新时,这些旧版本不及时回收就会造成表膨胀,比如全表的 update 操作、大量的insert+delete 操作、长事务、未决事务、复制槽等待都会引用表膨胀。表膨胀会占用大量存储空间,并且当执行 sql,遍历数据的元组时,会耗费更多的时间,产生额外的不必要的 IO 负载。
相关查看命令:
SELECT schemaname||'.'||relname AS table_name,
pg_size_pretty(pg_relation_size(schemaname||'.'||relname)) AS table_size,
n_dead_tup,
n_live_tup,
round(n_dead_tup * 100 / (n_live_tup + n_dead_tup),2) AS dead_tup_ratio FROM pg_stat_all_tables
WHERE
n_dead_tup >= 1000
ORDER BY dead_tup_ratio DESC
LIMIT 10;
备注: N_DEAD_TUP 越大,代表该表 update 、delete 操作较多,即表的碎片垃圾越多,表膨胀的越厉害
索引有效性
监控原因: 如果索引所基于的表上 DML 操作频繁(在索引所在的列),那么随着时间的推移,索引的效率可能会变得越来越差,导致部分 sql 不走索引反而比走索引还快。
相关查看命令:
SELECT * FROM pg_stat_all_indexes WHERE schemaname = '***' AND relname = '***'
这个 SQL 可以查看目标表上有哪些索引,和索引的使用情况。输出结果中反馈了该表上索引名和索引扫描次数,对于没必要的索引会占用空间,建议删除,其他情况按对应 sql 结合分析。
死锁检查
监控原因: 死锁通常发生在同时进行多个事务的并发环境中。当多个事务都持有某些资源,并且都等待其他事务释放它们所需的资源时,死锁就会发生。死锁会导致以下问题:性能下降:由于事务被阻塞,其他事务可能无法及时完成,导致整个系统的性能下降。数据一致性问题:当死锁发生时,事务可能会在没有完全提交的情况下终止,导致数据一致性问题。
相关查看命令:
SELECT database,relation,sc.relname,pid,mode,granted FROM pg_locks sl LEFT JOIN pg_database sd AND sl.database=sd.oid left join pg_class sc AND sl.relation=sc.oid WHERE pg_backend_pid()<>sl.pid AND granted='f';
执行方式: 集中式数据库在主库进行查询。
数据库年龄
监控原因: 当数据库年龄超过阈值,事务号会发生回卷,此时数据库会报错并且拒绝接受所有连接影响到所有业务的正常进行。根据现场年龄增长情况,设置告警阈值,及时处理。
相关查看命令:
SELECT datname,age(datfrozenxid) FROM pg_database;
执行方式: 集中式数据库要在主库执行。
执行解决办法: 找到年龄最大的表依次对单表进行 vacuum freeze




