@tinkcarlos/skillora 0.2.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/skills/.temp-skill-index.md +245 -0
- package/.claude/skills/SKILL.md +264 -0
- package/.claude/skills/api-scaffolding/SKILL.md +431 -0
- package/.claude/skills/api-scaffolding/agents/backend-architect.md +282 -0
- package/.claude/skills/api-scaffolding/agents/django-pro.md +144 -0
- package/.claude/skills/api-scaffolding/agents/fastapi-pro.md +156 -0
- package/.claude/skills/api-scaffolding/agents/graphql-architect.md +146 -0
- package/.claude/skills/api-scaffolding/skills/fastapi-templates/SKILL.md +171 -0
- package/.claude/skills/api-testing-observability/SKILL.md +583 -0
- package/.claude/skills/api-testing-observability/agents/api-documenter.md +146 -0
- package/.claude/skills/api-testing-observability/commands/api-mock.md +1320 -0
- package/.claude/skills/brainstorming/SKILL.md +283 -0
- package/.claude/skills/bug-fixing/SKILL.md +382 -0
- package/.claude/skills/bug-fixing/references/backend-guide.md +132 -0
- package/.claude/skills/bug-fixing/references/bug-guide.md +354 -0
- package/.claude/skills/bug-fixing/references/bug-record-template.md +134 -0
- package/.claude/skills/bug-fixing/references/bug-records.md +88 -0
- package/.claude/skills/bug-fixing/references/code-review-gate.md +81 -0
- package/.claude/skills/bug-fixing/references/common-bugs.md +140 -0
- package/.claude/skills/bug-fixing/references/complete-workflow.md +361 -0
- package/.claude/skills/bug-fixing/references/config-driven-fixes.md +136 -0
- package/.claude/skills/bug-fixing/references/context-isolation-protocol.md +268 -0
- package/.claude/skills/bug-fixing/references/cross-surface-regression.md +120 -0
- package/.claude/skills/bug-fixing/references/database-investigation.md +129 -0
- package/.claude/skills/bug-fixing/references/dependency-and-integrity-protocol.md +369 -0
- package/.claude/skills/bug-fixing/references/fix-completeness-checklist.md +239 -0
- package/.claude/skills/bug-fixing/references/frontend-guide.md +219 -0
- package/.claude/skills/bug-fixing/references/fullstack-joint-guide.md +123 -0
- package/.claude/skills/bug-fixing/references/functional-breakage.md +117 -0
- package/.claude/skills/bug-fixing/references/ide-lint-errors-guide.md +176 -0
- package/.claude/skills/bug-fixing/references/impact-analysis.md +511 -0
- package/.claude/skills/bug-fixing/references/investigation-checklist.md +263 -0
- package/.claude/skills/bug-fixing/references/knowledge-extraction-guide.md +531 -0
- package/.claude/skills/bug-fixing/references/knowledge-workflow.md +212 -0
- package/.claude/skills/bug-fixing/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/bug-fixing/references/python-env-and-testing.md +126 -0
- package/.claude/skills/bug-fixing/references/rca-guide.md +428 -0
- package/.claude/skills/bug-fixing/references/similar-bug-patterns.md +113 -0
- package/.claude/skills/bug-fixing/references/skill-delegation-guide.md +350 -0
- package/.claude/skills/bug-fixing/references/skill-orchestration.md +155 -0
- package/.claude/skills/bug-fixing/references/testing-strategy.md +350 -0
- package/.claude/skills/bug-fixing/references/tooling-build-scripts.md +162 -0
- package/.claude/skills/bug-fixing/references/user-input-validation.md +77 -0
- package/.claude/skills/bug-fixing/references/ux-patterns.md +158 -0
- package/.claude/skills/bug-fixing/references/windows-terminal-hygiene.md +106 -0
- package/.claude/skills/bug-fixing/references/zero-regression-matrix.md +239 -0
- package/.claude/skills/bug-fixing/references/zero-risk-protocol.md +102 -0
- package/.claude/skills/bug-fixing/scripts/format_code.py +611 -0
- package/.claude/skills/bug-fixing/scripts/generate_report_template.py +74 -0
- package/.claude/skills/bug-fixing/scripts/lint_check.py +816 -0
- package/.claude/skills/bug-fixing/scripts/requirements.txt +36 -0
- package/.claude/skills/cicd-pipeline/SKILL.md +300 -0
- package/.claude/skills/code-review/SKILL.md +535 -0
- package/.claude/skills/code-review/references/anti-pattern-scan.md +102 -0
- package/.claude/skills/code-review/references/automated-analysis.md +456 -0
- package/.claude/skills/code-review/references/backend-common-issues.md +589 -0
- package/.claude/skills/code-review/references/backend-expert-guide.md +415 -0
- package/.claude/skills/code-review/references/backend-review.md +868 -0
- package/.claude/skills/code-review/references/batch-processing-strategy.md +198 -0
- package/.claude/skills/code-review/references/call-chain-analysis-protocol.md +166 -0
- package/.claude/skills/code-review/references/common-patterns.md +321 -0
- package/.claude/skills/code-review/references/configuration-review.md +425 -0
- package/.claude/skills/code-review/references/control-flow-completeness.md +114 -0
- package/.claude/skills/code-review/references/database-review.md +298 -0
- package/.claude/skills/code-review/references/dependency-and-integrity-protocol.md +313 -0
- package/.claude/skills/code-review/references/external-standards.md +51 -0
- package/.claude/skills/code-review/references/feature-review.md +329 -0
- package/.claude/skills/code-review/references/file-review-template.md +326 -0
- package/.claude/skills/code-review/references/frontend-advanced.md +654 -0
- package/.claude/skills/code-review/references/frontend-common-issues.md +482 -0
- package/.claude/skills/code-review/references/frontend-expert-guide.md +342 -0
- package/.claude/skills/code-review/references/frontend-review.md +783 -0
- package/.claude/skills/code-review/references/fullstack-consistency.md +418 -0
- package/.claude/skills/code-review/references/fullstack-review.md +477 -0
- package/.claude/skills/code-review/references/functional-completeness.md +386 -0
- package/.claude/skills/code-review/references/hidden-bugs-detection.md +473 -0
- package/.claude/skills/code-review/references/ide-lint-errors-guide.md +173 -0
- package/.claude/skills/code-review/references/infrastructure-review.md +453 -0
- package/.claude/skills/code-review/references/iteration-review.md +264 -0
- package/.claude/skills/code-review/references/job-review.md +335 -0
- package/.claude/skills/code-review/references/layered-checklist-protocol.md +157 -0
- package/.claude/skills/code-review/references/logic-completeness.md +535 -0
- package/.claude/skills/code-review/references/mandatory-checklist.md +288 -0
- package/.claude/skills/code-review/references/multi-language-guide.md +800 -0
- package/.claude/skills/code-review/references/new-project-review.md +226 -0
- package/.claude/skills/code-review/references/non-code-files-review.md +451 -0
- package/.claude/skills/code-review/references/overlooked-issues.md +657 -0
- package/.claude/skills/code-review/references/platform-specific-review.md +195 -0
- package/.claude/skills/code-review/references/precision-analysis-protocol.md +260 -0
- package/.claude/skills/code-review/references/python-patterns.md +494 -0
- package/.claude/skills/code-review/references/rca-techniques.md +362 -0
- package/.claude/skills/code-review/references/report-template.md +430 -0
- package/.claude/skills/code-review/references/resource-limits-and-degradation.md +137 -0
- package/.claude/skills/code-review/references/review-dimensions.md +311 -0
- package/.claude/skills/code-review/references/review-guide.md +202 -0
- package/.claude/skills/code-review/references/review-knowledge-workflow.md +257 -0
- package/.claude/skills/code-review/references/review-progress-tracker-protocol.md +172 -0
- package/.claude/skills/code-review/references/review-record-template.md +195 -0
- package/.claude/skills/code-review/references/skill-orchestration.md +143 -0
- package/.claude/skills/code-review/references/ui-ux-review.md +470 -0
- package/.claude/skills/containerization/SKILL.md +313 -0
- package/.claude/skills/database-migrations/agents/database-admin.md +142 -0
- package/.claude/skills/database-migrations/agents/database-optimizer.md +144 -0
- package/.claude/skills/database-migrations/commands/migration-observability.md +408 -0
- package/.claude/skills/database-migrations/commands/sql-migrations.md +492 -0
- package/.claude/skills/finishing-a-development-branch/SKILL.md +319 -0
- package/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/.claude/skills/frontend-design/SKILL.md +587 -0
- package/.claude/skills/frontend-design/references/color-consistency.md +487 -0
- package/.claude/skills/frontend-design/references/color-palettes-full.md +657 -0
- package/.claude/skills/frontend-design/references/design-system-generator.md +285 -0
- package/.claude/skills/frontend-design/references/font-pairings-full.md +705 -0
- package/.claude/skills/frontend-design/references/industry-anti-patterns.md +281 -0
- package/.claude/skills/frontend-design/references/layout-anti-patterns.md +582 -0
- package/.claude/skills/frontend-design/references/motion-patterns.md +659 -0
- package/.claude/skills/frontend-design/references/pre-delivery-checklist.md +153 -0
- package/.claude/skills/frontend-design/references/responsive-design.md +555 -0
- package/.claude/skills/frontend-design/references/style-modification-rules.md +335 -0
- package/.claude/skills/frontend-design/references/ui-styles-full.md +383 -0
- package/.claude/skills/frontend-design/references/ui-styles-rating.md +191 -0
- package/.claude/skills/frontend-design/references/ux-guidelines.md +640 -0
- package/.claude/skills/fullstack-developer/SKILL.md +512 -0
- package/.claude/skills/fullstack-developer/references/api-contract-guide.md +312 -0
- package/.claude/skills/fullstack-developer/references/api-response-patterns.md +223 -0
- package/.claude/skills/fullstack-developer/references/async-patterns.md +220 -0
- package/.claude/skills/fullstack-developer/references/bug-prevention.md +914 -0
- package/.claude/skills/fullstack-developer/references/code-quality-checklist.md +271 -0
- package/.claude/skills/fullstack-developer/references/complete-development-workflow.md +278 -0
- package/.claude/skills/fullstack-developer/references/context-isolation-protocol.md +256 -0
- package/.claude/skills/fullstack-developer/references/database-migration.md +331 -0
- package/.claude/skills/fullstack-developer/references/dependency-and-integrity-protocol.md +390 -0
- package/.claude/skills/fullstack-developer/references/development-phases.md +333 -0
- package/.claude/skills/fullstack-developer/references/expert-guide.md +214 -0
- package/.claude/skills/fullstack-developer/references/file-import-patterns.md +114 -0
- package/.claude/skills/fullstack-developer/references/graceful-degradation-patterns.md +78 -0
- package/.claude/skills/fullstack-developer/references/ide-lint-errors-guide.md +183 -0
- package/.claude/skills/fullstack-developer/references/integration-testing.md +301 -0
- package/.claude/skills/fullstack-developer/references/mock-api-patterns.md +307 -0
- package/.claude/skills/fullstack-developer/references/phase-gate-template.md +249 -0
- package/.claude/skills/fullstack-developer/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/fullstack-developer/references/python-engineering.md +79 -0
- package/.claude/skills/fullstack-developer/references/skill-orchestration.md +214 -0
- package/.claude/skills/fullstack-developer/references/skill-router-table.md +304 -0
- package/.claude/skills/fullstack-developer/references/state-sync.md +217 -0
- package/.claude/skills/fullstack-developer/references/ui-testing-checklist.md +292 -0
- package/.claude/skills/fullstack-developer/scripts/format_code.py +611 -0
- package/.claude/skills/fullstack-developer/scripts/lint_check.py +816 -0
- package/.claude/skills/fullstack-developer/scripts/requirements.txt +36 -0
- package/.claude/skills/performance-optimization/SKILL.md +250 -0
- package/.claude/skills/product-requirements/SKILL.md +357 -0
- package/.claude/skills/product-requirements/references/acceptance-criteria.md +335 -0
- package/.claude/skills/product-requirements/references/answer-first-questioning-protocol.md +299 -0
- package/.claude/skills/product-requirements/references/competitive-analysis-guide.md +183 -0
- package/.claude/skills/product-requirements/references/document-accuracy-protocol.md +253 -0
- package/.claude/skills/product-requirements/references/document-management-protocol.md +278 -0
- package/.claude/skills/product-requirements/references/external-standards.md +62 -0
- package/.claude/skills/product-requirements/references/feature-spec-template.md +359 -0
- package/.claude/skills/product-requirements/references/knowledge-acquisition-protocol.md +251 -0
- package/.claude/skills/product-requirements/references/plan-execution-protocol.md +334 -0
- package/.claude/skills/product-requirements/references/plan-generation-protocol.md +264 -0
- package/.claude/skills/product-requirements/references/prioritization-frameworks.md +80 -0
- package/.claude/skills/product-requirements/references/requirement-decomposition-protocol.md +291 -0
- package/.claude/skills/product-requirements/references/user-story-examples.md +297 -0
- package/.claude/skills/product-requirements/references/workflow-templates.md +266 -0
- package/.claude/skills/react-best-practices/SKILL.md +198 -0
- package/.claude/skills/react-best-practices/references/advanced-patterns.md +94 -0
- package/.claude/skills/react-best-practices/references/bundle-optimization.md +182 -0
- package/.claude/skills/react-best-practices/references/client-data-fetching.md +112 -0
- package/.claude/skills/react-best-practices/references/complete-guide.md +2249 -0
- package/.claude/skills/react-best-practices/references/eliminating-waterfalls.md +169 -0
- package/.claude/skills/react-best-practices/references/javascript-performance.md +256 -0
- package/.claude/skills/react-best-practices/references/rendering-performance.md +230 -0
- package/.claude/skills/react-best-practices/references/rerender-optimization.md +214 -0
- package/.claude/skills/react-best-practices/references/server-performance.md +182 -0
- package/.claude/skills/security-audit/SKILL.md +226 -0
- package/.claude/skills/shared-references/advanced-debugging-techniques.md +186 -0
- package/.claude/skills/shared-references/code-quality-checklist.md +218 -0
- package/.claude/skills/shared-references/code-review-efficiency-guide.md +125 -0
- package/.claude/skills/shared-references/mcp-dependency-compatibility-protocol.md +276 -0
- package/.claude/skills/shared-references/skill-call-graph.md +230 -0
- package/.claude/skills/shared-references/skill-orchestration-protocol.md +281 -0
- package/.claude/skills/shared-references/subagent-dispatch-templates.md +199 -0
- package/.claude/skills/skill-expert-skills/LICENSE.txt +204 -0
- package/.claude/skills/skill-expert-skills/QUICK_NAVIGATION.md +374 -0
- package/.claude/skills/skill-expert-skills/SKILL.md +247 -0
- package/.claude/skills/skill-expert-skills/docs/_index.md +91 -0
- package/.claude/skills/skill-expert-skills/references/deep-research-methodology.md +389 -0
- package/.claude/skills/skill-expert-skills/references/docs-generation-workflow.md +398 -0
- package/.claude/skills/skill-expert-skills/references/domain-expertise-protocol.md +343 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/_index.md +54 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/backend-expertise.md +517 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/bug-fixing-expertise.md +363 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/code-review-expertise.md +392 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/frontend-expertise.md +410 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge-template.md +503 -0
- package/.claude/skills/skill-expert-skills/references/examples.md +782 -0
- package/.claude/skills/skill-expert-skills/references/integration-examples.md +655 -0
- package/.claude/skills/skill-expert-skills/references/knowledge-validation-checklist.md +246 -0
- package/.claude/skills/skill-expert-skills/references/latest-knowledge-acquisition.md +461 -0
- package/.claude/skills/skill-expert-skills/references/mcp-tools-guide.md +439 -0
- package/.claude/skills/skill-expert-skills/references/official-best-practices.md +616 -0
- package/.claude/skills/skill-expert-skills/references/patterns.md +218 -0
- package/.claude/skills/skill-expert-skills/references/plugin-skills-guide.md +432 -0
- package/.claude/skills/skill-expert-skills/references/requirement-elicitation-protocol.md +290 -0
- package/.claude/skills/skill-expert-skills/references/skill-creator-SKILL.md +353 -0
- package/.claude/skills/skill-expert-skills/references/skill-templates.md +583 -0
- package/.claude/skills/skill-expert-skills/references/skills-knowledge-base.md +561 -0
- package/.claude/skills/skill-expert-skills/references/tools-guide.md +379 -0
- package/.claude/skills/skill-expert-skills/references/troubleshooting.md +378 -0
- package/.claude/skills/skill-expert-skills/references/universality-guide.md +205 -0
- package/.claude/skills/skill-expert-skills/references/writing-style-guide.md +466 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/quick_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/universal_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/analyze_trigger.py +425 -0
- package/.claude/skills/skill-expert-skills/scripts/diff_with_official.py +188 -0
- package/.claude/skills/skill-expert-skills/scripts/init_skill.py +349 -0
- package/.claude/skills/skill-expert-skills/scripts/package_skill.py +156 -0
- package/.claude/skills/skill-expert-skills/scripts/quick_validate.py +493 -0
- package/.claude/skills/skill-expert-skills/scripts/requirements.txt +2 -0
- package/.claude/skills/skill-expert-skills/scripts/universal_validate.py +182 -0
- package/.claude/skills/skill-expert-skills/scripts/upgrade_skill.py +431 -0
- package/.claude/skills/subagent-driven-development/SKILL.md +268 -0
- package/.claude/skills/test-driven-development/SKILL.md +246 -0
- package/.claude/skills/test-driven-development/references/testing-anti-patterns.md +192 -0
- package/.claude/skills/using-git-worktrees/SKILL.md +266 -0
- package/.claude/skills/using-skillstack/SKILL.md +127 -0
- package/.claude/skills/vercel-deploy/SKILL.md +166 -0
- package/.claude/skills/vercel-deploy/scripts/deploy.sh +249 -0
- package/.claude/skills/verification-before-completion/SKILL.md +305 -0
- package/.claude/skills/writing-plans/SKILL.md +259 -0
- package/README.md +69 -0
- package/bin/cli.js +468 -0
- package/lib/init.js +333 -0
- package/package.json +29 -0
|
@@ -0,0 +1,492 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: SQL database migrations with zero-downtime strategies for PostgreSQL, MySQL, SQL Server
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
tags: [database, sql, migrations, postgresql, mysql, flyway, liquibase, alembic, zero-downtime]
|
|
5
|
+
tool_access: [Read, Write, Edit, Bash, Grep, Glob]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# SQL Database Migration Strategy and Implementation
|
|
9
|
+
|
|
10
|
+
You are a SQL database migration expert specializing in zero-downtime deployments, data integrity, and production-ready migration strategies for PostgreSQL, MySQL, and SQL Server. Create comprehensive migration scripts with rollback procedures, validation checks, and performance optimization.
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
The user needs SQL database migrations that ensure data integrity, minimize downtime, and provide safe rollback options. Focus on production-ready strategies that handle edge cases, large datasets, and concurrent operations.
|
|
14
|
+
|
|
15
|
+
## Requirements
|
|
16
|
+
$ARGUMENTS
|
|
17
|
+
|
|
18
|
+
## Instructions
|
|
19
|
+
|
|
20
|
+
### 1. Zero-Downtime Migration Strategies
|
|
21
|
+
|
|
22
|
+
**Expand-Contract Pattern**
|
|
23
|
+
|
|
24
|
+
```sql
|
|
25
|
+
-- Phase 1: EXPAND (backward compatible)
|
|
26
|
+
ALTER TABLE users ADD COLUMN email_verified BOOLEAN DEFAULT FALSE;
|
|
27
|
+
CREATE INDEX CONCURRENTLY idx_users_email_verified ON users(email_verified);
|
|
28
|
+
|
|
29
|
+
-- Phase 2: MIGRATE DATA (in batches)
|
|
30
|
+
DO $$
|
|
31
|
+
DECLARE
|
|
32
|
+
batch_size INT := 10000;
|
|
33
|
+
rows_updated INT;
|
|
34
|
+
BEGIN
|
|
35
|
+
LOOP
|
|
36
|
+
UPDATE users
|
|
37
|
+
SET email_verified = (email_confirmation_token IS NOT NULL)
|
|
38
|
+
WHERE id IN (
|
|
39
|
+
SELECT id FROM users
|
|
40
|
+
WHERE email_verified IS NULL
|
|
41
|
+
LIMIT batch_size
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
GET DIAGNOSTICS rows_updated = ROW_COUNT;
|
|
45
|
+
EXIT WHEN rows_updated = 0;
|
|
46
|
+
COMMIT;
|
|
47
|
+
PERFORM pg_sleep(0.1);
|
|
48
|
+
END LOOP;
|
|
49
|
+
END $$;
|
|
50
|
+
|
|
51
|
+
-- Phase 3: CONTRACT (after code deployment)
|
|
52
|
+
ALTER TABLE users DROP COLUMN email_confirmation_token;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
**Blue-Green Schema Migration**
|
|
56
|
+
|
|
57
|
+
```sql
|
|
58
|
+
-- Step 1: Create new schema version
|
|
59
|
+
CREATE TABLE v2_orders (
|
|
60
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
61
|
+
customer_id UUID NOT NULL,
|
|
62
|
+
total_amount DECIMAL(12,2) NOT NULL,
|
|
63
|
+
status VARCHAR(50) NOT NULL,
|
|
64
|
+
metadata JSONB DEFAULT '{}',
|
|
65
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
66
|
+
|
|
67
|
+
CONSTRAINT fk_v2_orders_customer
|
|
68
|
+
FOREIGN KEY (customer_id) REFERENCES customers(id),
|
|
69
|
+
CONSTRAINT chk_v2_orders_amount
|
|
70
|
+
CHECK (total_amount >= 0)
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
CREATE INDEX idx_v2_orders_customer ON v2_orders(customer_id);
|
|
74
|
+
CREATE INDEX idx_v2_orders_status ON v2_orders(status);
|
|
75
|
+
|
|
76
|
+
-- Step 2: Dual-write synchronization
|
|
77
|
+
CREATE OR REPLACE FUNCTION sync_orders_to_v2()
|
|
78
|
+
RETURNS TRIGGER AS $$
|
|
79
|
+
BEGIN
|
|
80
|
+
INSERT INTO v2_orders (id, customer_id, total_amount, status)
|
|
81
|
+
VALUES (NEW.id, NEW.customer_id, NEW.amount, NEW.state)
|
|
82
|
+
ON CONFLICT (id) DO UPDATE SET
|
|
83
|
+
total_amount = EXCLUDED.total_amount,
|
|
84
|
+
status = EXCLUDED.status;
|
|
85
|
+
RETURN NEW;
|
|
86
|
+
END;
|
|
87
|
+
$$ LANGUAGE plpgsql;
|
|
88
|
+
|
|
89
|
+
CREATE TRIGGER sync_orders_trigger
|
|
90
|
+
AFTER INSERT OR UPDATE ON orders
|
|
91
|
+
FOR EACH ROW EXECUTE FUNCTION sync_orders_to_v2();
|
|
92
|
+
|
|
93
|
+
-- Step 3: Backfill historical data
|
|
94
|
+
DO $$
|
|
95
|
+
DECLARE
|
|
96
|
+
batch_size INT := 10000;
|
|
97
|
+
last_id UUID := NULL;
|
|
98
|
+
BEGIN
|
|
99
|
+
LOOP
|
|
100
|
+
INSERT INTO v2_orders (id, customer_id, total_amount, status)
|
|
101
|
+
SELECT id, customer_id, amount, state
|
|
102
|
+
FROM orders
|
|
103
|
+
WHERE (last_id IS NULL OR id > last_id)
|
|
104
|
+
ORDER BY id
|
|
105
|
+
LIMIT batch_size
|
|
106
|
+
ON CONFLICT (id) DO NOTHING;
|
|
107
|
+
|
|
108
|
+
SELECT id INTO last_id FROM orders
|
|
109
|
+
WHERE (last_id IS NULL OR id > last_id)
|
|
110
|
+
ORDER BY id LIMIT 1 OFFSET (batch_size - 1);
|
|
111
|
+
|
|
112
|
+
EXIT WHEN last_id IS NULL;
|
|
113
|
+
COMMIT;
|
|
114
|
+
END LOOP;
|
|
115
|
+
END $$;
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Online Schema Change**
|
|
119
|
+
|
|
120
|
+
```sql
|
|
121
|
+
-- PostgreSQL: Add NOT NULL safely
|
|
122
|
+
-- Step 1: Add column as nullable
|
|
123
|
+
ALTER TABLE large_table ADD COLUMN new_field VARCHAR(100);
|
|
124
|
+
|
|
125
|
+
-- Step 2: Backfill data
|
|
126
|
+
UPDATE large_table
|
|
127
|
+
SET new_field = 'default_value'
|
|
128
|
+
WHERE new_field IS NULL;
|
|
129
|
+
|
|
130
|
+
-- Step 3: Add constraint (PostgreSQL 12+)
|
|
131
|
+
ALTER TABLE large_table
|
|
132
|
+
ADD CONSTRAINT chk_new_field_not_null
|
|
133
|
+
CHECK (new_field IS NOT NULL) NOT VALID;
|
|
134
|
+
|
|
135
|
+
ALTER TABLE large_table
|
|
136
|
+
VALIDATE CONSTRAINT chk_new_field_not_null;
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### 2. Migration Scripts
|
|
140
|
+
|
|
141
|
+
**Flyway Migration**
|
|
142
|
+
|
|
143
|
+
```sql
|
|
144
|
+
-- V001__add_user_preferences.sql
|
|
145
|
+
BEGIN;
|
|
146
|
+
|
|
147
|
+
CREATE TABLE IF NOT EXISTS user_preferences (
|
|
148
|
+
user_id UUID PRIMARY KEY,
|
|
149
|
+
theme VARCHAR(20) DEFAULT 'light' NOT NULL,
|
|
150
|
+
language VARCHAR(10) DEFAULT 'en' NOT NULL,
|
|
151
|
+
timezone VARCHAR(50) DEFAULT 'UTC' NOT NULL,
|
|
152
|
+
notifications JSONB DEFAULT '{}' NOT NULL,
|
|
153
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
154
|
+
|
|
155
|
+
CONSTRAINT fk_user_preferences_user
|
|
156
|
+
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
|
157
|
+
);
|
|
158
|
+
|
|
159
|
+
CREATE INDEX idx_user_preferences_language ON user_preferences(language);
|
|
160
|
+
|
|
161
|
+
-- Seed defaults for existing users
|
|
162
|
+
INSERT INTO user_preferences (user_id)
|
|
163
|
+
SELECT id FROM users
|
|
164
|
+
ON CONFLICT (user_id) DO NOTHING;
|
|
165
|
+
|
|
166
|
+
COMMIT;
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
**Alembic Migration (Python)**
|
|
170
|
+
|
|
171
|
+
```python
|
|
172
|
+
"""add_user_preferences
|
|
173
|
+
|
|
174
|
+
Revision ID: 001_user_prefs
|
|
175
|
+
"""
|
|
176
|
+
from alembic import op
|
|
177
|
+
import sqlalchemy as sa
|
|
178
|
+
from sqlalchemy.dialects import postgresql
|
|
179
|
+
|
|
180
|
+
def upgrade():
|
|
181
|
+
op.create_table(
|
|
182
|
+
'user_preferences',
|
|
183
|
+
sa.Column('user_id', postgresql.UUID(as_uuid=True), primary_key=True),
|
|
184
|
+
sa.Column('theme', sa.VARCHAR(20), nullable=False, server_default='light'),
|
|
185
|
+
sa.Column('language', sa.VARCHAR(10), nullable=False, server_default='en'),
|
|
186
|
+
sa.Column('timezone', sa.VARCHAR(50), nullable=False, server_default='UTC'),
|
|
187
|
+
sa.Column('notifications', postgresql.JSONB, nullable=False,
|
|
188
|
+
server_default=sa.text("'{}'::jsonb")),
|
|
189
|
+
sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='CASCADE')
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
op.create_index('idx_user_preferences_language', 'user_preferences', ['language'])
|
|
193
|
+
|
|
194
|
+
op.execute("""
|
|
195
|
+
INSERT INTO user_preferences (user_id)
|
|
196
|
+
SELECT id FROM users
|
|
197
|
+
ON CONFLICT (user_id) DO NOTHING
|
|
198
|
+
""")
|
|
199
|
+
|
|
200
|
+
def downgrade():
|
|
201
|
+
op.drop_table('user_preferences')
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### 3. Data Integrity Validation
|
|
205
|
+
|
|
206
|
+
```python
|
|
207
|
+
def validate_pre_migration(db_connection):
|
|
208
|
+
checks = []
|
|
209
|
+
|
|
210
|
+
# Check 1: NULL values in critical columns
|
|
211
|
+
null_check = db_connection.execute("""
|
|
212
|
+
SELECT table_name, COUNT(*) as null_count
|
|
213
|
+
FROM users WHERE email IS NULL
|
|
214
|
+
""").fetchall()
|
|
215
|
+
|
|
216
|
+
if null_check[0]['null_count'] > 0:
|
|
217
|
+
checks.append({
|
|
218
|
+
'check': 'null_values',
|
|
219
|
+
'status': 'FAILED',
|
|
220
|
+
'severity': 'CRITICAL',
|
|
221
|
+
'message': 'NULL values found in required columns'
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
# Check 2: Duplicate values
|
|
225
|
+
duplicate_check = db_connection.execute("""
|
|
226
|
+
SELECT email, COUNT(*) as count
|
|
227
|
+
FROM users
|
|
228
|
+
GROUP BY email
|
|
229
|
+
HAVING COUNT(*) > 1
|
|
230
|
+
""").fetchall()
|
|
231
|
+
|
|
232
|
+
if duplicate_check:
|
|
233
|
+
checks.append({
|
|
234
|
+
'check': 'duplicates',
|
|
235
|
+
'status': 'FAILED',
|
|
236
|
+
'severity': 'CRITICAL',
|
|
237
|
+
'message': f'{len(duplicate_check)} duplicate emails'
|
|
238
|
+
})
|
|
239
|
+
|
|
240
|
+
return checks
|
|
241
|
+
|
|
242
|
+
def validate_post_migration(db_connection, migration_spec):
|
|
243
|
+
validations = []
|
|
244
|
+
|
|
245
|
+
# Row count verification
|
|
246
|
+
for table in migration_spec['affected_tables']:
|
|
247
|
+
actual_count = db_connection.execute(
|
|
248
|
+
f"SELECT COUNT(*) FROM {table['name']}"
|
|
249
|
+
).fetchone()[0]
|
|
250
|
+
|
|
251
|
+
validations.append({
|
|
252
|
+
'check': 'row_count',
|
|
253
|
+
'table': table['name'],
|
|
254
|
+
'expected': table['expected_count'],
|
|
255
|
+
'actual': actual_count,
|
|
256
|
+
'status': 'PASS' if actual_count == table['expected_count'] else 'FAIL'
|
|
257
|
+
})
|
|
258
|
+
|
|
259
|
+
return validations
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
### 4. Rollback Procedures
|
|
263
|
+
|
|
264
|
+
```python
|
|
265
|
+
import psycopg2
|
|
266
|
+
from contextlib import contextmanager
|
|
267
|
+
|
|
268
|
+
class MigrationRunner:
|
|
269
|
+
def __init__(self, db_config):
|
|
270
|
+
self.db_config = db_config
|
|
271
|
+
self.conn = None
|
|
272
|
+
|
|
273
|
+
@contextmanager
|
|
274
|
+
def migration_transaction(self):
|
|
275
|
+
try:
|
|
276
|
+
self.conn = psycopg2.connect(**self.db_config)
|
|
277
|
+
self.conn.autocommit = False
|
|
278
|
+
|
|
279
|
+
cursor = self.conn.cursor()
|
|
280
|
+
cursor.execute("SAVEPOINT migration_start")
|
|
281
|
+
|
|
282
|
+
yield cursor
|
|
283
|
+
|
|
284
|
+
self.conn.commit()
|
|
285
|
+
|
|
286
|
+
except Exception as e:
|
|
287
|
+
if self.conn:
|
|
288
|
+
self.conn.rollback()
|
|
289
|
+
raise
|
|
290
|
+
finally:
|
|
291
|
+
if self.conn:
|
|
292
|
+
self.conn.close()
|
|
293
|
+
|
|
294
|
+
def run_with_validation(self, migration):
|
|
295
|
+
try:
|
|
296
|
+
# Pre-migration validation
|
|
297
|
+
pre_checks = self.validate_pre_migration(migration)
|
|
298
|
+
if any(c['status'] == 'FAILED' for c in pre_checks):
|
|
299
|
+
raise MigrationError("Pre-migration validation failed")
|
|
300
|
+
|
|
301
|
+
# Create backup
|
|
302
|
+
self.create_snapshot()
|
|
303
|
+
|
|
304
|
+
# Execute migration
|
|
305
|
+
with self.migration_transaction() as cursor:
|
|
306
|
+
for statement in migration.forward_sql:
|
|
307
|
+
cursor.execute(statement)
|
|
308
|
+
|
|
309
|
+
post_checks = self.validate_post_migration(migration, cursor)
|
|
310
|
+
if any(c['status'] == 'FAIL' for c in post_checks):
|
|
311
|
+
raise MigrationError("Post-migration validation failed")
|
|
312
|
+
|
|
313
|
+
self.cleanup_snapshot()
|
|
314
|
+
|
|
315
|
+
except Exception as e:
|
|
316
|
+
self.rollback_from_snapshot()
|
|
317
|
+
raise
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
**Rollback Script**
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
#!/bin/bash
|
|
324
|
+
# rollback_migration.sh
|
|
325
|
+
|
|
326
|
+
set -e
|
|
327
|
+
|
|
328
|
+
MIGRATION_VERSION=$1
|
|
329
|
+
DATABASE=$2
|
|
330
|
+
|
|
331
|
+
# Verify current version
|
|
332
|
+
CURRENT_VERSION=$(psql -d $DATABASE -t -c \
|
|
333
|
+
"SELECT version FROM schema_migrations ORDER BY applied_at DESC LIMIT 1" | xargs)
|
|
334
|
+
|
|
335
|
+
if [ "$CURRENT_VERSION" != "$MIGRATION_VERSION" ]; then
|
|
336
|
+
echo "❌ Version mismatch"
|
|
337
|
+
exit 1
|
|
338
|
+
fi
|
|
339
|
+
|
|
340
|
+
# Create backup
|
|
341
|
+
BACKUP_FILE="pre_rollback_${MIGRATION_VERSION}_$(date +%Y%m%d_%H%M%S).sql"
|
|
342
|
+
pg_dump -d $DATABASE -f "$BACKUP_FILE"
|
|
343
|
+
|
|
344
|
+
# Execute rollback
|
|
345
|
+
if [ -f "migrations/${MIGRATION_VERSION}.down.sql" ]; then
|
|
346
|
+
psql -d $DATABASE -f "migrations/${MIGRATION_VERSION}.down.sql"
|
|
347
|
+
psql -d $DATABASE -c "DELETE FROM schema_migrations WHERE version = '$MIGRATION_VERSION';"
|
|
348
|
+
echo "✅ Rollback complete"
|
|
349
|
+
else
|
|
350
|
+
echo "❌ Rollback file not found"
|
|
351
|
+
exit 1
|
|
352
|
+
fi
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
### 5. Performance Optimization
|
|
356
|
+
|
|
357
|
+
**Batch Processing**
|
|
358
|
+
|
|
359
|
+
```python
|
|
360
|
+
class BatchMigrator:
|
|
361
|
+
def __init__(self, db_connection, batch_size=10000):
|
|
362
|
+
self.db = db_connection
|
|
363
|
+
self.batch_size = batch_size
|
|
364
|
+
|
|
365
|
+
def migrate_large_table(self, source_query, target_query, cursor_column='id'):
|
|
366
|
+
last_cursor = None
|
|
367
|
+
batch_number = 0
|
|
368
|
+
|
|
369
|
+
while True:
|
|
370
|
+
batch_number += 1
|
|
371
|
+
|
|
372
|
+
if last_cursor is None:
|
|
373
|
+
batch_query = f"{source_query} ORDER BY {cursor_column} LIMIT {self.batch_size}"
|
|
374
|
+
params = []
|
|
375
|
+
else:
|
|
376
|
+
batch_query = f"{source_query} AND {cursor_column} > %s ORDER BY {cursor_column} LIMIT {self.batch_size}"
|
|
377
|
+
params = [last_cursor]
|
|
378
|
+
|
|
379
|
+
rows = self.db.execute(batch_query, params).fetchall()
|
|
380
|
+
if not rows:
|
|
381
|
+
break
|
|
382
|
+
|
|
383
|
+
for row in rows:
|
|
384
|
+
self.db.execute(target_query, row)
|
|
385
|
+
|
|
386
|
+
last_cursor = rows[-1][cursor_column]
|
|
387
|
+
self.db.commit()
|
|
388
|
+
|
|
389
|
+
print(f"Batch {batch_number}: {len(rows)} rows")
|
|
390
|
+
time.sleep(0.1)
|
|
391
|
+
```
|
|
392
|
+
|
|
393
|
+
**Parallel Migration**
|
|
394
|
+
|
|
395
|
+
```python
|
|
396
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
397
|
+
|
|
398
|
+
class ParallelMigrator:
|
|
399
|
+
def __init__(self, db_config, num_workers=4):
|
|
400
|
+
self.db_config = db_config
|
|
401
|
+
self.num_workers = num_workers
|
|
402
|
+
|
|
403
|
+
def migrate_partition(self, partition_spec):
|
|
404
|
+
table_name, start_id, end_id = partition_spec
|
|
405
|
+
|
|
406
|
+
conn = psycopg2.connect(**self.db_config)
|
|
407
|
+
cursor = conn.cursor()
|
|
408
|
+
|
|
409
|
+
cursor.execute(f"""
|
|
410
|
+
INSERT INTO v2_{table_name} (columns...)
|
|
411
|
+
SELECT columns...
|
|
412
|
+
FROM {table_name}
|
|
413
|
+
WHERE id >= %s AND id < %s
|
|
414
|
+
""", [start_id, end_id])
|
|
415
|
+
|
|
416
|
+
conn.commit()
|
|
417
|
+
cursor.close()
|
|
418
|
+
conn.close()
|
|
419
|
+
|
|
420
|
+
def migrate_table_parallel(self, table_name, partition_size=100000):
|
|
421
|
+
# Get table bounds
|
|
422
|
+
conn = psycopg2.connect(**self.db_config)
|
|
423
|
+
cursor = conn.cursor()
|
|
424
|
+
|
|
425
|
+
cursor.execute(f"SELECT MIN(id), MAX(id) FROM {table_name}")
|
|
426
|
+
min_id, max_id = cursor.fetchone()
|
|
427
|
+
|
|
428
|
+
# Create partitions
|
|
429
|
+
partitions = []
|
|
430
|
+
current_id = min_id
|
|
431
|
+
while current_id <= max_id:
|
|
432
|
+
partitions.append((table_name, current_id, current_id + partition_size))
|
|
433
|
+
current_id += partition_size
|
|
434
|
+
|
|
435
|
+
# Execute in parallel
|
|
436
|
+
with ThreadPoolExecutor(max_workers=self.num_workers) as executor:
|
|
437
|
+
results = list(executor.map(self.migrate_partition, partitions))
|
|
438
|
+
|
|
439
|
+
conn.close()
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
### 6. Index Management
|
|
443
|
+
|
|
444
|
+
```sql
|
|
445
|
+
-- Drop indexes before bulk insert, recreate after
|
|
446
|
+
CREATE TEMP TABLE migration_indexes AS
|
|
447
|
+
SELECT indexname, indexdef
|
|
448
|
+
FROM pg_indexes
|
|
449
|
+
WHERE tablename = 'large_table'
|
|
450
|
+
AND indexname NOT LIKE '%pkey%';
|
|
451
|
+
|
|
452
|
+
-- Drop indexes
|
|
453
|
+
DO $$
|
|
454
|
+
DECLARE idx_record RECORD;
|
|
455
|
+
BEGIN
|
|
456
|
+
FOR idx_record IN SELECT indexname FROM migration_indexes
|
|
457
|
+
LOOP
|
|
458
|
+
EXECUTE format('DROP INDEX IF EXISTS %I', idx_record.indexname);
|
|
459
|
+
END LOOP;
|
|
460
|
+
END $$;
|
|
461
|
+
|
|
462
|
+
-- Perform bulk operation
|
|
463
|
+
INSERT INTO large_table SELECT * FROM source_table;
|
|
464
|
+
|
|
465
|
+
-- Recreate indexes CONCURRENTLY
|
|
466
|
+
DO $$
|
|
467
|
+
DECLARE idx_record RECORD;
|
|
468
|
+
BEGIN
|
|
469
|
+
FOR idx_record IN SELECT indexdef FROM migration_indexes
|
|
470
|
+
LOOP
|
|
471
|
+
EXECUTE regexp_replace(idx_record.indexdef, 'CREATE INDEX', 'CREATE INDEX CONCURRENTLY');
|
|
472
|
+
END LOOP;
|
|
473
|
+
END $$;
|
|
474
|
+
```
|
|
475
|
+
|
|
476
|
+
## Output Format
|
|
477
|
+
|
|
478
|
+
1. **Migration Analysis Report**: Detailed breakdown of changes
|
|
479
|
+
2. **Zero-Downtime Implementation Plan**: Expand-contract or blue-green strategy
|
|
480
|
+
3. **Migration Scripts**: Version-controlled SQL with framework integration
|
|
481
|
+
4. **Validation Suite**: Pre and post-migration checks
|
|
482
|
+
5. **Rollback Procedures**: Automated and manual rollback scripts
|
|
483
|
+
6. **Performance Optimization**: Batch processing, parallel execution
|
|
484
|
+
7. **Monitoring Integration**: Progress tracking and alerting
|
|
485
|
+
|
|
486
|
+
Focus on production-ready SQL migrations with zero-downtime deployment strategies, comprehensive validation, and enterprise-grade safety mechanisms.
|
|
487
|
+
|
|
488
|
+
## Related Plugins
|
|
489
|
+
|
|
490
|
+
- **nosql-migrations**: Migration strategies for MongoDB, DynamoDB, Cassandra
|
|
491
|
+
- **migration-observability**: Real-time monitoring and alerting
|
|
492
|
+
- **migration-integration**: CI/CD integration and automated testing
|