@evertonferreira96/agents 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/api.md +45 -0
- package/.claude/agents/app.md +41 -0
- package/.claude/agents/architect.md +49 -0
- package/.claude/agents/infra.md +27 -0
- package/.claude/agents/product.md +58 -0
- package/.claude/agents/quick.md +33 -0
- package/.claude/agents/security.md +39 -0
- package/.claude/agents/ui.md +54 -0
- package/.claude/agents/verifier.md +56 -0
- package/.claude/agents/web.md +41 -0
- package/.claude/hooks/config-update-check.mjs +14 -0
- package/.claude/hooks/context-budget.mjs +51 -0
- package/.claude/hooks/graphify-update.sh +16 -0
- package/.claude/hooks/guard-bash.sh +64 -0
- package/.claude/hooks/orchestrator-guard.sh +49 -0
- package/.claude/hooks/post-compact.sh +26 -0
- package/.claude/hooks/readonly-guard.sh +54 -0
- package/.claude/hooks/stop-verify.sh +52 -0
- package/.claude/rules/api.md +21 -0
- package/.claude/rules/db.md +9 -0
- package/.claude/rules/delivery-diagram.md +16 -0
- package/.claude/rules/git-workflow.md +34 -0
- package/.claude/rules/graphify.md +3 -0
- package/.claude/rules/mobile.md +22 -0
- package/.claude/rules/tickets.md +9 -0
- package/.claude/rules/ui.md +14 -0
- package/.claude/rules/web.md +27 -0
- package/.claude/settings.json +114 -0
- package/.claude/skills/animate/RECIPES.md +324 -0
- package/.claude/skills/animate/SKILL.md +208 -0
- package/.claude/skills/animate/agents/openai.yaml +5 -0
- package/.claude/skills/animate-expo/RECIPES.md +385 -0
- package/.claude/skills/animate-expo/SKILL.md +264 -0
- package/.claude/skills/animate-expo/agents/openai.yaml +5 -0
- package/.claude/skills/animation-performance/SKILL.md +223 -0
- package/.claude/skills/animation-performance/agents/openai.yaml +5 -0
- package/.claude/skills/apple-design/SKILL.md +291 -0
- package/.claude/skills/apple-design/agents/openai.yaml +5 -0
- package/.claude/skills/arch-api/SKILL.md +291 -0
- package/.claude/skills/arch-api/agents/openai.yaml +3 -0
- package/.claude/skills/arch-api/references/common.md +174 -0
- package/.claude/skills/arch-api/references/contract.md +289 -0
- package/.claude/skills/arch-api/references/domain.md +301 -0
- package/.claude/skills/arch-api/references/endpoints.md +184 -0
- package/.claude/skills/arch-api/references/review.md +228 -0
- package/.claude/skills/arch-api/references/security.md +151 -0
- package/.claude/skills/arch-app/SKILL.md +278 -0
- package/.claude/skills/arch-app/agents/openai.yaml +3 -0
- package/.claude/skills/arch-app/references/navigation-session.md +257 -0
- package/.claude/skills/arch-app/references/review.md +155 -0
- package/.claude/skills/arch-app/references/screens.md +214 -0
- package/.claude/skills/arch-app/references/services.md +301 -0
- package/.claude/skills/arch-app/references/ui-mobile.md +124 -0
- package/.claude/skills/arch-db/SKILL.md +181 -0
- package/.claude/skills/arch-db/agents/openai.yaml +3 -0
- package/.claude/skills/arch-db/references/indexes-queries.md +251 -0
- package/.claude/skills/arch-db/references/migrations.md +191 -0
- package/.claude/skills/arch-db/references/modeling.md +214 -0
- package/.claude/skills/arch-db/references/mysql.md +262 -0
- package/.claude/skills/arch-db/references/pooling-ops.md +112 -0
- package/.claude/skills/arch-db/references/review.md +143 -0
- package/.claude/skills/arch-db/references/transactions-locks.md +141 -0
- package/.claude/skills/arch-web/SKILL.md +307 -0
- package/.claude/skills/arch-web/agents/openai.yaml +3 -0
- package/.claude/skills/arch-web/references/auth-session-env.md +165 -0
- package/.claude/skills/arch-web/references/blocks.md +198 -0
- package/.claude/skills/arch-web/references/cache.md +124 -0
- package/.claude/skills/arch-web/references/review.md +142 -0
- package/.claude/skills/arch-web/references/services.md +297 -0
- package/.claude/skills/arch-web/references/tests.md +159 -0
- package/.claude/skills/arch-web/references/ui-forms.md +143 -0
- package/.claude/skills/break-ui/CATALOG.md +135 -0
- package/.claude/skills/break-ui/SKILL.md +176 -0
- package/.claude/skills/break-ui/agents/openai.yaml +5 -0
- package/.claude/skills/brief/SKILL.md +91 -0
- package/.claude/skills/brief/agents/openai.yaml +3 -0
- package/.claude/skills/diagnosing-bugs/SKILL.md +138 -0
- package/.claude/skills/diagnosing-bugs/agents/openai.yaml +3 -0
- package/.claude/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +44 -0
- package/.claude/skills/emil-design-eng/SKILL.md +675 -0
- package/.claude/skills/emil-design-eng/agents/openai.yaml +5 -0
- package/.claude/skills/find-animation-opportunities/SKILL.md +141 -0
- package/.claude/skills/find-animation-opportunities/agents/openai.yaml +5 -0
- package/.claude/skills/graphify/.graphify_version +1 -0
- package/.claude/skills/graphify/SKILL.md +742 -0
- package/.claude/skills/graphify/agents/openai.yaml +3 -0
- package/.claude/skills/graphify/references/add-watch.md +56 -0
- package/.claude/skills/graphify/references/exports.md +91 -0
- package/.claude/skills/graphify/references/extraction-spec.md +70 -0
- package/.claude/skills/graphify/references/github-and-merge.md +46 -0
- package/.claude/skills/graphify/references/hooks.md +33 -0
- package/.claude/skills/graphify/references/query.md +317 -0
- package/.claude/skills/graphify/references/transcribe.md +52 -0
- package/.claude/skills/graphify/references/update.md +221 -0
- package/.claude/skills/grill-me/SKILL.md +7 -0
- package/.claude/skills/grill-me/agents/openai.yaml +5 -0
- package/.claude/skills/grill-with-docs/SKILL.md +64 -0
- package/.claude/skills/grill-with-docs/agents/openai.yaml +5 -0
- package/.claude/skills/grilling/SKILL.md +30 -0
- package/.claude/skills/grilling/agents/openai.yaml +3 -0
- package/.claude/skills/handoff/SKILL.md +28 -0
- package/.claude/skills/handoff/agents/openai.yaml +5 -0
- package/.claude/skills/impeccable/SKILL.md +89 -0
- package/.claude/skills/impeccable/agents/openai.yaml +5 -0
- package/.claude/skills/impeccable/reference/adapt.md +318 -0
- package/.claude/skills/impeccable/reference/adapt.native.md +58 -0
- package/.claude/skills/impeccable/reference/android.md +46 -0
- package/.claude/skills/impeccable/reference/animate.md +89 -0
- package/.claude/skills/impeccable/reference/audit.md +137 -0
- package/.claude/skills/impeccable/reference/audit.native.md +139 -0
- package/.claude/skills/impeccable/reference/bolder.md +33 -0
- package/.claude/skills/impeccable/reference/clarify.md +94 -0
- package/.claude/skills/impeccable/reference/colorize.md +86 -0
- package/.claude/skills/impeccable/reference/component-review.md +63 -0
- package/.claude/skills/impeccable/reference/craft-floor.md +44 -0
- package/.claude/skills/impeccable/reference/craft.md +5 -0
- package/.claude/skills/impeccable/reference/critique.md +809 -0
- package/.claude/skills/impeccable/reference/degraded/asset-producer.md +42 -0
- package/.claude/skills/impeccable/reference/degraded/documenter.md +24 -0
- package/.claude/skills/impeccable/reference/degraded/finish-reviewer.md +38 -0
- package/.claude/skills/impeccable/reference/degraded/manual-edit-applier.md +92 -0
- package/.claude/skills/impeccable/reference/delight.md +70 -0
- package/.claude/skills/impeccable/reference/distill.md +111 -0
- package/.claude/skills/impeccable/reference/doctor.md +54 -0
- package/.claude/skills/impeccable/reference/document.md +416 -0
- package/.claude/skills/impeccable/reference/extract.md +69 -0
- package/.claude/skills/impeccable/reference/generate.md +101 -0
- package/.claude/skills/impeccable/reference/harden.md +345 -0
- package/.claude/skills/impeccable/reference/hooks.md +113 -0
- package/.claude/skills/impeccable/reference/init.md +131 -0
- package/.claude/skills/impeccable/reference/ios.md +51 -0
- package/.claude/skills/impeccable/reference/layout.md +84 -0
- package/.claude/skills/impeccable/reference/live-setup.md +104 -0
- package/.claude/skills/impeccable/reference/live.md +325 -0
- package/.claude/skills/impeccable/reference/mode-operate.md +21 -0
- package/.claude/skills/impeccable/reference/mode-persuade.md +19 -0
- package/.claude/skills/impeccable/reference/mode-read.md +21 -0
- package/.claude/skills/impeccable/reference/new-work.md +154 -0
- package/.claude/skills/impeccable/reference/onboard.md +234 -0
- package/.claude/skills/impeccable/reference/operate.md +61 -0
- package/.claude/skills/impeccable/reference/optimize.md +258 -0
- package/.claude/skills/impeccable/reference/overdrive.md +127 -0
- package/.claude/skills/impeccable/reference/polish.md +105 -0
- package/.claude/skills/impeccable/reference/quieter.md +99 -0
- package/.claude/skills/impeccable/reference/region-map.md +26 -0
- package/.claude/skills/impeccable/reference/routing.md +24 -0
- package/.claude/skills/impeccable/reference/shape.md +59 -0
- package/.claude/skills/impeccable/reference/typeset.md +80 -0
- package/.claude/skills/impeccable/reference/visualize.md +47 -0
- package/.claude/skills/impeccable/scripts/VERSION +1 -0
- package/.claude/skills/impeccable/scripts/command-metadata.json +98 -0
- package/.claude/skills/impeccable/scripts/data/font-index-failures.json +121 -0
- package/.claude/skills/impeccable/scripts/data/font-index.json +1 -0
- package/.claude/skills/impeccable/scripts/impeccable +206 -0
- package/.claude/skills/impeccable/scripts/impeccable.cmd +214 -0
- package/.claude/skills/impeccable/scripts/live-browser-dom.js +281 -0
- package/.claude/skills/impeccable/scripts/live-browser-ignores.js +242 -0
- package/.claude/skills/impeccable/scripts/live-browser-session.js +148 -0
- package/.claude/skills/impeccable/scripts/live-browser.js +13532 -0
- package/.claude/skills/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/.claude/skills/improve-animations/AUDIT.md +115 -0
- package/.claude/skills/improve-animations/PLAN-TEMPLATE.md +73 -0
- package/.claude/skills/improve-animations/SKILL.md +110 -0
- package/.claude/skills/improve-animations/agents/openai.yaml +5 -0
- package/.claude/skills/mobile-native/SKILL.md +311 -0
- package/.claude/skills/mobile-native/agents/openai.yaml +3 -0
- package/.claude/skills/orchestrate/SKILL.md +181 -0
- package/.claude/skills/orchestrate/agents/openai.yaml +3 -0
- package/.claude/skills/pick-ui-library/SKILL.md +85 -0
- package/.claude/skills/pick-ui-library/agents/openai.yaml +5 -0
- package/.claude/skills/ponytail/SKILL.md +52 -0
- package/.claude/skills/ponytail/agents/openai.yaml +3 -0
- package/.claude/skills/ponytail-audit/SKILL.md +103 -0
- package/.claude/skills/ponytail-audit/agents/openai.yaml +3 -0
- package/.claude/skills/ponytail-debt/SKILL.md +44 -0
- package/.claude/skills/ponytail-debt/agents/openai.yaml +3 -0
- package/.claude/skills/ponytail-review/SKILL.md +101 -0
- package/.claude/skills/ponytail-review/agents/openai.yaml +3 -0
- package/.claude/skills/postgres-best-practices/SKILL.md +42 -0
- package/.claude/skills/postgres-best-practices/agents/openai.yaml +3 -0
- package/.claude/skills/postgres-best-practices/references/backup-restore.md +372 -0
- package/.claude/skills/postgres-best-practices/references/bulk-loading.md +315 -0
- package/.claude/skills/postgres-best-practices/references/connection-pooling.md +310 -0
- package/.claude/skills/postgres-best-practices/references/hot-standby.md +221 -0
- package/.claude/skills/postgres-best-practices/references/indexing.md +318 -0
- package/.claude/skills/postgres-best-practices/references/logical-replication.md +610 -0
- package/.claude/skills/postgres-best-practices/references/major-version-upgrades.md +334 -0
- package/.claude/skills/postgres-best-practices/references/performance-diagnostics.md +553 -0
- package/.claude/skills/postgres-best-practices/references/query-optimization.md +294 -0
- package/.claude/skills/postgres-best-practices/references/query-patterns.md +566 -0
- package/.claude/skills/postgres-best-practices/references/schema-design.md +362 -0
- package/.claude/skills/postgres-best-practices/references/security-roles.md +489 -0
- package/.claude/skills/postgres-best-practices/references/transaction-isolation.md +344 -0
- package/.claude/skills/project-docs/SKILL.md +330 -0
- package/.claude/skills/project-docs/agents/openai.yaml +3 -0
- package/.claude/skills/prototype/PICKER.md +197 -0
- package/.claude/skills/prototype/SKILL.md +98 -0
- package/.claude/skills/prototype/agents/openai.yaml +5 -0
- package/.claude/skills/retro/SKILL.md +43 -0
- package/.claude/skills/retro/agents/openai.yaml +5 -0
- package/.claude/skills/review/SKILL.md +74 -0
- package/.claude/skills/review/agents/openai.yaml +3 -0
- package/.claude/skills/review/references/smells.md +23 -0
- package/.claude/skills/review-animations/SKILL.md +120 -0
- package/.claude/skills/review-animations/STANDARDS.md +187 -0
- package/.claude/skills/review-animations/agents/openai.yaml +5 -0
- package/.claude/skills/tdd/SKILL.md +38 -0
- package/.claude/skills/tdd/agents/openai.yaml +3 -0
- package/.claude/skills/tdd/mocking.md +59 -0
- package/.claude/skills/tdd/tests.md +77 -0
- package/.claude/skills/triage/SKILL.md +58 -0
- package/.claude/skills/triage/agents/openai.yaml +3 -0
- package/.claude/skills/ui-ux-pro-max/SKILL.md +378 -0
- package/.claude/skills/ui-ux-pro-max/agents/openai.yaml +5 -0
- package/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -0
- package/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -0
- package/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -0
- package/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -0
- package/.claude/skills/ui-ux-pro-max/data/products.csv +97 -0
- package/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -0
- package/.claude/skills/ui-ux-pro-max/data/typography.csv +58 -0
- package/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -0
- package/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/.claude/skills/ui-ux-pro-max/scripts/search.py +114 -0
- package/.claude/skills/writing-for-agents/SKILL-MECHANICS.md +22 -0
- package/.claude/skills/writing-for-agents/SKILL.md +81 -0
- package/.claude/skills/writing-for-agents/agents/openai.yaml +3 -0
- package/.worktreeinclude +3 -0
- package/AGENTS.md +44 -0
- package/README.md +14 -2
- package/VERSION +1 -0
- package/bin/agents.mjs +45 -0
- package/docs/adr/README.md +31 -0
- package/docs/brief-template.md +3 -0
- package/docs/plans/README.md +73 -0
- package/package.json +46 -4
- package/scripts/bootstrap.mjs +188 -0
- package/scripts/check-catalog.mjs +43 -0
- package/scripts/skills-update.mjs +51 -0
- package/skills-lock.json +269 -0
- package/templates/CLAUDE.project.md +41 -0
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
# Major Version Upgrades Reference
|
|
2
|
+
|
|
3
|
+
## Contents
|
|
4
|
+
- Upgrade methods overview
|
|
5
|
+
- pg_upgrade (in-place)
|
|
6
|
+
- Logical replication (minimal downtime)
|
|
7
|
+
- Pre-upgrade checklist
|
|
8
|
+
- Post-upgrade checklist
|
|
9
|
+
- Testing strategy
|
|
10
|
+
|
|
11
|
+
## Upgrade Methods Overview
|
|
12
|
+
|
|
13
|
+
| Method | Downtime | Complexity | Rollback | Best for |
|
|
14
|
+
|--------|----------|------------|----------|----------|
|
|
15
|
+
| `pg_upgrade` | Minutes to hours | Low | Restore from backup | Most upgrades, moderate database sizes |
|
|
16
|
+
| `pg_upgrade --swap` (PG18+) | Minutes | Low | Restore from backup | Fastest in-place upgrade |
|
|
17
|
+
| Logical replication | Seconds | High | Switch back to old primary | Large databases requiring near-zero downtime |
|
|
18
|
+
| pg_dump/pg_restore | Hours to days | Low | Old cluster still running | Small databases, or when other methods fail |
|
|
19
|
+
|
|
20
|
+
**Default recommendation**: `pg_upgrade` for most cases. Use logical replication only when you need near-zero downtime on a large database.
|
|
21
|
+
|
|
22
|
+
## pg_upgrade (In-Place)
|
|
23
|
+
|
|
24
|
+
`pg_upgrade` replaces the old cluster's data files with the new version in place, without dumping and reloading data. PG18 supports five transfer modes:
|
|
25
|
+
|
|
26
|
+
| Mode | Flag | Speed | Disk usage |
|
|
27
|
+
|------|------|-------|------------|
|
|
28
|
+
| Copy | (default) | Moderate | 2x disk during upgrade |
|
|
29
|
+
| Copy file range | `--copy-file-range` (PG18+) | Fast where supported | 2x disk during upgrade |
|
|
30
|
+
| Link | `--link` | Fast | Minimal extra disk (hard links) |
|
|
31
|
+
| Swap | `--swap` (PG18+) | Fastest | No extra disk (swaps data dirs) |
|
|
32
|
+
| Clone | `--clone` | Fast (if filesystem supports reflinks) | Minimal extra disk |
|
|
33
|
+
|
|
34
|
+
### Step-by-Step: pg_upgrade
|
|
35
|
+
|
|
36
|
+
#### 1. Install the New Version
|
|
37
|
+
|
|
38
|
+
Install the new PostgreSQL version alongside the old one. Do not remove the old version yet.
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Example: upgrading from PG16 to PG17
|
|
42
|
+
# Install PG17 (method depends on your OS/package manager)
|
|
43
|
+
# Both versions coexist with different binary directories
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
#### 2. Run Pre-Upgrade Check
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# Dry run — checks compatibility without making changes
|
|
50
|
+
pg_upgrade \
|
|
51
|
+
--old-datadir /var/lib/postgresql/16/main \
|
|
52
|
+
--new-datadir /var/lib/postgresql/17/main \
|
|
53
|
+
--old-bindir /usr/lib/postgresql/16/bin \
|
|
54
|
+
--new-bindir /usr/lib/postgresql/17/bin \
|
|
55
|
+
--check
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Fix any issues reported before proceeding. Common issues:
|
|
59
|
+
- Extensions not available in the new version
|
|
60
|
+
- Custom data types with incompatible binary formats
|
|
61
|
+
- `contrib` modules that need updating
|
|
62
|
+
|
|
63
|
+
#### 3. Stop the Old Cluster
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
pg_ctl stop -D /var/lib/postgresql/16/main
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
#### 4. Run pg_upgrade
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# Copy mode (safe, uses more disk)
|
|
73
|
+
pg_upgrade \
|
|
74
|
+
--old-datadir /var/lib/postgresql/16/main \
|
|
75
|
+
--new-datadir /var/lib/postgresql/17/main \
|
|
76
|
+
--old-bindir /usr/lib/postgresql/16/bin \
|
|
77
|
+
--new-bindir /usr/lib/postgresql/17/bin
|
|
78
|
+
|
|
79
|
+
# Link mode (faster, old cluster becomes unusable)
|
|
80
|
+
pg_upgrade \
|
|
81
|
+
--old-datadir /var/lib/postgresql/16/main \
|
|
82
|
+
--new-datadir /var/lib/postgresql/17/main \
|
|
83
|
+
--old-bindir /usr/lib/postgresql/16/bin \
|
|
84
|
+
--new-bindir /usr/lib/postgresql/17/bin \
|
|
85
|
+
--link
|
|
86
|
+
|
|
87
|
+
# PG18+: Swap mode (fastest, swaps data directories)
|
|
88
|
+
pg_upgrade \
|
|
89
|
+
--old-datadir /var/lib/postgresql/17/main \
|
|
90
|
+
--new-datadir /var/lib/postgresql/18/main \
|
|
91
|
+
--old-bindir /usr/lib/postgresql/17/bin \
|
|
92
|
+
--new-bindir /usr/lib/postgresql/18/bin \
|
|
93
|
+
--swap
|
|
94
|
+
|
|
95
|
+
# Parallel checking: speed up pre-checks
|
|
96
|
+
pg_upgrade ... --jobs 4
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
#### 5. Start the New Cluster
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
pg_ctl start -D /var/lib/postgresql/17/main
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
#### 6. Post-Upgrade Tasks
|
|
106
|
+
|
|
107
|
+
After a successful upgrade, refresh optimizer statistics and remove the old cluster only after verification:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
# Update optimizer statistics in stages
|
|
111
|
+
vacuumdb --all --analyze-in-stages
|
|
112
|
+
|
|
113
|
+
# Generated by pg_upgrade — delete old cluster data (only after confirming the upgrade works)
|
|
114
|
+
./delete_old_cluster.sh
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Current `pg_upgrade` releases generate the deletion script but may instruct you to run `vacuumdb` directly instead of generating `analyze_new_cluster.sh`.
|
|
118
|
+
|
|
119
|
+
### Optimizer Statistics Preservation (PG18+)
|
|
120
|
+
|
|
121
|
+
PG18's `pg_upgrade` preserves most optimizer statistics by default, reducing the post-upgrade performance dip:
|
|
122
|
+
|
|
123
|
+
```bash
|
|
124
|
+
# Default in PG18: statistics are preserved
|
|
125
|
+
pg_upgrade ...
|
|
126
|
+
|
|
127
|
+
# Opt out (if you want fresh statistics)
|
|
128
|
+
pg_upgrade ... --no-statistics
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Some statistics, including cumulative statistics and statistics that cannot be transferred, still need to be rebuilt. On older versions, always run `ANALYZE` on all databases immediately after upgrading.
|
|
132
|
+
|
|
133
|
+
## Logical Replication (Minimal Downtime)
|
|
134
|
+
|
|
135
|
+
For near-zero downtime upgrades on large databases, use logical replication to stream changes from the old version to the new version, then cut over.
|
|
136
|
+
|
|
137
|
+
### Overview
|
|
138
|
+
|
|
139
|
+
1. Set up new cluster on the target PG version
|
|
140
|
+
2. Create schema on the new cluster
|
|
141
|
+
3. Set up logical replication (old → new)
|
|
142
|
+
4. Wait for initial sync + streaming to catch up
|
|
143
|
+
5. Cut over applications to the new cluster
|
|
144
|
+
|
|
145
|
+
See `logical-replication.md` for the full live migration pattern.
|
|
146
|
+
|
|
147
|
+
### Advantages Over pg_upgrade
|
|
148
|
+
|
|
149
|
+
- Downtime measured in seconds (just the application switchover)
|
|
150
|
+
- Can upgrade across multiple major versions in one step
|
|
151
|
+
- Allows testing the new cluster while the old one is still serving traffic
|
|
152
|
+
- Rollback is simple: point applications back to the old cluster
|
|
153
|
+
|
|
154
|
+
### Disadvantages
|
|
155
|
+
|
|
156
|
+
- More complex setup
|
|
157
|
+
- Sequences must be synchronized manually
|
|
158
|
+
- DDL is not replicated — schema must be created manually on the target
|
|
159
|
+
- Large objects (lo) are not replicated
|
|
160
|
+
- Some extensions may behave differently across versions
|
|
161
|
+
|
|
162
|
+
### pg_createsubscriber (PG17+)
|
|
163
|
+
|
|
164
|
+
Converts a physical standby into a logical subscriber, simplifying the setup:
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# PG18+: --all flag converts all databases at once
|
|
168
|
+
pg_createsubscriber \
|
|
169
|
+
--pgdata /var/lib/postgresql/18/main \
|
|
170
|
+
--publisher-server "host=old_primary dbname=mydb" \
|
|
171
|
+
--all
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Pre-Upgrade Checklist
|
|
175
|
+
|
|
176
|
+
### 1. Review Release Notes
|
|
177
|
+
|
|
178
|
+
Read the release notes for **every version** between your current and target version. Pay attention to:
|
|
179
|
+
- Removed features or changed defaults
|
|
180
|
+
- Extension compatibility changes
|
|
181
|
+
- Authentication changes (e.g., PG18 deprecates md5)
|
|
182
|
+
- Behavior changes that could affect queries
|
|
183
|
+
|
|
184
|
+
### 2. Check Extension Compatibility
|
|
185
|
+
|
|
186
|
+
```sql
|
|
187
|
+
-- List installed extensions and versions
|
|
188
|
+
SELECT extname, extversion FROM pg_extension ORDER BY extname;
|
|
189
|
+
|
|
190
|
+
-- Check if extensions are available in the new version
|
|
191
|
+
-- (run against the new cluster after initdb)
|
|
192
|
+
SELECT name, default_version FROM pg_available_extensions WHERE name IN (
|
|
193
|
+
SELECT extname FROM pg_extension
|
|
194
|
+
) ORDER BY name;
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### 3. Check for Deprecated Features
|
|
198
|
+
|
|
199
|
+
```sql
|
|
200
|
+
-- Check for md5 passwords (deprecated in PG18)
|
|
201
|
+
SELECT rolname
|
|
202
|
+
FROM pg_authid
|
|
203
|
+
WHERE rolcanlogin AND rolpassword LIKE 'md5%';
|
|
204
|
+
|
|
205
|
+
-- Check for removed/renamed GUC settings
|
|
206
|
+
-- (pg_upgrade --check will catch these)
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### 4. Take a Full Backup
|
|
210
|
+
|
|
211
|
+
**Non-negotiable**. Before any upgrade:
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
# Full cluster backup
|
|
215
|
+
pg_dumpall -f pre_upgrade_backup.sql
|
|
216
|
+
|
|
217
|
+
# Or physical backup
|
|
218
|
+
pg_basebackup -D /backup/pre_upgrade -Ft -z -Xs -P
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### 5. Test on a Clone
|
|
222
|
+
|
|
223
|
+
Never upgrade production first. Test on a copy:
|
|
224
|
+
|
|
225
|
+
```bash
|
|
226
|
+
# Create a test copy
|
|
227
|
+
pg_basebackup -D /tmp/upgrade_test -Fp -Xs -P
|
|
228
|
+
|
|
229
|
+
# Initialize an empty target cluster with the new version's binaries
|
|
230
|
+
/usr/lib/postgresql/17/bin/initdb -D /tmp/new_cluster
|
|
231
|
+
|
|
232
|
+
# Run pg_upgrade --check against the copy
|
|
233
|
+
/usr/lib/postgresql/17/bin/pg_upgrade --check \
|
|
234
|
+
--old-datadir /tmp/upgrade_test \
|
|
235
|
+
--new-datadir /tmp/new_cluster \
|
|
236
|
+
--old-bindir /usr/lib/postgresql/16/bin \
|
|
237
|
+
--new-bindir /usr/lib/postgresql/17/bin
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### 6. Plan for Replication
|
|
241
|
+
|
|
242
|
+
If using streaming replication:
|
|
243
|
+
- Standbys must be rebuilt after pg_upgrade (they can't follow a pg_upgraded primary)
|
|
244
|
+
- Alternative: upgrade standbys with `pg_upgrade` too (stop all, upgrade all, restart)
|
|
245
|
+
- Or use `pg_createsubscriber` (PG17+) to convert to logical replication
|
|
246
|
+
|
|
247
|
+
## Post-Upgrade Checklist
|
|
248
|
+
|
|
249
|
+
### 1. Update Optimizer Statistics
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
# Rebuild optimizer statistics in stages
|
|
253
|
+
vacuumdb --all --analyze-in-stages --jobs 4
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
On PG18+ with `pg_upgrade`, most optimizer statistics are preserved by default, but analyze tables whose statistics were not transferred and tables changed after the upgrade.
|
|
257
|
+
|
|
258
|
+
### 2. Check for Invalid Indexes
|
|
259
|
+
|
|
260
|
+
```sql
|
|
261
|
+
SELECT indexrelid::regclass, indisvalid
|
|
262
|
+
FROM pg_index
|
|
263
|
+
WHERE NOT indisvalid;
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### 3. Update Extensions
|
|
267
|
+
|
|
268
|
+
```sql
|
|
269
|
+
-- Update extensions to latest available version
|
|
270
|
+
ALTER EXTENSION pg_stat_statements UPDATE;
|
|
271
|
+
ALTER EXTENSION postgis UPDATE;
|
|
272
|
+
-- Repeat for each extension
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### 4. Review Changed Defaults
|
|
276
|
+
|
|
277
|
+
Check if new default values for GUC parameters affect your workload:
|
|
278
|
+
|
|
279
|
+
```sql
|
|
280
|
+
-- Compare settings that differ from defaults
|
|
281
|
+
SELECT name, setting, boot_val, source
|
|
282
|
+
FROM pg_settings
|
|
283
|
+
WHERE setting != boot_val
|
|
284
|
+
AND source != 'default'
|
|
285
|
+
ORDER BY name;
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
### 5. Monitor Performance
|
|
289
|
+
|
|
290
|
+
After upgrade, monitor for:
|
|
291
|
+
- Query plan regressions (optimizer changes across versions)
|
|
292
|
+
- Connection behavior changes
|
|
293
|
+
- Extension behavior changes
|
|
294
|
+
|
|
295
|
+
```sql
|
|
296
|
+
-- Compare top queries before/after via pg_stat_statements
|
|
297
|
+
SELECT left(query, 80), calls,
|
|
298
|
+
round(mean_exec_time::numeric, 1) AS avg_ms
|
|
299
|
+
FROM pg_stat_statements
|
|
300
|
+
WHERE dbid = (SELECT oid FROM pg_database WHERE datname = current_database())
|
|
301
|
+
ORDER BY total_exec_time DESC
|
|
302
|
+
LIMIT 20;
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
### 6. Clean Up
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
# Remove old cluster (only after confirming upgrade is stable)
|
|
309
|
+
./delete_old_cluster.sh
|
|
310
|
+
|
|
311
|
+
# Or manually:
|
|
312
|
+
rm -rf /var/lib/postgresql/16/main # be very careful with this
|
|
313
|
+
|
|
314
|
+
# Uninstall old PostgreSQL version
|
|
315
|
+
# (method depends on your package manager)
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
## Testing Strategy
|
|
319
|
+
|
|
320
|
+
### Regression Testing
|
|
321
|
+
|
|
322
|
+
1. **Dump queries from pg_stat_statements** before upgrade
|
|
323
|
+
2. **Replay on the test cluster** (or use `pg_stat_statements` to compare plans)
|
|
324
|
+
3. **Compare EXPLAIN plans** for your top-20 queries by total time
|
|
325
|
+
4. **Run application test suite** against the new version
|
|
326
|
+
5. **Load test** at production-like traffic levels
|
|
327
|
+
|
|
328
|
+
### Rollback Plan
|
|
329
|
+
|
|
330
|
+
- **pg_upgrade (copy mode)**: Old cluster is intact — start it back up
|
|
331
|
+
- **pg_upgrade (link mode)**: Old cluster is unusable — restore from backup
|
|
332
|
+
- **pg_upgrade (swap mode)**: The file transfer is destructive; restore the old cluster from backup
|
|
333
|
+
- **Logical replication**: Point applications back to the old cluster
|
|
334
|
+
- **Always have a tested backup** regardless of method
|