Database Issues
Diagnosis and resolution guide for PostgreSQL and Supabase database problems.
Connection failures
Symptoms
ECONNREFUSEDwhen connecting to database- Web app shows "Unable to connect to backend"
pnpm supabase statusshows services as stopped
Root cause
Supabase containers are not running or Docker is stopped.
Diagnosis
bash
# Check Supabase status
pnpm supabase status
# Check Docker containers
docker ps | grep supabaseFixes
Start Supabase:
bashpnpm supabase startRestart if stuck:
bashpnpm supabase stop pnpm supabase startNuclear recovery:
bashpnpm supabase stop docker system prune -f pnpm supabase start pnpm supabase:db:reset
Prevention
- Keep Docker Desktop running during development
- Allocate at least 4 GB RAM to Docker
Migration failures
Symptoms
pnpm supabase:db:resetfails with SQL errorsalready existserrors during migration applicationrelation does not existerrors
Root cause
Migrations contain non-idempotent statements or depend on objects not yet created.
Diagnosis
bash
# Check which migrations are applied
pnpm supabase migration list --local
# View specific migration
cat supabase/migrations/<timestamp>_<name>.sqlFixes
| Error | Fix |
|---|---|
relation already exists | Add IF NOT EXISTS to CREATE TABLE |
column already exists | Wrap in DO $$ BEGIN ... EXCEPTION ... END $$ |
function already exists | Use CREATE OR REPLACE FUNCTION |
permission denied | Check the migration runs as the correct role |
deadlock detected | Retry; simplify concurrent operations |
Full recovery:
bash
pnpm supabase:local:recoverPrevention
- Always use idempotent SQL (
IF NOT EXISTS,CREATE OR REPLACE) - Test migrations locally before committing
- One concern per migration file
Slow queries
Symptoms
- API calls take >2 seconds
- Web app feels sluggish
- Database CPU spikes
Diagnosis
sql
-- Find slow queries
SELECT query, mean_exec_time, calls
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;
-- Check missing indexes
EXPLAIN ANALYZE SELECT * FROM lenses WHERE owner_id = '<uuid>';Fixes
Add indexes:
sqlCREATE INDEX idx_lenses_owner_id ON public.lenses(owner_id);Optimize queries — use
.select('id, name')instead of.select('*')Check RLS policy performance — complex
USINGclauses in RLS can cause sequential scans
Prevention
- Index all foreign key columns
- Monitor
pg_stat_statementsregularly - Profile queries during development with
EXPLAIN ANALYZE
Type generation failures
Symptoms
pnpm supabase gen types typescriptproduces errors- Generated types are empty or incomplete
- TypeScript errors after schema changes
Fixes
- Ensure Supabase is running:
pnpm supabase status - Reset and retry:bash
pnpm supabase:db:reset pnpm supabase gen types typescript --local > libs/types/src/lib/database.types.ts - Check for syntax errors in recent migrations
Data integrity issues
Symptoms
- Orphaned records after deletions
- Foreign key constraint violations
- Duplicate entries
Fixes
Check foreign keys:
sqlSELECT * FROM lenses WHERE owner_id NOT IN (SELECT id FROM lensers);Fix orphans:
sqlDELETE FROM lenses WHERE owner_id NOT IN (SELECT id FROM lensers);Add cascading deletes to foreign keys:
sqlALTER TABLE lenses DROP CONSTRAINT lenses_owner_id_fkey; ALTER TABLE lenses ADD CONSTRAINT lenses_owner_id_fkey FOREIGN KEY (owner_id) REFERENCES lensers(id) ON DELETE CASCADE;
Prevention
- Use
ON DELETE CASCADEfor parent-child relationships - Add check constraints for business rules
- Test deletion scenarios