{"record":{"id":"066035944a16f0be","repo":"immich-app/immich","slug":"the-database-currently-has-name-installedvers","errorCode":null,"errorMessage":"The database currently has ${name} ${installedVersion} activated, but the Postgres instance only has ${availableVersion} available.\n    This most likely means the extension was downgraded.\n    If ${name} ${installedVersion} is compatible with Immich, please ensure the Postgres instance has this available.","messagePattern":"The database currently has (.+?) (.+?) activated, but the Postgres instance only has (.+?) available\\.\n    This most likely means the extension was downgraded\\.\n    If (.+?) (.+?) is compatible with Immich, please ensure the Postgres instance has this available\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"critical","filePath":"server/src/services/database.service.ts","lineNumber":95,"sourceCode":"\n      if ([availableVersion, installedVersion].some((version) => version && semver.eq(version, '0.0.0'))) {\n        throw new Error(messages.nightlyVersion({ name, extension, version: '0.0.0' }));\n      }\n\n      if (!semver.satisfies(availableVersion, extensionRange)) {\n        throw new Error(messages.outOfRange({ name, extension, version: availableVersion, range: extensionRange }));\n      }\n\n      if (!installedVersion) {\n        await this.createExtension(extension);\n      }\n\n      if (installedVersion && semver.gt(availableVersion, installedVersion)) {\n        await this.updateExtension(extension, availableVersion);\n      } else if (installedVersion && !semver.satisfies(installedVersion, extensionRange)) {\n        throw new Error(messages.outOfRange({ name, extension, version: installedVersion, range: extensionRange }));\n      } else if (installedVersion && semver.lt(availableVersion, installedVersion)) {\n        throw new Error(messages.invalidDowngrade({ name, extension, availableVersion, installedVersion }));\n      }\n\n      try {\n        await this.databaseRepository.reindexVectorsIfNeeded([VectorIndex.Clip, VectorIndex.Face]);\n      } catch (error) {\n        this.logger.warn(\n          'Could not run vector reindexing checks. If the extension was updated, please restart the Postgres instance. If you are upgrading directly from a version below 1.107.2, please upgrade to 1.107.2 first.',\n        );\n        throw error;\n      }\n\n      for (const { name: dbName, installedVersion } of extensionVersions) {\n        const isDepended = dbName === DatabaseExtension.Vector && extension === DatabaseExtension.VectorChord;\n        if (dbName !== extension && installedVersion && !isDepended) {\n          await this.dropExtension(dbName);\n        }\n      }\n","sourceCodeStart":77,"sourceCodeEnd":113,"githubUrl":"https://github.com/immich-app/immich/blob/199723261c6ffa897fec8ccdaea6359e39c37cc3/server/src/services/database.service.ts#L77-L113","documentation":"The extension version currently activated in pg_extension (installedVersion) is newer than the highest version Postgres can offer (availableVersion). This means the Postgres instance's extension package was downgraded while the database still references the newer version - a state Immich cannot safely operate in. The guard at line 95 catches semver.lt(availableVersion, installedVersion).","triggerScenarios":"On bootstrap, installedVersion exists and semver.lt(availableVersion, installedVersion). Example: DB was running pgvecto.rs 0.3.0, the container was switched to an image packaging only 0.2.x; pg_extension still references 0.3.0 but pg_available_extensions reports 0.2.x.","commonSituations":"Downgrading the vector extension Docker image; restoring a DB backup made against a newer extension into an instance with an older one; switching between pgvector and pgvecto.rs/chord without dropping the old extension first.","solutions":["Restore the Postgres image/package to a version that offers installedVersion or newer (undo the downgrade).","If you intentionally must downgrade, first DROP the extension in the new (older) image then let Immich recreate it - but note vector indexes will need rebuilding.","Run 'SELECT extname, extversion FROM pg_extension;' and 'SELECT name, default_version FROM pg_available_extensions;' and reconcile the two.","Restart Immich once availableVersion >= installedVersion."],"exampleFix":"# before: image downgraded, installed > available\nimage: tensorchord/pgvecto-rs:pg16-v0.2.0\n# after: image restored to the version the DB already has (or newer)\nimage: tensorchord/pgvecto-rs:pg16-v0.3.0","handlingStrategy":"validation","validationCode":"import pg from 'pg';\nimport semver from 'semver';\nconst client = new pg.Client({ connectionString: process.env.DB_URL });\nawait client.connect();\nconst avail = await client.query(\n  \"SELECT name, default_version FROM pg_available_extensions WHERE name IN ('vector','vectors');\"\n);\nconst inst = await client.query(\n  \"SELECT extname, extversion FROM pg_extension WHERE extname IN ('vector','vectors');\"\n);\nfor (const i of inst.rows) {\n  const a = avail.rows.find((r) => r.name === i.extname);\n  if (a && semver.lt(semver.coerce(a.default_version)!, semver.coerce(i.extversion)!)) {\n    throw new Error(`${i.extname} was downgraded: installed ${i.extversion} > available ${a.default_version}`);\n  }\n}","typeGuard":"import semver from 'semver';\nconst noDowngrade = (installed: string, available: string) =>\n  !semver.lt(semver.coerce(available)!, semver.coerce(installed)!);","tryCatchPattern":"try {\n  await app.start();\n} catch (e) {\n  if (/extension was downgraded/.test(String(e?.message))) {\n    logger.fatal('Vector extension downgraded - restore the prior image version');\n    process.exit(1);\n  }\n  throw e;\n}","preventionTips":["Never downgrade the vector extension image below the DB's installed version.","When switching extension type (vector <-> vectors), DROP first.","Keep image tags in version control to detect accidental downgrades."],"tags":["postgres","database","extension","version","pgvector","downgrade","bootstrap","immich","config"],"backgroundTag":null,"analyzedSha":"199723261c6ffa897fec8ccdaea6359e39c37cc3","analyzedAt":"2026-08-12T04:54:27.085Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}