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
- Upgrade the target MySQL server to >= 8.0.21
- Set mysqlShellSpeedUpRestore=false in the backupengine config so the redo-log disable step is skipped
- 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
- Pin target MySQL >= 8.0.21 wherever mysqlShellSpeedUpRestore is enabled
- Re-evaluate the speed-up flag after any MySQL downgrade
- Check the version as part of pre-restore health checks
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
- %w: failed to fetch MySQL version: %v
- %w: "progressFile" needs to be empty as vitess always starts
- %w: "skipBinlog" needs to set to true
- %w: failed to parse MySQL version (version: %s): %v
- %w: error checking if server supports disabling redo log: %v
AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01).
Data as JSON: /api/errors/3a6cc1a912e0f9e1.
Report an issue: GitHub.