بنقرة واحدة
postgresql
PostgreSQL 备份恢复、用户权限、慢查询分析、连接池配置、性能调优
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
PostgreSQL 备份恢复、用户权限、慢查询分析、连接池配置、性能调优
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
生成或审计模块的 SPEC.md。使用场景:用户要求"给 XX 模块写 spec"、"审计所有 spec"、"检查 spec 是否过期"。
Automates SailFish release workflow: fix build/type errors, update CHANGELOG (EN + CN), run npm version with pre/post hooks. Use when the user asks to release, 发版, 发布, bump version, or update changelog.
后端代码修改后,通过 CLI 测试验证功能正确性。使用场景:修改了 electron/services/ 下的代码需要测试、准备提交代码前跑回归、用户要求"跑测试"/"验证一下"。
完成新功能开发或较大修改后,使用本机 Claude CLI 进行代码审查。
使用 ts-morph 静态分析工具查询代码结构(类层次、方法签名、引用、依赖等),替代手动读源码。使用场景:需要了解类的方法/属性、继承链、符号引用、文件结构、依赖关系时。
When committing or staging changes, only include files related to the current task or conversation; do not stage or commit unrelated modifications. Use when the user asks to commit, stage, 提交, or when preparing to run git add/commit.
| name | PostgreSQL 运维手册 |
| description | PostgreSQL 备份恢复、用户权限、慢查询分析、连接池配置、性能调优 |
| version | 1.0.0 |
psql -h <host> -U <user> -d <dbname>
# 常用元命令
\l # 列出数据库
\dt # 列出表
\du # 列出用户/角色
\conninfo # 当前连接信息
\x # 切换扩展显示
SELECT version();
# 单库备份(自定义格式,支持并行恢复)
pg_dump -U postgres -Fc dbname > backup.dump
# 单库备份(SQL 格式)
pg_dump -U postgres dbname > backup.sql
# 全库备份
pg_dumpall -U postgres > all_databases.sql
# 恢复(自定义格式)
pg_restore -U postgres -d dbname backup.dump
# 恢复(SQL 格式)
psql -U postgres -d dbname < backup.sql
# 并行备份/恢复(加速大库)
pg_dump -U postgres -Fd -j 4 -f backup_dir dbname
pg_restore -U postgres -d dbname -j 4 backup_dir
-- 创建用户
CREATE USER appuser WITH PASSWORD 'password';
-- 授权
GRANT CONNECT ON DATABASE dbname TO appuser;
GRANT USAGE ON SCHEMA public TO appuser;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO appuser;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO appuser;
-- 只读用户
CREATE USER readonly WITH PASSWORD 'password';
GRANT CONNECT ON DATABASE dbname TO readonly;
GRANT USAGE ON SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
-- 查看权限
\du+
SELECT * FROM information_schema.role_table_grants WHERE grantee = 'appuser';
-- 启用 pg_stat_statements(需在 postgresql.conf 中配置)
-- shared_preload_libraries = 'pg_stat_statements'
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- Top 10 慢查询
SELECT query, calls, mean_exec_time, total_exec_time
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;
-- 当前活跃查询
SELECT pid, now() - pg_stat_activity.query_start AS duration, query, state
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY duration DESC;
-- 终止长查询
SELECT pg_terminate_backend(<pid>);
日志中记录慢查询(postgresql.conf):
log_min_duration_statement = 1000 # 记录超过 1 秒的查询
log_statement = 'none' # 避免记录所有查询
-- 查看连接数
SELECT count(*) FROM pg_stat_activity;
SELECT datname, count(*) FROM pg_stat_activity GROUP BY datname;
-- 最大连接数
SHOW max_connections;
-- 空闲连接
SELECT * FROM pg_stat_activity WHERE state = 'idle' AND query_start < now() - interval '10 minutes';
PgBouncer 连接池:
# pgbouncer.ini
[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb
[pgbouncer]
listen_port = 6432
pool_mode = transaction # 推荐事务级池化
max_client_conn = 1000
default_pool_size = 20
# postgresql.conf
shared_buffers = '内存的25%'
effective_cache_size = '内存的75%'
work_mem = 64MB
maintenance_work_mem = 512MB
wal_buffers = 64MB
max_connections = 200
| 问题 | 排查 |
|---|---|
| 连接数满 | SELECT count(*) FROM pg_stat_activity; → 使用连接池 |
| 表膨胀 | SELECT pg_size_pretty(pg_total_relation_size('tablename')); → VACUUM FULL |
| 锁等待 | SELECT * FROM pg_locks WHERE NOT granted; |
| 复制延迟 | SELECT * FROM pg_stat_replication; 检查 replay_lag |
| 磁盘满 | 清理 WAL:SELECT pg_switch_wal();,检查 pg_wal/ 目录大小 |
# VACUUM(回收死行空间)
VACUUM VERBOSE tablename;
VACUUM ANALYZE; # 同时更新统计信息
# REINDEX(索引膨胀时)
REINDEX INDEX indexname;
REINDEX TABLE tablename;
# 数据库大小
SELECT pg_size_pretty(pg_database_size('dbname'));