vitessio/vitess · error

database not found

Error message

database not found

What it means

vtcombo's DeleteKs returns "database not found" when the requested keyspace is not present in vtcombo's in-memory tablet/keyspace map after scanning for a match. vtcombo (used in local test clusters like vitessloader) holds a limited set of keyspaces, so deleting an unknown one yields this plain error. It is a lookup failure before any MySQL work is done.

Source

Thrown at go/vt/vtcombo/tablet_map.go:279

			}
			err = ts.DeleteTablet(ctx, tablet.alias)
			if err != nil {
				return err
			}
		}
	}

	var ks *vttestpb.Keyspace
	index := 0
	for _, keyspace := range tpb.Keyspaces {
		if keyspace.Name == ksName {
			ks = keyspace
			break
		}
		index++
	}
	if ks == nil {
		return errors.New("database not found")
	}

	conn, err := mysqld.GetDbaConnection(ctx)
	if err != nil {
		return err
	}
	defer conn.Close()
	for _, shard := range ks.Shards {
		q := fmt.Sprintf("DROP DATABASE IF EXISTS `vt_%s_%s`", ksName, shard.GetName())
		if _, err = conn.ExecuteFetch(q, 1, false); err != nil {
			return err
		}
		if err := ts.DeleteShard(ctx, ksName, shard.GetName()); err != nil {
			return err
		}
	}

	if err = ts.DeleteKeyspace(ctx, ksName); err != nil {

View on GitHub (pinned to 01a25a7d17)

Solutions

  1. Verify the keyspace exists (list keyspaces) before calling DeleteKs
  2. Fix the keyspace name in the caller
  3. Treat the error as idempotent cleanup success if double-delete is expected

Example fix

// before
err := tm.DeleteKs(ctx, "commerce", false)
// after
if _, err := ts.GetServingNamespaces(ctx); err == nil { /* optionally check ks exists */ }
if ksExists(topo, "commerce") { err = tm.DeleteKs(ctx, "commerce", false) }
Defensive patterns

Strategy: validation

Validate before calling

exists, err := ksExistsInVtcombo(topo, "commerce")
if err != nil { return err }
if !exists { /* skip DeleteKs or fail fast */ }

Type guard

func isDatabaseNotFound(err error) bool { return err != nil && err.Error() == "database not found" }

Try / catch

err := tm.DeleteKs(ctx, ks, false)
if err != nil && strings.Contains(err.Error(), "database not found") {
    // treat as already-deleted (idempotent cleanup)
    return nil
}

Prevention

When it happens

Trigger: Calling DeleteKs with a keyspace name that was never created in the vtcombo process; deleting a keyspace twice; a race where another actor already removed the keyspace from the map.

Common situations: Test teardown scripts deleting keyspaces that failed to be created; typos in keyspace names in local dev setups; concurrent test cleanup.

Related errors


AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01). Data as JSON: /api/errors/1dae09324d6117ac. Report an issue: GitHub.