正文:
我一直有一个错觉,大家的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;
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 表查询索引大小的信息
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;
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 索引和表之间的关系,索引占多大
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;
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 的用户权限
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;
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
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 语句
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天未进行
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
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 子进程的内存使用情况
#!/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使用情况
#!/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
本文分享自 AustinDatabases 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!