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


正文:

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

1 不会装POSTGRESQL 的人有的是

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

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

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

1  查询数据库信息

SELECT 
    pg_database.datname AS database_name,
    pg_size_pretty(pg_database_size(pg_database.datname)) AS size
FROM 
    pg_database;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
database_name           |  size   
-----------------------------------+---------
 postgres                          | 7925 kB
 template1                         | 7957 kB
 template0                         | 7769 kB
 rddsadd                          | 8005 kB
 SaasCenter1                    | 46 GB
 serverNew                      | 2025 MB
 IterativeDev                   | 8101 kB
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

2  表查询索引大小的信息

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;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

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

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;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

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

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;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
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     |            |            |            |            |              |                |
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

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

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;
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

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

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

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');
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

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

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

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)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

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

#!/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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

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

#!/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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

 

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