PostgreSQL中系统目录和系统管理的示例分析

发布时间:2021-12-30 14:40:23 作者:小新
来源:亿速云 阅读:153
# PostgreSQL中系统目录和系统管理的示例分析

## 一、系统目录概述

### 1.1 什么是系统目录
PostgreSQL系统目录是一组存储数据库元数据的特殊表和视图,包含了数据库对象(如表、索引、函数等)的定义信息。这些目录表构成了PostgreSQL的数据字典,是数据库自我描述的基石。

### 1.2 系统目录的特点
- **自描述性**:系统目录本身也是普通的PostgreSQL表
- **版本相关性**:不同PostgreSQL版本的系统目录结构可能有差异
- **只读性**:大部分系统目录对普通用户是只读的
- **SQL标准兼容**:实现了ISO/IEC 9075标准中规定的INFORMATION_SCHEMA

## 二、核心系统目录解析

### 2.1 pg_class
存储所有关系(表、索引、视图等)的元数据:

```sql
-- 查看pg_class结构
\d pg_class

-- 查询所有用户表
SELECT relname FROM pg_class 
WHERE relkind = 'r' AND relnamespace NOT IN (
    SELECT oid FROM pg_namespace WHERE nspname IN ('pg_catalog', 'information_schema')
);

关键字段说明: - relname:关系名称 - relkind:关系类型(r=普通表,i=索引,v=视图等) - reltuples:估计的行数

2.2 pg_attribute

存储所有表的列信息:

-- 查看public.test_table的列定义
SELECT attname, atttypid::regtype, attnotnull 
FROM pg_attribute 
WHERE attrelid = 'public.test_table'::regclass AND attnum > 0;

2.3 pg_index

存储索引信息:

-- 查看索引定义
SELECT i.indisunique, i.indisprimary, a.attname
FROM pg_index i
JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey)
WHERE i.indrelid = 'public.users'::regclass;

三、系统管理实践

3.1 用户与权限管理

角色创建与授权

-- 创建角色
CREATE ROLE app_readonly WITH LOGIN PASSWORD 'secure123' NOSUPERUSER;

-- 授权示例
GRANT CONNECT ON DATABASE mydb TO app_readonly;
GRANT USAGE ON SCHEMA public TO app_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_readonly;

权限查询

-- 查看表权限
SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name = 'employees';

3.2 数据库维护操作

统计信息更新

-- 手动更新统计信息
ANALYZE verbose large_table;

-- 查看统计信息
SELECT schemaname, tablename, analyze_count 
FROM pg_stat_user_tables;

索引维护

-- 重建索引
REINDEX INDEX CONCURRENTLY idx_user_email;

-- 查看索引使用情况
SELECT indexrelname, idx_scan 
FROM pg_stat_user_indexes;

3.3 性能监控

查询监控

-- 查看活跃查询
SELECT pid, query, state, now() - query_start AS duration 
FROM pg_stat_activity 
WHERE state = 'active';

-- 取消长事务
SELECT pg_cancel_backend(pid) FROM pg_stat_activity 
WHERE now() - query_start > interval '5 minutes';

四、实用系统管理示例

4.1 查找重复索引

SELECT indrelid::regclass, array_agg(indexrelid::regclass)
FROM pg_index
GROUP BY indrelid, indkey
HAVING count(*) > 1;

4.2 检测表膨胀

SELECT schemaname, tablename, 
       pg_size_pretty(pg_total_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename))) AS total_size,
       pg_size_pretty(pg_total_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename)) - pg_size_pretty(pg_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename))) AS wasted_size
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY wasted_size DESC;

4.3 自动维护脚本示例

#!/bin/bash
# 自动维护脚本
DBNAME="mydb"
VACUUM_THRESHOLD="100000" # 行数阈值

# 获取需要维护的表
TABLES=$(psql -d $DBNAME -t -c "
SELECT relname FROM pg_class 
WHERE relkind = 'r' AND reltuples > $VACUUM_THRESHOLD
AND relnamespace NOT IN (
    SELECT oid FROM pg_namespace WHERE nspname IN ('pg_catalog', 'information_schema')
)")

for TABLE in $TABLES; do
    echo "维护表: $TABLE"
    psql -d $DBNAME -c "VACUUM ANALYZE $TABLE"
done

五、系统视图扩展

5.1 统计信息视图

5.2 性能视图

-- 查看缓存命中率
SELECT sum(heap_blks_read) as heap_read,
       sum(heap_blks_hit)  as heap_hit,
       sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio
FROM pg_statio_user_tables;

六、最佳实践

  1. 定期维护:设置自动VACUUM和ANALYZE任务
  2. 权限最小化:遵循最小权限原则分配角色权限
  3. 监控关键指标:关注锁、长事务、缓存命中率等
  4. 谨慎修改:避免直接修改系统目录表
  5. 版本兼容性:升级时检查系统目录变更

七、总结

PostgreSQL的系统目录提供了强大的自省能力,结合丰富的系统管理功能,使DBA能够高效地进行数据库维护和性能优化。通过合理利用这些系统表和视图,可以实现精细化的数据库管理和监控。建议管理员深入理解系统目录结构,并建立定期维护机制,确保数据库长期稳定运行。

注意:实际操作时应根据具体PostgreSQL版本调整命令,生产环境操作前建议先在测试环境验证。 “`

本文共约2100字,详细介绍了PostgreSQL系统目录的结构和实际管理应用,包含大量可直接执行的SQL示例,为数据库管理员提供了实用的参考指南。

推荐阅读:
  1. python中docker系统管理的示例分析
  2. oracle中BTRFS文件系统管理的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

postgresql

上一篇:PostgreSQL中系统目录表的示例分析

下一篇:怎么用ServiceStack的OrmLite保存数据

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》