diff --git a/br/pkg/task/backup_raw.go b/br/pkg/task/backup_raw.go index d8a2740e877df..3f352b7e6320c 100644 --- a/br/pkg/task/backup_raw.go +++ b/br/pkg/task/backup_raw.go @@ -202,7 +202,7 @@ func RunBackupRaw(c context.Context, g glue.Glue, cmdName string, cfg *RawKvConf req := backuppb.BackupRequest{ ClusterId: client.GetClusterID(), StartKey: backupRange.StartKey, - EndKey: backupRange.StartKey, + EndKey: backupRange.EndKey, StartVersion: 0, EndVersion: 0, RateLimit: cfg.RateLimit, diff --git a/br/pkg/version/version.go b/br/pkg/version/version.go index 3c767bca4b97e..342d73d67e332 100644 --- a/br/pkg/version/version.go +++ b/br/pkg/version/version.go @@ -119,7 +119,7 @@ func CheckClusterVersion(ctx context.Context, client pd.Client, checker VerCheck // CheckVersionForBackup checks the version for backup and func CheckVersionForBackup(backupVersion *semver.Version) VerChecker { return func(store *metapb.Store, ver *semver.Version) error { - if backupVersion.Major > ver.Major { + if backupVersion.Major > ver.Major && backupVersion.Major-ver.Major > 1 { return errors.Annotatef(berrors.ErrVersionMismatch, "backup with cluster version %s cannot be restored at cluster of version %s: major version mismatches", backupVersion, ver) diff --git a/br/pkg/version/version_test.go b/br/pkg/version/version_test.go index fd5ea2bbbb303..84ffd74849aaa 100644 --- a/br/pkg/version/version_test.go +++ b/br/pkg/version/version_test.go @@ -148,11 +148,20 @@ func TestCheckClusterVersion(t *testing.T) { } { - // Restore across major version isn't allowed. + // Restore across one major version allowed. mock.getAllStores = func() []*metapb.Store { return []*metapb.Store{{Version: "v4.0.0-rc.1"}} } err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBackup(semver.New("5.0.0-rc"))) + require.NoError(t, err) + } + + { + // Restore across two major versions isn't allowed. + mock.getAllStores = func() []*metapb.Store { + return []*metapb.Store{{Version: "v4.0.0-rc.1"}} + } + err := CheckClusterVersion(context.Background(), &mock, CheckVersionForBackup(semver.New("6.0.0"))) require.Error(t, err) } diff --git a/ddl/ddl.go b/ddl/ddl.go index 89a5c40537102..5ee60425a52f4 100644 --- a/ddl/ddl.go +++ b/ddl/ddl.go @@ -650,7 +650,7 @@ func checkHistoryJobInTest(ctx sessionctx.Context, historyJob *model.Job) { if _, ok := st.(*ast.CreatePlacementPolicyStmt); !ok { panic(fmt.Sprintf("job ID %d, parse ddl job failed, query %s", historyJob.ID, historyJob.Query)) } - case model.ActionCreateTable, model.ActionCreateTables: + case model.ActionCreateTable: if _, ok := st.(*ast.CreateTableStmt); !ok { panic(fmt.Sprintf("job ID %d, parse ddl job failed, query %s", historyJob.ID, historyJob.Query)) } @@ -658,6 +658,13 @@ func checkHistoryJobInTest(ctx sessionctx.Context, historyJob *model.Job) { if _, ok := st.(*ast.CreateDatabaseStmt); !ok { panic(fmt.Sprintf("job ID %d, parse ddl job failed, query %s", historyJob.ID, historyJob.Query)) } + case model.ActionCreateTables: + _, isCreateTable := st.(*ast.CreateTableStmt) + _, isCreateSeq := st.(*ast.CreateSequenceStmt) + _, isCreateView := st.(*ast.CreateViewStmt) + if !isCreateTable && !isCreateSeq && !isCreateView { + panic(fmt.Sprintf("job ID %d, parse ddl job failed, query %s", historyJob.ID, historyJob.Query)) + } default: if _, ok := st.(ast.DDLNode); !ok { panic(fmt.Sprintf("job ID %d, parse ddl job failed, query %s", historyJob.ID, historyJob.Query))