vitessio/vitess · error · ErrMySQLShellPreCheck

%w: MySQL version doesn't support disabling the redo log (mu

Error message

%w: MySQL version doesn't support disabling the redo log (must be >=8.0.21, current version: %s)

What it means

The redo-log disable feature (used to speed up mysql-shell restore) requires MySQL 8.0.21 or newer. restorePreCheck rejects the restore when the parsed server version is older, telling the operator the minimum required version.

Source

Thrown at go/vt/mysqlctl/mysqlshellbackupengine.go:546

		if err != nil {
			return false, fmt.Errorf("%w: failed to fetch MySQL version: %v", ErrMySQLShellPreCheck, err)
		}

		_, sv, err := ParseVersionString(version)
		if err != nil {
			return false, fmt.Errorf("%w: failed to parse MySQL version (version: %s): %v", ErrMySQLShellPreCheck, version, err)
		}

		versionStr := fmt.Sprintf("%d.%d.%d", sv.Major, sv.Minor, sv.Patch)

		capableOf := mysql.ServerVersionCapableOf(versionStr)
		capable, err := capableOf(capabilities.DisableRedoLogFlavorCapability)
		if err != nil {
			return false, fmt.Errorf("%w: error checking if server supports disabling redo log: %v", ErrMySQLShellPreCheck, err)
		}

		if !capable {
			return false, fmt.Errorf("%w: MySQL version doesn't support disabling the redo log (must be >=8.0.21, current version: %s)", ErrMySQLShellPreCheck, versionStr)
		}
	}

	return shouldDeleteUsers, nil
}

func (be *MySQLShellBackupEngine) handleSuperReadOnly(ctx context.Context, params RestoreParams) (func(), error) {
	readonly, err := params.Mysqld.IsSuperReadOnly(ctx)
	if err != nil {
		return nil, vterrors.Wrap(err, fmt.Sprintf("checking if mysqld has super_read_only=enable: %v", err))
	}

	params.Logger.Infof("Is Super Read Only: %v", readonly)

	if readonly {
		resetFunc, err := params.Mysqld.SetSuperReadOnly(ctx, false)
		if err != nil {
			return nil, vterrors.Wrap(err, fmt.Sprintf("unable to disable super-read-only: %v", err))

View on GitHub (pinned to 01a25a7d17)

Solutions

  1. Upgrade the target MySQL server to >= 8.0.21
  2. Set mysqlShellSpeedUpRestore=false in the backupengine config so the redo-log disable step is skipped
  3. Re-run the restore after the version/config change

Example fix

// before (backupengine config)
"mysqlShellSpeedUpRestore": true  // on MySQL 8.0.19
// after
"mysqlShellSpeedUpRestore": false
Defensive patterns

Strategy: validation

Validate before calling

version, _ := mysqld.GetVersionString(ctx)
_, sv, err := mysqlctl.ParseVersionString(version)
if err == nil && (sv.Major < 8 || (sv.Major == 8 && (sv.Minor < 0 || sv.Patch < 21))) {
    log.Warn("MySQL too old for redo-log speed-up; need >= 8.0.21", slog.String("version", version))
}

Try / catch

if _, err := engine.ExecuteRestore(ctx, params, backupDir); err != nil {
    if strings.Contains(err.Error(), "must be >=8.0.21") {
        // upgrade MySQL or set mysqlShellSpeedUpRestore=false and retry
    }
}

Prevention

When it happens

Trigger: ExecuteRestore -> restorePreCheck with mysqlShellSpeedUpRestore=true when capableOf(DisableRedoLogFlavorCapability) returns capable=false for the running server's version.

Common situations: Restoring onto an older MySQL 8.0.x (pre 8.0.21) or 5.7 instance while the speed-up flag is enabled; forgetting to lower mysqlShellSpeedUpRestore after a downgrade of the target MySQL.

Related errors


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