vitessio/vitess · error

GetSchema(%v, nil, %v, %v) failed: %v

Error message

GetSchema(%v, nil, %v, %v) failed: %v

What it means

During ValidateSchema, schema is fetched from each replica tablet via schematools.GetSchema and compared to the reference (primary) schema. If GetSchema fails for a tablet, the error is recorded as "GetSchema(%v, nil, %v, %v) failed: %v" in the per-alias error recorder, so schema validation cannot complete for that tablet.

Source

Thrown at go/vt/vtctl/grpcvtctldserver/server.go:5087

				errMessage := fmt.Sprintf("FindAllTabletAliasesInShard(%v, %v) failed: %v", keyspace, shard, err)
				resp.ResultsByShard[shard].Results = append(resp.ResultsByShard[shard].Results, errMessage)
				resp.Results = append(resp.Results, errMessage)
				return
			}

			aliasWg := sync.WaitGroup{}
			aliasErrs := concurrency.AllErrorRecorder{}

			for _, alias := range aliases {
				if referenceAlias == alias {
					continue
				}
				aliasWg.Add(1)
				go func(alias *topodatapb.TabletAlias) {
					defer aliasWg.Done()
					replicaSchema, err := schematools.GetSchema(ctx, s.ts, s.tmc, alias, r)
					if err != nil {
						aliasErrs.RecordError(fmt.Errorf("GetSchema(%v, nil, %v, %v) failed: %v", alias, req.ExcludeTables, req.IncludeViews, err))
						return
					}

					tmutils.DiffSchema(topoproto.TabletAliasString(referenceAlias), referenceSchema, topoproto.TabletAliasString(alias), replicaSchema, &aliasErrs)
				}(alias)
			}
			aliasWg.Wait()

			if aliasErrs.HasErrors() {
				for _, err := range aliasErrs.Errors {
					errMessage := err.Error()
					resp.ResultsByShard[shard].Results = append(resp.ResultsByShard[shard].Results, errMessage)
					resp.Results = append(resp.Results, errMessage)
				}
			}
		}(shard)
	}

View on GitHub (pinned to 01a25a7d17)

Solutions

  1. Verify the failing tablet alias is up and healthy (vtctldclient GetTablet <alias>).
  2. Fix tablet connectivity / restart vttablet, then re-run ValidateSchema.
  3. If the tablet is decommissioned, remove its alias from the topology first.
Defensive patterns

Strategy: try-catch

Validate before calling

tab, err := ts.GetTablet(ctx, alias); if err != nil || tab.Type == topodatapb.TabletType_UNKNOWN { /* skip or repair tablet before schema validation */ }

Try / catch

err := client.ValidateSchema(ctx, req); if err != nil { for _, e := range aliasErrs.Errors() { if strings.Contains(e.Error(), "GetSchema(") { alias := extractAlias(e); log.Warn("schema fetch failed", slog.String("alias", alias), slog.Any("error", e)) } } }

Prevention

When it happens

Trigger: ValidateSchema call where GetSchema on a tablet fails: tablet is down, tabletmanager RPC times out, or topodata for the alias is missing.

Common situations: Replica restarted mid-validation; network partition between vtctld and tablet; tablet's mysqld not running so schema cannot be read.

Related errors


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