Get the FREE Ultimate OpenClaw Setup Guide →

postgresql

Flagged

{"isSafe":false,"isSuspicious":true,"riskLevel":"high","findings":[{"category":"system_harm","severity":"high","description":"示例中包含创建具有 SUPERUSER 权限的用户 admin 的 SQL 命令,这可能导致权限提升和安全风险。","evidence":"CREATE USER admin WITH SUPERUSER PASSWORD 'password';"},{"category":"other","severity":"low","description":"示例中明文使用密码 'password',属于不安全演示,建议在示例中使用占位符或环境变量来避免暴露凭证。","evidence":"CREATE USER admin WITH SUPERUSER PASSWORD 'password';"}],"summary":"内容主要是 PostgreSQL 数据库管理技能的示例。存在潜在的权限提升风险(创建 SUPERUSER 用户和明文密码示例),应避免在公开示例中包含敏感凭证或高权限操作。其他命令(如查询、备份、恢复、性能监控等)在正常教学场景中通常无问题。"}

npx machina-cli add skill chaterm/terminal-skills/postgresql --openclaw
Files (1)
SKILL.md
5.6 KB

PostgreSQL 数据库管理

概述

PostgreSQL 数据库管理、扩展使用、查询优化等技能。

连接管理

# 本地连接
psql -U postgres
psql -U username -d database

# 远程连接
psql -h hostname -p 5432 -U username -d database

# 执行 SQL 文件
psql -U username -d database -f script.sql

# 执行单条命令
psql -U username -d database -c "SELECT version();"

psql 常用命令

\l              -- 列出数据库
\c dbname       -- 切换数据库
\dt             -- 列出表
\d tablename    -- 表结构
\du             -- 列出用户
\dn             -- 列出 schema
\df             -- 列出函数
\di             -- 列出索引
\q              -- 退出
\?              -- 帮助
\timing         -- 显示执行时间
\x              -- 扩展显示模式

用户与权限

-- 创建用户
CREATE USER username WITH PASSWORD 'password';
CREATE ROLE username WITH LOGIN PASSWORD 'password';

-- 创建超级用户
CREATE USER admin WITH SUPERUSER PASSWORD 'password';

-- 授权
GRANT ALL PRIVILEGES ON DATABASE dbname TO username;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO username;
GRANT USAGE ON SCHEMA schema_name TO username;

-- 设置默认权限
ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO readonly_user;

-- 查看权限
\du username
SELECT * FROM information_schema.role_table_grants WHERE grantee = 'username';

-- 修改密码
ALTER USER username WITH PASSWORD 'newpassword';

数据库操作

-- 创建数据库
CREATE DATABASE dbname;
CREATE DATABASE dbname OWNER username ENCODING 'UTF8';

-- 删除数据库
DROP DATABASE dbname;

-- 查看数据库大小
SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) 
FROM pg_database ORDER BY pg_database_size(pg_database.datname) DESC;

-- 查看表大小
SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) 
FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC;

备份与恢复

pg_dump

# 备份单个数据库
pg_dump -U username dbname > backup.sql
pg_dump -U username -Fc dbname > backup.dump    # 自定义格式

# 备份所有数据库
pg_dumpall -U postgres > all_backup.sql

# 只备份结构
pg_dump -U username --schema-only dbname > schema.sql

# 只备份数据
pg_dump -U username --data-only dbname > data.sql

# 备份特定表
pg_dump -U username -t tablename dbname > table.sql

# 并行备份(大数据库)
pg_dump -U username -Fd -j 4 dbname -f backup_dir/

恢复

# 恢复 SQL 格式
psql -U username -d dbname < backup.sql

# 恢复自定义格式
pg_restore -U username -d dbname backup.dump

# 并行恢复
pg_restore -U username -d dbname -j 4 backup_dir/

# 恢复到新数据库
createdb -U postgres newdb
pg_restore -U postgres -d newdb backup.dump

性能监控

-- 当前连接
SELECT * FROM pg_stat_activity;
SELECT pid, usename, application_name, state, query 
FROM pg_stat_activity WHERE state != 'idle';

-- 终止连接
SELECT pg_terminate_backend(pid);

-- 锁信息
SELECT * FROM pg_locks WHERE NOT granted;

-- 查看锁等待
SELECT blocked_locks.pid AS blocked_pid,
       blocking_locks.pid AS blocking_pid,
       blocked_activity.usename AS blocked_user,
       blocking_activity.usename AS blocking_user,
       blocked_activity.query AS blocked_statement
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks ON blocking_locks.locktype = blocked_locks.locktype
JOIN pg_catalog.pg_stat_activity blocking_activity ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;

-- 表统计
SELECT relname, seq_scan, idx_scan, n_tup_ins, n_tup_upd, n_tup_del
FROM pg_stat_user_tables;

-- 索引使用情况
SELECT indexrelname, idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_user_indexes;

查询优化

-- 执行计划
EXPLAIN SELECT * FROM table WHERE condition;
EXPLAIN ANALYZE SELECT * FROM table WHERE condition;
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) SELECT * FROM table;

-- 更新统计信息
ANALYZE tablename;
ANALYZE;

-- 重建索引
REINDEX TABLE tablename;
REINDEX DATABASE dbname;

-- VACUUM
VACUUM tablename;
VACUUM FULL tablename;              -- 回收空间
VACUUM ANALYZE tablename;           -- 同时更新统计

常见场景

场景 1:主从复制状态

-- 主库
SELECT * FROM pg_stat_replication;

-- 从库
SELECT * FROM pg_stat_wal_receiver;

-- 复制延迟
SELECT EXTRACT(EPOCH FROM (now() - pg_last_xact_replay_timestamp()))::INT AS lag_seconds;

场景 2:慢查询分析

-- 启用 pg_stat_statements
CREATE EXTENSION pg_stat_statements;

-- 查看慢查询
SELECT query, calls, total_time, mean_time, rows
FROM pg_stat_statements
ORDER BY total_time DESC LIMIT 10;

-- 重置统计
SELECT pg_stat_statements_reset();

场景 3:表维护

-- 查看表膨胀
SELECT schemaname, relname, n_dead_tup, n_live_tup,
       round(n_dead_tup * 100.0 / nullif(n_live_tup + n_dead_tup, 0), 2) AS dead_ratio
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000
ORDER BY n_dead_tup DESC;

-- 清理膨胀
VACUUM FULL tablename;

故障排查

问题排查方法
连接数过多pg_stat_activity, 检查 max_connections
查询慢EXPLAIN ANALYZE, 检查索引
锁等待pg_locks, pg_stat_activity
磁盘满检查 WAL、清理旧数据
复制延迟pg_stat_replication

Source

git clone https://github.com/chaterm/terminal-skills/blob/main/database/postgresql/SKILL.mdView on GitHub

Overview

你可以使用 PostgreSQL 的 client(psql)与服务器交互,完成数据库、用户与权限管理、备份/恢复、性能监控与查询优化等日常运维与高级任务。本技能覆盖连接管理、用户与权限、数据库操作、备份与恢复、性能监控、查询优化以及故障排查等场景,帮助你在本地到生产环境中高效维护数据库。

How This Skill Works

你通过 psql 客户端与 PostgreSQL 服务器对话,执行 SQL 命令或 psql 的元命令(如 \\l、\\c 数据库、\\dt、\\d 表名 等)来操作对象、查看元数据与执行诊断。PostgreSQL 提供丰富的系统视图(如 pg_stat_activity、pg_locks、pg_stat_user_tables)用于在运行时观测状态;备份由 pg_dump/pg_restore 支持,性能调优依赖 EXPLAIN ANALYZE、ANALYZE、VACUUM、REINDEX 等工具与命令来获取执行计划、更新统计信息与重建索引。

When to Use It

  • 本地开发与初始数据库搭建,快速上手 Postgres 环境
  • 用户与权限管理:创建角色、分配权限、设定默认权限
  • 数据库备份、恢复与迁移(包含单库、全量备份及特定表备份)
  • 性能监控、慢查询分析与索引优化
  • 复制与高可用场景的状态检查与故障排查(如主从复制、延迟监控)

Quick Start

  1. 1) 安装并启动 PostgreSQL,确保 psql 客户端可用。
  2. 2) 使用 psql 连接到数据库:psql -U username -d database 或 psql -h host -p 5432 -U username -d database。
  3. 3) 创建数据库/用户并授予权限,示例:CREATE USER alice WITH PASSWORD 'secret'; CREATE DATABASE appdb OWNER alice; GRANT ALL PRIVILEGES ON DATABASE appdb TO alice;
  4. 4) 运行一个简单查询并查看对象:SELECT version(); \l; \dt;

Best Practices

  • 遵循最小权限原则,使用角色与模式来分组并授权,避免直接授予 SUPERUSER;
  • 设置并坚持 DEFAULT PRIVILEGES,确保新对象的权限一致性;
  • 定期执行 ANALYZE 与 VACUUM,保持统计信息更新和数据膨胀控制;
  • 启用并使用 pg_stat_statements 进行慢查询与性能分析;
  • 使用 pg_dump/pg_restore 进行备份演练,确保备份可恢复并验证备份完整性;
  • 对生产环境开启 WAL 归档与备份验证流程,确保灾难恢复能力;
  • 在高并发场景下使用合适的索引与分区策略,避免不必要的全表扫描;
  • 对关键 SQL 进行 EXPLAIN ANALYZE 分析,定期审视执行计划与索引使用情况。

Example Use Cases

  • 示例 1:日常备份与恢复。使用 pg_dump 备份数据库,并在测试环境使用 pg_restore 验证恢复流程;
  • 示例 2:慢查询诊断。启用 pg_stat_statements,定期查询 total_time 最高的语句并优化;
  • 示例 3:表膨胀与清理。定期执行 VACUUM ANALYZE 对繁忙表收集统计并回收空间;
  • 示例 4:复制延迟监控。通过 pg_stat_replication、pg_last_xact_replay_timestamp 监控主从延迟;
  • 示例 5:权限与安全治理。通过 GRANT/REVOKE、ALTER DEFAULT PRIVILEGES 配置长期的最小权限策略与审计。

Frequently Asked Questions

Add this skill to your agents

Related Skills

Sponsor this space

Reach thousands of developers