diff --git a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java index ec09c8508057130..e0f0b0064eb5c9c 100644 --- a/fe/fe-common/src/main/java/org/apache/doris/common/Config.java +++ b/fe/fe-common/src/main/java/org/apache/doris/common/Config.java @@ -1589,6 +1589,15 @@ public class Config extends ConfigBase { @ConfField(mutable = true, masterOnly = true) public static boolean ignore_backup_not_support_table_type = false; + /** + * whether to ignore temp partitions when backup, and not report exception. + */ + @ConfField(mutable = true, masterOnly = true, description = { + "是否忽略备份临时分区,不报异常", + "Whether to ignore temp partitions when backup, and not report exception." + }) + public static boolean ignore_backup_tmp_partitions = false; + /** * A internal config, to control the update interval of backup handler. Only used to speed up tests. */ diff --git a/fe/fe-core/src/main/java/org/apache/doris/backup/BackupHandler.java b/fe/fe-core/src/main/java/org/apache/doris/backup/BackupHandler.java index 4749bf7f6196fb8..34e127d137a64b2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/backup/BackupHandler.java +++ b/fe/fe-core/src/main/java/org/apache/doris/backup/BackupHandler.java @@ -427,14 +427,14 @@ private void backup(Repository repository, Database db, BackupStmt stmt) throws OlapTable olapTbl = (OlapTable) tbl; tbl.readLock(); try { - if (olapTbl.existTempPartitions()) { + if (!Config.ignore_backup_tmp_partitions && olapTbl.existTempPartitions()) { ErrorReport.reportDdlException(ErrorCode.ERR_COMMON_ERROR, "Do not support backup table " + olapTbl.getName() + " with temp partitions"); } PartitionNames partitionNames = tblRef.getPartitionNames(); if (partitionNames != null) { - if (partitionNames.isTemp()) { + if (!Config.ignore_backup_tmp_partitions && partitionNames.isTemp()) { ErrorReport.reportDdlException(ErrorCode.ERR_COMMON_ERROR, "Do not support backup temp partitions in table " + tblRef.getName()); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/backup/BackupJob.java b/fe/fe-core/src/main/java/org/apache/doris/backup/BackupJob.java index 05349cbcc28f2d2..04aecba854d70a2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/backup/BackupJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/backup/BackupJob.java @@ -597,11 +597,16 @@ private Status prepareSnapshotTaskForOlapTableWithoutLock(Database db, OlapTable // check backup table again if (backupTableRef.getPartitionNames() != null) { for (String partName : backupTableRef.getPartitionNames().getPartitionNames()) { - Partition partition = olapTable.getPartition(partName); + Partition partition = olapTable.getPartition(partName, false); // exclude tmp partitions if (partition == null) { - status = new Status(ErrCode.NOT_FOUND, "partition " + partName - + " does not exist in table" + backupTableRef.getName().getTbl()); - return status; + if (olapTable.getPartition(partName, true) != null) { + status = new Status(ErrCode.NOT_FOUND, "backup tmp partition " + partName + + " in table " + backupTableRef.getName().getTbl() + " is not supported"); + } else { + status = new Status(ErrCode.NOT_FOUND, "partition " + partName + + " does not exist in table " + backupTableRef.getName().getTbl()); + } + return; } } } @@ -609,10 +614,10 @@ private Status prepareSnapshotTaskForOlapTableWithoutLock(Database db, OlapTable // create snapshot tasks List partitions = Lists.newArrayList(); if (backupTableRef.getPartitionNames() == null) { - partitions.addAll(olapTable.getPartitions()); + partitions.addAll(olapTable.getPartitions()); // no temp partitions in OlapTable.getPartitions() } else { for (String partName : backupTableRef.getPartitionNames().getPartitionNames()) { - Partition partition = olapTable.getPartition(partName); + Partition partition = olapTable.getPartition(partName, false); // exclude tmp partitions partitions.add(partition); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java index 463f335d8781f48..d64b8febc7d5aa5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java @@ -1935,6 +1935,14 @@ public OlapTable selectiveCopy(Collection reservedPartitions, IndexExtSt } } + if (isForBackup) { + // drop all tmp partitions in copied table + for (Partition partition : copied.tempPartitions.getAllPartitions()) { + copied.partitionInfo.dropPartition(partition.getId()); + } + copied.tempPartitions = new TempPartitions(); + } + if (reservedPartitions == null || reservedPartitions.isEmpty()) { // reserve all return copied; diff --git a/regression-test/suites/backup_restore/test_backup_restore_backup_temp_partition.groovy b/regression-test/suites/backup_restore/test_backup_restore_backup_temp_partition.groovy index 61514bedd88215a..8f06ff4eb8bfa37 100644 --- a/regression-test/suites/backup_restore/test_backup_restore_backup_temp_partition.groovy +++ b/regression-test/suites/backup_restore/test_backup_restore_backup_temp_partition.groovy @@ -62,6 +62,7 @@ suite("test_backup_restore_backup_temp_partition", "backup_restore") { ALTER TABLE ${dbName}.${tableName} ADD TEMPORARY PARTITION tp1 VALUES LESS THAN ("70") """ + sql "ADMIN SET FRONTEND CONFIG ('ignore_backup_tmp_partitions' = 'false')" test { sql """ BACKUP SNAPSHOT ${dbName}.${snapshotName} @@ -71,6 +72,39 @@ suite("test_backup_restore_backup_temp_partition", "backup_restore") { exception "Do not support backup table ${tableName} with temp partitions" } + // ignore the tmp partitions + sql "ADMIN SET FRONTEND CONFIG ('ignore_backup_tmp_partitions' = 'true')" + sql """ + BACKUP SNAPSHOT ${dbName}.${snapshotName} + TO `${repoName}` + ON (${tableName}) + """ + + syncer.waitSnapshotFinish(dbName) + def snapshot = syncer.getSnapshotTimestamp(repoName, snapshotName) + assertTrue(snapshot != null) + + // The restored table has no tmp partitions + sql "DROP TABLE IF EXISTS ${dbName}.${tableName}" + + sql """ + RESTORE SNAPSHOT ${dbName}.${snapshotName} + FROM `${repoName}` + ON ( + `${tableName}` PARTITION (p1, p2, p3) + ) + PROPERTIES + ( + "backup_timestamp" = "${snapshot}", + "reserve_replica" = "true" + ) + """ + + syncer.waitAllRestoreFinish(dbName) + def res = sql "SHOW TEMPORARY PARTITIONS FROM ${dbName}.${tableName}" + assertTrue(res.size() == 0); + + sql "ADMIN SET FRONTEND CONFIG ('ignore_backup_tmp_partitions' = 'false')" sql "DROP TABLE ${dbName}.${tableName} FORCE" sql "DROP DATABASE ${dbName} FORCE" sql "DROP REPOSITORY `${repoName}`"