Skip to content

Troubleshooting ​

doctor --deep is the first command. The table below maps a symptom to the usual cause. Start with:

bash
sudo postvec doctor --database app --deep

On a container host the same check is postvec-healthcheck, or doctor with --database-url 'postgresql:///app?host=/var/run/postgresql'.

Symptom table ​

SymptomMeaning or next action
CREATE EXTENSION cannot find pgvectorInstall pgvector >= 0.8 for the same major
CREATE EXTENSION is deniedSuperuser; postvec is untrusted
No advancing worker_last_beatPreload, postvec.database, restart finished, worker slots, server log
Jobs pile up with endpoint errorsRestore postvec-server; an empty endpoint list leaves jobs pending
postvec model asks for a cluster on a server node or workstationPass --path DIR or set POSTVEC_PATH; the server reads the same variable
Embedded engine will not startEngine path, unversioned libonnxruntime.so, readable descriptors, loopback ports
Search returns FTS onlyQuery embedding failed while degradation was enabled; restore inference or disable degradation
Search is slowNo usable ANN index for the entry's distance. Keyword traffic also wants a GIN (create_fts_index => true). BM25
BM25 ranks look off after a bulk loadSELECT postvec.refresh_lexical_stats(...). Check status().lexical_error
status().index_error setResolve the recorded automatic-index failure, then run create_vector_index()
Entry becomes disabledTable / source / vector / template column vanished; worker quarantined it
Migration is awaiting_indexRun suggested_index_sql, finalize again
Rows in jobs_deadFix last_error, then retry_dead()
Worker log wants ALTER EXTENSIONLibrary / SQL skew. Finish upgrade
setup refuses 99-postvec.confForeign or modified; --yes still refuses
Container doctor finds no clusterExpected. Healthcheck or a socket URL.
Worker FATALs for a missing databaseName still in the running launcher list. The slot respawns on a 15 s to 5 min quarantine and recovers by itself if the database appears; otherwise uninstall or edit postvec.database and restart
DROP DATABASE is blockedWorker holds a connection. uninstall then dropdb --force
sudo model pull is anonymousCredentials are per user. sudo postvec login
model pull says package/manual ownedPull through the package manager or as the original owner.
Remote model pull returns an errorModels are administered on postvec-server, CLI or dashboard
Remote MODEL_NOT_LOADED, intermittentlyFleet inventory drift. postvec-server status --fleet names the model and the nodes missing it
provider ls says NOT servedThe host has not reloaded the connector file. Rerun a provider command or restart. doctor names which
provider ls says the host REFUSES a fileThe file will not load however often you reload. Fix what the line names. ls and doctor apply the loader's own rules
A connector file is refusedIts mode, or a referenced key file's mode, grants group or other bits. chmod 600, then rotate the key
provider add demands --acknowledge-in-useExisting columns start sending source text to the provider, or --path has no cluster to scan. Pass that flag with --yes
Provider jobs retry with a 401Bad or revoked key. Fix it, then retry_dead() for rows that already gave up
UniVec provider jobs retry with a 402No available credit, or the key's spending limit is exhausted. Fix the account limit, then retry_dead() for dead rows
Search on a retired space has no semantic ranksLoad the embed model, local converter and embed-bridge executor on one engine. Hosted converters serve migrate() / convert() only. Search a retired space
Inference on a separate host, GPU or a fleetInstall postvec-server, then connect PostgreSQL. Both containers: quick start remote
Replacing a pgai / pg_vectorize pipelineComing from pgai
Managed install on RDS / Aurora / Cloud SQLManaged PostgreSQL. Use a direct endpoint and a worker role that can own the schema.
Uninstall exits 3SQL changed; config left alone. Follow the printed file/line
Exit 4Restart the selected cluster, then doctor --deep

Vectors stay NULL ​

  1. SELECT * FROM postvec.status(); - pending vs dead vs last_error.
  2. SELECT * FROM postvec.jobs_dead;
  3. SHOW shared_preload_libraries; SHOW postvec.database; SHOW postvec.mode; SHOW postvec.path;
  4. sudo postvec doctor --database app --deep

If pending stays non-zero and doctor fails endpoint checks, inference is unavailable. Jobs remain pending without consuming retry attempts.

Version skew ​

Replacing postvec.so parks the worker until ALTER EXTENSION postvec UPDATE. During that window the worker writes no heartbeat. Application backends still load the new library, so keep application traffic paused until every database is updated.

JSON diagnostics ​

postvec doctor --format json --deep produces a persistent diagnostic artifact. Each check includes an identifier, status and remediation.