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 e0c88ca8e9ce45..9e1956ab5a1656 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 @@ -388,7 +388,8 @@ private void backup(Repository repository, Database db, BackupStmt stmt) throws for (TableRef tblRef : tblRefs) { String tblName = tblRef.getName().getTbl(); Table tbl = db.getTableOrDdlException(tblName); - if (tbl.getType() == TableType.VIEW || tbl.getType() == TableType.ODBC) { + if (tbl.getType() == TableType.VIEW || tbl.getType() == TableType.ODBC + || tbl.getType() == TableType.MATERIALIZED_VIEW) { continue; } if (tbl.getType() != TableType.OLAP) { 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 fe13e02d9c8b28..0342ba70b80fec 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 @@ -406,6 +406,8 @@ private void prepareAndSendSnapshotTask() { tbl.readLock(); try { switch (tbl.getType()) { + case MATERIALIZED_VIEW: + break; case OLAP: OlapTable olapTable = (OlapTable) tbl; if (!checkOlapTable(olapTable, tableRef).ok()) { diff --git a/regression-test/suites/backup_restore/test_backup_restore_mtmv.groovy b/regression-test/suites/backup_restore/test_backup_restore_mtmv.groovy new file mode 100644 index 00000000000000..3646ec632bba4e --- /dev/null +++ b/regression-test/suites/backup_restore/test_backup_restore_mtmv.groovy @@ -0,0 +1,99 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +suite("test_backup_restore_mtmv", "backup_restore") { + String suiteName = "test_backup_restore_mtmv" + String repoName = "${suiteName}_repo" + String dbName = "${suiteName}_db" + String tableName = "${suiteName}_table" + String mvName = "${suiteName}_mv" + String snapshotName = "${suiteName}_snapshot" + + def syncer = getSyncer() + syncer.createS3Repository(repoName) + + sql "CREATE DATABASE IF NOT EXISTS ${dbName}" + sql "DROP TABLE IF EXISTS ${dbName}.${tableName}" + sql """ + CREATE TABLE ${dbName}.${tableName} ( + `id` LARGEINT NOT NULL, + `count` LARGEINT SUM DEFAULT "0") + AGGREGATE KEY(`id`) + DISTRIBUTED BY HASH(`id`) BUCKETS 2 + PROPERTIES + ( + "replication_num" = "1" + ) + """ + + List values = [] + for (int i = 1; i <= 10; ++i) { + values.add("(${i}, ${i})") + } + sql "INSERT INTO ${dbName}.${tableName} VALUES ${values.join(",")}" + def result = sql "SELECT * FROM ${dbName}.${tableName}" + assertEquals(result.size(), values.size()); + + sql """drop materialized view if exists ${dbName}.${mvName};""" + sql """ + CREATE MATERIALIZED VIEW ${dbName}.${mvName} + BUILD DEFERRED REFRESH COMPLETE ON MANUAL + DISTRIBUTED BY RANDOM BUCKETS 2 + PROPERTIES ('replication_num' = '1') + AS + SELECT * FROM ${dbName}.${tableName}; + """ + + sql """ + BACKUP SNAPSHOT ${dbName}.${snapshotName} + TO `${repoName}` + """ + + syncer.waitSnapshotFinish(dbName) + + def snapshot = syncer.getSnapshotTimestamp(repoName, snapshotName) + assertTrue(snapshot != null) + + sql "TRUNCATE TABLE ${dbName}.${tableName}" + sql """drop materialized view if exists ${dbName}.${mvName};""" + + sql """ + RESTORE SNAPSHOT ${dbName}.${snapshotName} + FROM `${repoName}` + PROPERTIES + ( + "backup_timestamp" = "${snapshot}", + "reserve_replica" = "true" + ) + """ + + syncer.waitAllRestoreFinish(dbName) + + result = sql "SELECT * FROM ${dbName}.${tableName}" + assertEquals(result.size(), values.size()); + + result = sql "show tables FROM ${dbName}" + // now should not contain mtmv + logger.info("result: " + result.toString()) + assertFalse(result.toString().contains("${mvName}")); + + sql """drop materialized view if exists ${dbName}.${mvName};""" + sql "DROP TABLE ${dbName}.${tableName} FORCE" + sql "DROP DATABASE ${dbName} FORCE" + sql "DROP REPOSITORY `${repoName}`" +} +