{"record":{"id":"7e7b68b391a6f64d","repo":"bytebase/bytebase","slug":"schema-is-nil-for-s","errorCode":null,"errorMessage":"schema is nil for %s","messagePattern":"schema is nil for (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"backend/plugin/parser/mysql/restore.go","lineNumber":245,"sourceCode":"\tfor _, column := range updateColumns {\n\t\tcolumnMap[strings.ToLower(column)] = true\n\t}\n\n\tif rCtx.GetDatabaseMetadataFunc == nil {\n\t\treturn false, errors.Errorf(\"GetDatabaseMetadataFunc is nil\")\n\t}\n\n\t_, metadata, err := rCtx.GetDatabaseMetadataFunc(ctx, rCtx.InstanceID, originalDatabase)\n\tif err != nil {\n\t\treturn false, errors.Wrapf(err, \"failed to get database metadata for %s\", originalDatabase)\n\t}\n\tif metadata == nil {\n\t\treturn false, errors.Errorf(\"database metadata is nil for %s\", originalDatabase)\n\t}\n\n\tschema := metadata.GetSchemaMetadata(\"\")\n\tif schema == nil {\n\t\treturn false, errors.Errorf(\"schema is nil for %s\", originalDatabase)\n\t}\n\n\ttableMetadata := schema.GetTable(originalTable)\n\tif tableMetadata == nil {\n\t\treturn false, errors.Errorf(\"table metadata is nil for %s.%s\", originalDatabase, originalTable)\n\t}\n\n\tfor _, index := range tableMetadata.GetProto().Indexes {\n\t\tif !index.Primary && !index.Unique {\n\t\t\tcontinue\n\t\t}\n\t\tif disjoint(index.Expressions, columnMap) {\n\t\t\treturn true, nil\n\t\t}\n\t}\n\n\treturn false, nil\n}","sourceCodeStart":227,"sourceCodeEnd":263,"githubUrl":"https://github.com/bytebase/bytebase/blob/1870550677fe08f0d2a78c07acd27541464eb945/backend/plugin/parser/mysql/restore.go#L227-L263","documentation":"The database metadata loaded fine, but metadata.GetSchemaMetadata(\"\") returned nil — the default schema for the database is missing. Without the schema, the table (and its unique keys) cannot be located, so the disjoint-unique-key check aborts.","triggerScenarios":"GenerateRestoreSQL -> doGenerate -> generateUpdateRestore -> hasDisjointUniqueKey where the metadata provider returns a DatabaseMetadata without a default (empty-name) schema — e.g. metadata synced when the database was empty or a provider that namespaces schemas differently.","commonSituations":"Metadata snapshot taken before any tables existed and never refreshed; MySQL metadata providers mapping no default schema; stale cache after the database was recreated.","solutions":["Refresh/re-sync the database metadata so the default schema and its tables are present","Verify the provider populates schema metadata under the empty schema name used by GetSchemaMetadata(\"\")","Recreate the backup against a database whose metadata is current"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"md, err := loadMetadata(ctx, instanceID, db)\nif err == nil && (md == nil || md.GetSchemaMetadata(\"\") == nil) {\n    return errors.New(\"default schema missing; refresh database metadata\")\n}","typeGuard":"func schemaAvailable(md *storepb.DatabaseMetadata) bool {\n    return md != nil && md.GetSchemaMetadata(\"\") != nil\n}","tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"schema is nil\") {\n    // trigger a metadata sync, then retry the restore once\n}","preventionTips":["Refresh metadata after any schema change or database recreation","Ensure the provider stores tables under the default (empty-name) schema","Avoid restoring against snapshots taken when the database was empty"],"tags":["mysql","metadata","schema"],"backgroundTag":"entity-not-found","analyzedSha":"1870550677fe08f0d2a78c07acd27541464eb945","analyzedAt":"2026-09-06T21:16:13.665Z","contentChangedAt":"2026-09-06T21:16:13.665Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}