综合练习
主从搭建 + 慢查询优化清单。
40 分钟
综合练习:PG 版 codeforge 运维闭环
串联前 11 课:在 codeforge_pg 部署 schema、索引、备份、监控 SQL,可选只读 Spring 接口。与 /roadmaps/postgresql-dba 综合节点对齐。
学习目标
- 独立完成 PG 版
cf_track/cf_lessonDDL 与最小权限角色 - 执行备份恢复演练并记录 RPO
- 输出一份 DBA 巡检 SQL 清单(≥5 条)
核心概念
任务一:Schema 与权限
参考 backend/src/main/resources/schema.sql,在 app schema 创建表(timestamptz、jsonb metadata),并:
CREATE ROLE app_runtime LOGIN PASSWORD 'runtime';
GRANT USAGE ON SCHEMA app TO app_runtime;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA app TO app_runtime;
验证:app_runtime 不能 DROP TABLE,不能访问 postgres 系统表写操作。
任务二:性能与索引
EXPLAIN (ANALYZE, BUFFERS)
SELECT t.slug, count(l.id)
FROM app.cf_track t
LEFT JOIN app.cf_lesson l ON l.track_id = t.id
GROUP BY t.slug;
CREATE INDEX idx_lesson_track ON app.cf_lesson (track_id);
-- 重跑 EXPLAIN,确认 Join 计划改善
启用 pg_stat_statements,插入种子数据后导出 Top 3 SQL。
任务三:备份恢复
pg_dump -U dba -Fc -f practice.dump codeforge_pg
dropdb codeforge_pg_restored 2>/dev/null; createdb codeforge_pg_restored
pg_restore -U dba -d codeforge_pg_restored practice.dump
psql -U dba -d codeforge_pg_restored -c "SELECT count(*) FROM app.cf_track;"
记录:备份耗时、恢复耗时、行数是否一致。
验收清单
| 项 | 标准 |
|---|---|
| DDL | 无 MySQL 方言,约束完整 |
| 权限 | runtime / read 分离 |
| 索引 | slug、track_id 有合理索引 |
| 备份 | dump + restore 成功 |
| 监控 | 5+ 条巡检 SQL 文档化 |
可选:Spring 只读 API
profile pg-dev + GET /api/pg/tracks,路径与 MySQL 生产 API 区分(见 pg-practice)。
与 MySQL/Spring Boot 对照
完成练习后写一段对比:同一 schema 在 MySQL 与 PG 上 备份命令、慢 SQL 来源、vacuum vs innodb 各一项差异。本站生产仍用 MySQL;本练习证明 PG DBA 能力可独立交付。