{"record":{"id":"8639465c18026720","repo":"immich-app/immich","slug":"warning","errorCode":null,"errorMessage":"  - ${warning}","messagePattern":"  - \\$\\{warning\\}","errorType":"console","errorClass":null,"httpStatus":null,"severity":"info","filePath":"server/src/services/database.service.ts","lineNumber":139,"sourceCode":"        }\n      }\n      preparation.push(\n        this.databaseRepository.prewarm(VectorIndex.Clip),\n        this.databaseRepository.prewarm(VectorIndex.Face),\n      );\n      await Promise.all(preparation);\n    });\n  }\n\n  private async checkSchemaDrift() {\n    this.logger.log('Checking for schema drift');\n    const drift = await this.databaseRepository.getSchemaDrift();\n    if (drift.items.length === 0) {\n      this.logger.log('No schema drift detected');\n    } else {\n      this.logger.warn(`${ErrorMessages.SchemaDrift} or run \\`immich-admin schema-check\\``);\n      for (const warning of drift.asHuman()) {\n        this.logger.warn(`  - ${warning}`);\n      }\n    }\n  }\n\n  private async createExtension(extension: DatabaseExtension) {\n    try {\n      await this.databaseRepository.createExtension(extension);\n    } catch (error) {\n      const name = EXTENSION_NAMES[extension];\n      this.logger.fatal(messages.createFailed({ name, extension }));\n      throw error;\n    }\n  }\n\n  private async updateExtension(extension: VectorExtension, availableVersion: string) {\n    this.logger.log(`Updating ${EXTENSION_NAMES[extension]} extension to ${availableVersion}`);\n    try {\n      await this.databaseRepository.updateVectorExtension(extension, availableVersion);","sourceCodeStart":121,"sourceCodeEnd":157,"githubUrl":"https://github.com/immich-app/immich/blob/e55ac299a4ec7cb372e35dbf2c6c05ee9ce77f6c/server/src/services/database.service.ts#L121-L157","documentation":"Companion to the schema-drift warning: after the summary line, each individual drift item is logged as `  - ${warning}` from drift.asHuman(). Each entry pinpoints one table/constraint/column that diverges from the expected migration state.","triggerScenarios":"Same bootstrap path (checkSchemaDrift) when drift exists; this line is emitted once per drift item in drift.asHuman().","commonSituations":"Reading the specific culprit: manually dropped/renamed columns, extra indexes or constraints, tables from removed features, schema restored from another version's dump.","solutions":["Read each listed item to identify the exact diverging table/constraint.","Revert the specific manual change indicated, or restore a pre-change database backup.","Run `immich-admin schema-check` for machine-readable detail on each item.","After fixes, restart the server and confirm 'No schema drift detected' is logged."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"# resolve each drift item to SQL\nimmich-admin schema-check | while read -r item; do echo \"revert: $item\"; done","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Read each listed drift item before touching anything — it names the exact object.","Keep a pristine reference schema (fresh install of same version) for comparison.","After reverting changes, restart and confirm 'No schema drift detected'.","Document any emergency schema interventions so they are reverted deliberately."],"tags":["database","schema","diagnostics"],"backgroundTag":"schema-validation-failed","analyzedSha":"e55ac299a4ec7cb372e35dbf2c6c05ee9ce77f6c","analyzedAt":"2026-09-15T07:20:19.675Z","contentChangedAt":"2026-09-15T07:20:19.675Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}