{"record":{"id":"d4a465a50a710dd9","repo":"jdx/mise","slug":"postgres-data-version-does-not-match-its-initialization","errorCode":null,"errorMessage":"Postgres data version does not match its initialization marker","messagePattern":"Postgres data version does not match its initialization marker","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/daemons/presets.rs","lineNumber":211,"sourceCode":"    let marker = format!(\"{preset_name}:{major}\\n\");\n    if data.exists() {\n        let existing = std::fs::read_to_string(data.join(\".mise-daemon-version\"))\n            .wrap_err(\"daemon data was not initialized completely; inspect it and migrate or reset it explicitly\")?;\n        if existing != marker {\n            bail!(\n                \"incompatible {preset_name} data in {} (stored {}, current {}); migrate or reset it explicitly\",\n                data.display(),\n                existing.trim(),\n                marker.trim()\n            );\n        }\n        if preset_name == \"postgres\"\n            && std::fs::read_to_string(data.join(\"PG_VERSION\"))\n                .wrap_err(\"daemon data was not initialized completely; missing PG_VERSION\")?\n                .trim()\n                != major\n        {\n            bail!(\"Postgres data version does not match its initialization marker\");\n        }\n        return Ok(());\n    }\n    let staging = tempfile::Builder::new()\n        .prefix(\".mise-init-\")\n        .tempdir_in(parent)?;\n    let staged_data: PathBuf = staging.path().join(\"data\");\n    if preset_name == \"postgres\" {\n        let status = Command::new(\"initdb\")\n            .args([\"-D\"])\n            .arg(&staged_data)\n            .args([\"-U\", \"postgres\", \"--auth=trust\"])\n            .status()?;\n        if !status.success() {\n            bail!(\"Postgres initialization failed; existing data was preserved\");\n        }\n        if database != \"postgres\" {\n            if database.is_empty()","sourceCodeStart":193,"sourceCodeEnd":229,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/daemons/presets.rs#L193-L229","documentation":"As an integrity check for postgres, after the version marker matches, initialize also reads the data directory's PG_VERSION file and requires it to equal the detected major. If it differs, the on-disk data does not correspond to its own initialization marker and mise bails out.","triggerScenarios":"An existing data dir whose PG_VERSION (written by initdb) disagrees with the .mise-daemon-version marker's major — e.g. the data dir was hand-edited, partially restored, or markers were copied between data dirs.","commonSituations":"Copying .mise-daemon-version from another data directory; interrupted or manual migration; tampered or corrupted data directory.","solutions":["Re-initialize the data directory fresh (after backing up/dumping any needed data)","Fix the .mise-daemon-version marker to match PG_VERSION only if you know the data is genuinely that major","Run pg_upgrade to actually migrate data to the target major, then re-init markers"],"exampleFix":"// shell before: marker says 16, PG_VERSION says 15\n// after: make them consistent\npg_dump ... && rm -rf data && mise daemon init postgres","handlingStrategy":"validation","validationCode":"cat data/PG_VERSION; cat data/.mise-daemon-version # majors must agree","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Treat the data directory as opaque; never copy marker files between dirs","Use pg_upgrade for real major migrations","Re-init from scratch when markers disagree"],"tags":["daemon","postgres","integrity","version-mismatch"],"backgroundTag":"checksum-mismatch","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}