4.5 KiB
4.5 KiB
Fix Blockscout Schema/Connection Mismatch
Problem
The migrations_status table exists when checked from postgres, but Blockscout can't see it and crashes with:
ERROR 42P01 (undefined_table) relation "migrations_status" does not exist
Root Cause
This typically indicates:
- Schema mismatch: Table exists in a different schema than Blockscout is searching
- Database mismatch: Blockscout connecting to different database
- Search path issue: PostgreSQL
search_pathdoesn't include the schema - Connection string issue: DATABASE_URL points to wrong database/schema
Diagnosis Commands
Run these to identify the issue:
# From VMID 5000
# 1. Check what schema the table is in
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "
SELECT table_schema, table_name
FROM information_schema.tables
WHERE table_name = 'migrations_status';
"
# 2. Check current search_path
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "SHOW search_path;"
# 3. Check Blockscout DATABASE_URL
BLOCKSCOUT_CONTAINER=$(docker ps -a | grep blockscout | grep -v postgres | awk '{print $1}' | head -1)
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' $BLOCKSCOUT_CONTAINER | grep DATABASE_URL
# 4. Test table access with explicit schema
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "
SELECT COUNT(*) FROM public.migrations_status;
"
Solutions
Solution 1: Fix Search Path
If table is in public schema but search_path doesn't include it:
docker exec blockscout-postgres psql -U blockscout -d blockscout << 'SQL'
ALTER DATABASE blockscout SET search_path = public, "$user";
\c blockscout
SELECT set_config('search_path', 'public', false);
SQL
Solution 2: Verify DATABASE_URL
Check Blockscout's DATABASE_URL matches the actual database:
# Check what Blockscout is using
BLOCKSCOUT_CONTAINER=$(docker ps -a | grep blockscout | grep -v postgres | awk '{print $1}' | head -1)
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' $BLOCKSCOUT_CONTAINER | grep DATABASE_URL
# Should be: postgresql://blockscout:blockscout@postgres:5432/blockscout
# If different, update docker-compose.yml
Solution 3: Recreate migrations_status in Correct Schema
If table is in wrong schema, recreate it:
# Drop and recreate in public schema
docker exec blockscout-postgres psql -U blockscout -d blockscout << 'SQL'
-- Drop if exists in wrong schema
DROP TABLE IF EXISTS migrations_status CASCADE;
-- Recreate in public schema (migrations will do this)
-- Or run migrations again
SQL
# Then run migrations
BLOCKSCOUT_CONTAINER=$(docker ps -a | grep blockscout | grep -v postgres | awk '{print $1}' | head -1)
docker start $BLOCKSCOUT_CONTAINER
sleep 10
docker exec -it $BLOCKSCOUT_CONTAINER bin/blockscout eval "Explorer.Release.migrate()"
Solution 4: Check for Multiple Databases
Verify Blockscout is connecting to the correct database:
# List all databases
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "\l"
# Check which database has the table
docker exec blockscout-postgres psql -U blockscout -d postgres -c "
SELECT datname FROM pg_database;
"
# For each database, check if migrations_status exists
for db in blockscout postgres; do
echo "Checking database: $db"
docker exec blockscout-postgres psql -U blockscout -d $db -c "
SELECT CASE WHEN EXISTS (
SELECT 1 FROM information_schema.tables
WHERE table_name = 'migrations_status'
) THEN '✅ EXISTS' ELSE '❌ MISSING' END;
"
done
Most Likely Fix
The table exists but Blockscout can't see it due to schema search path. Try:
# From VMID 5000
# 1. Ensure search_path includes public
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "
ALTER DATABASE blockscout SET search_path = public;
"
# 2. Verify table is accessible
docker exec blockscout-postgres psql -U blockscout -d blockscout -c "
SET search_path = public;
SELECT COUNT(*) FROM migrations_status;
"
# 3. Restart Blockscout
BLOCKSCOUT_CONTAINER=$(docker ps -a | grep blockscout | grep -v postgres | awk '{print $1}' | head -1)
docker restart $BLOCKSCOUT_CONTAINER
Automated Diagnosis
Run the diagnosis script:
# From Proxmox host
cd /home/intlc/projects/proxmox/explorer-monorepo
./scripts/diagnose-blockscout-schema-issue.sh
This will identify:
- What schema the table is in
- What search_path is configured
- What DATABASE_URL Blockscout is using
- Whether Blockscout can actually see the table