前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >PostgreSQL 扫盲贴 常用的监控分析脚本

PostgreSQL 扫盲贴 常用的监控分析脚本

作者头像
AustinDatabases
发布2025-03-03 13:24:03
发布2025-03-03 13:24:03
5200
代码可运行
举报
文章被收录于专栏:AustinDatabasesAustinDatabases
运行总次数:0
代码可运行

正文:

我一直有一个错觉,大家的POSTGRESQL的技术都非常了得,在年前实际上对我有几次的感触。

1 不会装POSTGRESQL 的人有的是

2 基本概念和理解不明白的有的是

3 对于POSTGRESQL 来说,MYSQL 的确是曾经非常的热,至少MYSQL的一些白痴问题,问的人比较少

OK 既然如此,也不能天天高大上,咱们也的有接地气的,今天就奉送大量的PostgreSQL的脚本给一些初学者

1 查询数据库信息

代码语言:javascript
代码运行次数:0
复制
SELECT 
    pg_database.datname AS database_name,
    pg_size_pretty(pg_database_size(pg_database.datname)) AS size
FROM 
    pg_database;
代码语言:javascript
代码运行次数:0
复制
          database_name           |  size   
-----------------------------------+---------
 postgres                          | 7925 kB
 template1                         | 7957 kB
 template0                         | 7769 kB
 rddsadd                          | 8005 kB
 SaasCenter1                    | 46 GB
 serverNew                      | 2025 MB
 IterativeDev                   | 8101 kB

2 表查询索引大小的信息

代码语言:javascript
代码运行次数:0
复制
SELECT 
    t.relname AS table_name,
    pg_size_pretty(pg_indexes_size(t.oid)) AS index_size
FROM 
    pg_class t
JOIN 
    pg_namespace n ON n.oid = t.relnamespace
WHERE 
    n.nspname NOT IN ('pg_catalog', 'information_schema')
    AND t.relkind = 'r'  -- 只选择普通表
ORDER BY 
    pg_indexes_size(t.oid) DESC;
代码语言:javascript
代码运行次数:0
复制
                 table_name                 | index_size 
--------------------------------------------+------------
 sysd_log                                    | 2314 MB
 bizd_sc                                     | 2121 MB
 bizd_bs                                     | 1736 MB
 bizd_ts_payway                              | 1718 MB
 bizd_ts                                     | 1372 MB
 kcd_ksc_bak                                 | 1115 MB
 bizd_ss                                     | 1080 MB

3 索引和表之间的关系,索引占多大

代码语言:javascript
代码运行次数:0
复制
SELECT 
    t.relname AS table_name,
    pg_size_pretty(pg_total_relation_size(t.oid)) AS total_size,
    pg_size_pretty(pg_relation_size(t.oid)) AS table_size,
    pg_size_pretty(pg_indexes_size(t.oid)) AS index_size
FROM 
    pg_class t
JOIN 
    pg_namespace n ON n.oid = t.relnamespace
WHERE 
    n.nspname NOT IN ('pg_catalog', 'information_schema')
    AND t.relkind = 'r'  -- 只选择普通表
ORDER BY 
    pg_total_relation_size(t.oid) DESC;
代码语言:javascript
代码运行次数:0
复制
                table_name                 | total_size | table_size | index_size 
--------------------------------------------+------------+------------+------------
 bizd_sc                                     | 9153 MB    | 7031 MB    | 2121 MB
 sysd_log                                    | 7648 MB    | 5305 MB    | 2314 MB
 bizd_bs                                     | 4223 MB    | 2487 MB    | 1736 MB
 kcd_ksc_bak                                 | 3918 MB    | 2802 MB    | 1115 MB
 bizd_ts                                     | 2951 MB    | 1579 MB    | 1372 MB
 bizd_ts_payway                              | 2845 MB    | 1127 MB    | 1718 MB
 bizd_sc_set_meal                            | 2453 MB    | 1514 MB    | 939 MB
 bizd_ss                                     | 2193 MB    | 1113 MB    | 1080 MB
 bizd_ts_expansion                           | 1777 MB    | 844 MB     | 933 MB

4 每个数据库下的不同OBJECTS 的用户权限

代码语言:javascript
代码运行次数:0
复制
SELECT 
   d.datname AS database_name,
   u.usename AS username,
   pg_catalog.has_database_privilege(u.usename, d.datname, 'CONNECT') AS can_connect,
   pg_catalog.has_database_privilege(u.usename, d.datname, 'CREATE') AS can_create,
   pg_catalog.has_database_privilege(u.usename, d.datname, 'TEMP') AS can_use_temp
FROM 
   pg_database d
CROSS JOIN 
   pg_user u
ORDER BY 
   d.datname, u.usename;
代码语言:javascript
代码运行次数:0
复制
          database_name           |      username      | can_connect | can_create | can_use_temp 
-----------------------------------+--------------------+-------------+------------+--------------
 Devops                         | alicloud_rds_admin | t           | t          | t
 Devops                         | aurora             | t           | t          | t
 Devops                         | cy7_read           | t           | f          | t

代码语言:javascript
代码运行次数:0
复制
schema_name |      object_name       | object_type |          grantee          | can_select | can_insert | can_update | can_delete | can_truncate | can_references | can_trigger 
-------------+------------------------+-------------+---------------------------+------------+------------+------------+------------+--------------+----------------+-------------
public      | order              | r           | alicloud_rds_admin        | SELECT     | INSERT     | UPDATE     | DELETE     | TRUNCATE     | REFERENCES     | TRIGGER
public      | order              | r           | aurora                    | SELECT     | INSERT     | UPDATE     | DELETE     | TRUNCATE     | REFERENCES     | TRIGGER
public      | order              | r           | read                  | SELECT     |            |            |            |              |                | 
public      | order              | r           | center_service         | SELECT     | INSERT     | UPDATE     | DELETE     | TRUNCATE     | REFERENCES     | TRIGGER
public      | order              | r           | devops_rw              |            |            |            |            |              |                | 
public      | order              | r           | dp                     |            |            |            |            |              |                | 
public      | order              | r           | saascenter             | SELECT     | INSERT     | UPDATE     | DELETE     | TRUNCATE     | REFERENCES     | TRIGGER
public      | order              | r           | terminal_rw            |            |            |            |            |              |                | 
public      | order              | r           | user                   |            |            |            |            |              |                | 
public      | order              | r           | dba_admin                 | SELECT     | INSERT     | UPDATE     | DELETE     | TRUNCATE     | REFERENCES     | TRIGGER
public      | order              | r           | pg_execute_server_program |            |            |            |            |              |                | 
public      | order              | r           | pg_monitor                |            |            |            |            |              |                | 
public      | order              | r           | pg_rds_superuser          | SELECT     | INSERT     | UPDATE     | DELETE     | TRUNCATE     | REFERENCES     | TRIGGER
public      | order              | r           | pg_read_all_settings      |            |            |            |            |              |                | 
public      | order              | r           | pg_read_all_stats         |            |            |            |            |              |                | 
public      | order              | r           | pg_read_server_files      |            |            |            |            |              |                | 
public      | order              | r           | pg_signal_backend         |            |            |            |            |              |                | 
public      | order              | r           | pg_stat_scan_tables       |            |            |            |            |              |                | 
public      | order              | r           | pg_write_server_files     |            |            |            |            |              |                | 

5 拼接出当前表的create table 语句

代码语言:javascript
代码运行次数:0
复制
WITH column_info AS (
   SELECT 
       a.attname AS column_name, 
       pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type,
       CASE 
           WHEN a.attnotnull THEN ' NOT NULL'
           ELSE ''
       END AS not_null,
       pg_catalog.array_to_string(ARRAY(
           SELECT conname
           FROM pg_catalog.pg_constraint c
           WHERE c.conrelid = a.attrelid AND a.attnum = ANY(c.conkey) AND c.contype IN ('p', 'u')
       ), ', ') AS constraints
   FROM 
       pg_catalog.pg_attribute a
   WHERE 
       a.attrelid = 'your_table_name'::regclass AND a.attnum > 0 AND NOT a.attisdropped
)
SELECT 
   'CREATE TABLE your_table_name (' || STRING_AGG(column_name || ' ' || data_type || not_null || 
             CASE WHEN constraints IS NOT NULL THEN ' CONSTRAINT ' || constraints ELSE '' END, ', ') || ');' AS create_statement
FROM 
   column_info;

6 分析数据库中的表1天未进行

代码语言:javascript
代码运行次数:0
复制
SELECT 
    relname AS table_name,
    last_autovacuum,
    last_autoanalyze
FROM 
    pg_stat_all_tables
WHERE 
    last_autovacuum < NOW() - interval '1 day' 
    AND schemaname NOT IN ('pg_catalog', 'information_schema');

7 分析PostgreSQL shared buffer 的内存使用情况 需要加载 create extension pg_buffercache

代码语言:javascript
代码运行次数:0
复制
cy7SaasCenter1=> WITH buffer_info AS (
cy7SaasCenter1(>     SELECT 
cy7SaasCenter1(>         pg_buffercache.*,
cy7SaasCenter1(>         CASE 
cy7SaasCenter1(>             WHEN pg_buffercache.relfilenode IS NOT NULL THEN 't'
cy7SaasCenter1(>             ELSE 'f'
cy7SaasCenter1(>         END AS used
cy7SaasCenter1(>     FROM 
cy7SaasCenter1(>         pg_buffercache
cy7SaasCenter1(> )
cy7SaasCenter1-> SELECT 
cy7SaasCenter1->     COUNT(*) AS total_blocks,
cy7SaasCenter1->     COUNT(*) FILTER (WHERE used = 't') AS used_blocks,
cy7SaasCenter1->     COUNT(*) FILTER (WHERE used = 'f') AS free_blocks,
cy7SaasCenter1->     (COUNT(*) FILTER (WHERE used = 't') * current_setting('block_size')::numeric / 1024 / 1024) AS used_blocks_mb,  -- 计算已使用块的 MB
cy7SaasCenter1->     (COUNT(*) FILTER (WHERE used = 'f') * current_setting('block_size')::numeric / 1024 / 1024) AS free_blocks_mb   -- 计算空闲块的 MB
cy7SaasCenter1-> FROM 
cy7SaasCenter1->     buffer_info;
 total_blocks | used_blocks | free_blocks |    used_blocks_mb    |     free_blocks_mb     
--------------+-------------+-------------+----------------------+------------------------
       121809 |      121809 |           0 | 951.6328125000000000 | 0.00000000000000000000
(1 row)

8 分析每个POSTGRESQL 子进程的内存使用情况

代码语言:javascript
代码运行次数:0
复制
#!/bin/bash


psql -d your_database_name -c "SELECT pid FROM pg_stat_activity WHERE state = 'active';" -t | while read pid; do
   
    ps -o pid,vsz,rss,comm -p $pid
done

9 分析每个POSTGRESQL 子进程的CPU使用情况

代码语言:javascript
代码运行次数:0
复制
#!/bin/bash

# 查询当前活动连接并提取 PID
pids=$(psql -d your_database_name -c "SELECT pid FROM pg_stat_activity WHERE state = 'active';" -t)

# 遍历所有 PID 并获取对应的 CPU 使用情况
for pid in $pids; do
    ps -o pid,%cpu,comm -p $pid
done
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档