with one click
db-rollback
Restore database to previous snapshot or run rollback script
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
Restore database to previous snapshot or run rollback script
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
Execute story development with selectable automation modes to accommodate different developer preferences, skill levels, and story complexity.
Set up a Kord-aligned documentation baseline (no legacy frameworks)
Create Next Story Task methodology and workflow
Validate Next Story Task methodology and workflow
advanced-elicitation methodology and workflow
No checklists needed - this task facilitates brainstorming sessions, validation is through user interaction methodology and workflow
| name | db-rollback |
| description | Restore database to previous snapshot or run rollback script |
| agent | architect |
| subtask | false |
Restore database to previous snapshot or run rollback script
Parameter:* mode (optional, default: interactive)
Purpose:* Definitive pass/fail criteria for task completion
Checklist:*
acceptance-criteria:
- [ ] Data persisted correctly; constraints respected; no orphaned data
type: acceptance-criterion
blocker: true
validation: |
Assert data persisted correctly; constraints respected; no orphaned data
error_message: "Acceptance criterion not met: Data persisted correctly; constraints respected; no orphaned data"
Strategy:* abort
Common Errors:*
Error:* Connection Failed
Error:* Query Syntax Error
Error:* Transaction Rollback
target (string): Path to snapshot file or rollback scriptCRITICAL WARNING*: Display to user before proceeding
⚠️ DATABASE ROLLBACK WARNING ⚠️
You are about to restore the database to a previous state.
Target: {target}
This will:
✓ Drop and recreate all schema objects
✓ Preserve existing data (if schema-only snapshot)
✗ Lose any schema changes made after snapshot
✗ Potentially break application if schema incompatible
Are you ABSOLUTELY SURE you want to proceed?
Ask user to type: ROLLBACK to confirm
# Create emergency snapshot before rollback
echo "Creating emergency snapshot before rollback..."
TS=$(date +%Y%m%d_%H%M%S)
EMERGENCY="supabase/snapshots/${TS}_emergency_before_rollback.sql"
pg_dump "$SUPABASE_DB_URL" \
--schema-only \
--clean \
--if-exists \
> "$EMERGENCY"
if [ $? -eq 0 ]; then
echo "✓ Emergency snapshot: $EMERGENCY"
else
echo "❌ Emergency snapshot failed - ABORTING ROLLBACK"
exit 1
fi
TARGET="{target}"
# Check file exists
if [ ! -f "$TARGET" ]; then
echo "❌ Rollback target not found: $TARGET"
exit 1
fi
# Check file is valid SQL
if ! grep -q "CREATE\|DROP\|ALTER" "$TARGET"; then
echo "❌ File doesn't appear to be valid SQL"
exit 1
fi
echo "✓ Rollback target validated: $TARGET"
echo " File size: $(ls -lh "$TARGET" | awk '{print $5}')"
echo " Modified: $(ls -lh "$TARGET" | awk '{print $6, $7, $8}')"
Prevent concurrent operations:
echo "Acquiring exclusive lock..."
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -c \
"SELECT pg_try_advisory_lock(hashtext('dbsage:rollback')) AS got" \
| grep -q t || { echo "❌ Another operation is running"; exit 1; }
echo "✓ Lock acquired"
echo ""
echo "=== EXECUTING ROLLBACK ==="
echo "Started: $(date -Iseconds)"
echo ""
# Run rollback in single transaction
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -f "$TARGET"
RESULT=$?
echo ""
echo "Completed: $(date -Iseconds)"
echo ""
if [ $RESULT -eq 0 ]; then
echo "✅ ROLLBACK SUCCESSFUL"
else
echo "❌ ROLLBACK FAILED"
echo "Emergency snapshot available: $EMERGENCY"
echo "Attempting to restore from emergency snapshot..."
# Try to restore emergency snapshot
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -f "$EMERGENCY"
if [ $? -eq 0 ]; then
echo "✓ Restored from emergency snapshot"
else
echo "❌ Emergency restore also failed - DATABASE MAY BE INCONSISTENT"
echo "Manual intervention required"
fi
exit 1
fi
echo ""
echo "=== POST-ROLLBACK VALIDATION ==="
echo ""
# Count schema objects
echo "Schema object counts:"
psql "$SUPABASE_DB_URL" -t -c \
"SELECT
(SELECT COUNT(*) FROM pg_tables WHERE schemaname='public') AS tables,
(SELECT COUNT(*) FROM pg_policies WHERE schemaname='public') AS policies,
(SELECT COUNT(*) FROM pg_proc WHERE pronamespace='public'::regnamespace) AS functions;"
# Check for basic sanity
echo ""
echo "Quick sanity checks:"
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 <<'SQL'
-- Check tables exist
SELECT 'Tables exist' AS check, COUNT(*) > 0 AS pass
FROM pg_tables WHERE schemaname='public';
-- Check functions exist
SELECT 'Functions exist' AS check, COUNT(*) > 0 AS pass
FROM pg_proc WHERE pronamespace='public'::regnamespace;
-- Check for orphaned objects (optional)
-- SELECT 'No orphaned triggers' AS check, COUNT(*) = 0 AS pass
-- FROM pg_trigger WHERE tgrelid NOT IN (SELECT oid FROM pg_class);
SQL
# Release lock
psql "$SUPABASE_DB_URL" -v ON_ERROR_STOP=1 -c \
"SELECT pg_advisory_unlock(hashtext('dbsage:rollback'));"
echo "✓ Lock released"
# Create post-rollback snapshot
POST_SNAPSHOT="supabase/snapshots/${TS}_post_rollback.sql"
pg_dump "$SUPABASE_DB_URL" --schema-only --clean --if-exists > "$POST_SNAPSHOT"
echo "✓ Post-rollback snapshot: $POST_SNAPSHOT"
✅ DATABASE ROLLBACK COMPLETED
Rolled back to: {target}
Timestamp: {TS}
Snapshots created:
- Emergency (before): $EMERGENCY
- Post-rollback (after): $POST_SNAPSHOT
Next steps:
1. smoke-test - Validate schema
2. rls-audit - Check security
3. Test application functionality
4. Monitor for issues
If issues detected:
rollback $EMERGENCY # Restore to pre-rollback state
Use when*: Reverting schema changes
rollback supabase/snapshots/20251026_pre_migration.sql
Pros*:
Cons*:
Use when*: Surgical changes to specific objects
-- supabase/rollback/20251026_rollback_user_roles.sql
BEGIN;
-- Undo changes in reverse order
DROP TRIGGER IF EXISTS set_user_role_timestamp ON user_roles;
DROP FUNCTION IF EXISTS update_user_role_timestamp();
DROP TABLE IF EXISTS user_roles;
-- Restore previous state if needed
-- ...
COMMIT;
rollback supabase/rollback/20251026_rollback_user_roles.sql
Pros*:
Cons*:
Use when*: Rollback is dangerous, fix forward instead
-- Instead of rolling back, apply corrective migration
-- migration: 20251026_fix_user_roles_bug.sql
Pros*:
Cons*:
| Situation | Strategy | Command |
|---|---|---|
| Migration failed mid-way | Restore snapshot | rollback snapshot_before.sql |
| Schema breaks app | Restore snapshot | rollback snapshot_before.sql |
| Wrong migration applied | Restore snapshot | rollback snapshot_before.sql |
| Minor bug in function | Forward fix | Create fix migration |
| Data corruption risk | Forward fix | Don't rollback |
| Production with users | Forward fix | Avoid schema rollback |
Before executing rollback:
# Fast and loose - just do it
rollback snapshot.sql
# Test the rollback process
rollback snapshot.sql
smoke-test
# Test app functionality
# CAREFUL - follow full checklist
# 1. Notify stakeholders
# 2. Enable maintenance mode
# 3. Create emergency snapshot (automatic)
# 4. Coordinate with team
rollback snapshot.sql
# 5. Validation
smoke-test
rls-audit
# 6. Test critical flows
# 7. Disable maintenance mode
# 8. Monitor closely
Situation*: apply-migration failed halfway
Action*: PostgreSQL already rolled back transaction ✓
No rollback needed*: Database unchanged
Next steps*:
dry-run to testapply-migration againSituation*: Schema change incompatible with application
Action*: Rollback to pre-migration snapshot
rollback supabase/snapshots/20251026_143022_pre_migration.sql
smoke-test
# Deploy previous app version or fix app
Situation*: Applied v1.3.0 migration instead of v1.2.5
Action*: Rollback to last known good state
rollback supabase/snapshots/20251026_120000_v1_2_4.sql
smoke-test
# Apply correct migration
apply-migration v1_2_5.sql
Situation*: Schema change caused data integrity issues
Action*: DON'T rollback schema - fix data
-- Forward fix with data correction
BEGIN;
-- Fix data
UPDATE users SET status = 'active' WHERE status IS NULL;
-- Add constraint to prevent recurrence
ALTER TABLE users ADD CONSTRAINT status_not_null CHECK (status IS NOT NULL);
COMMIT;
Problem*: Objects from new schema still exist
Fix*: Snapshot should have DROP ... IF EXISTS statements
Check snapshot file:
grep -c "DROP.IF EXISTS" snapshot.sql
If missing, regenerate snapshot with --clean --if-exists flags.
Problem*: Application incompatible with rolled-back schema
Solutions*:
Problem*: Cannot create safety snapshot
Action*: ABORT ROLLBACK
❌ ROLLBACK ABORTED
Cannot proceed without emergency snapshot
Check database connectivity and disk space
Problem*: Some objects not cleaned up
Fix*: Manually identify and remove
-- Find orphaned triggers
SELECT tgname FROM pg_trigger
WHERE tgrelid NOT IN (SELECT oid FROM pg_class);
-- Find orphaned indexes
SELECT indexname FROM pg_indexes
WHERE tablename NOT IN (SELECT tablename FROM pg_tables);
Instead of rollback, consider:
Track these after rollback:
# Log rollback event
echo "$(date -Iseconds) | ROLLBACK | $TARGET | Duration: ${DURATION}s" \
>> supabase/rollback/rollback.log
snapshot {label} - Create rollback pointapply-migration {path} - Creates automatic snapshotssmoke-test - Validate after rollbackrls-audit - Check security after rollbackIf rollback fails critically:
$EMERGENCYNever panic*: Emergency snapshot has your back.