You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by yi...@apache.org on 2022/06/25 13:52:00 UTC

[doris] branch master updated: [feature-wip](multi-catalog) refactor catalog interface (#10320)

This is an automated email from the ASF dual-hosted git repository.

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 7fe4b20da3 [feature-wip](multi-catalog) refactor catalog interface (#10320)
7fe4b20da3 is described below

commit 7fe4b20da3abe0110b9694aff9a9be3215fe775d
Author: Mingyu Chen <mo...@gmail.com>
AuthorDate: Sat Jun 25 21:51:54 2022 +0800

    [feature-wip](multi-catalog) refactor catalog interface (#10320)
---
 .../schema_scanner/schema_schemata_scanner.cpp     |  16 +-
 .../exec/schema_scanner/schema_tables_scanner.cpp  |  20 +-
 .../main/java/org/apache/doris/alter/Alter.java    |  18 +-
 .../java/org/apache/doris/alter/AlterHandler.java  |   2 +-
 .../doris/alter/MaterializedViewHandler.java       |   6 +-
 .../java/org/apache/doris/alter/RollupJobV2.java   |  22 +--
 .../apache/doris/alter/SchemaChangeHandler.java    |   2 +-
 .../org/apache/doris/alter/SchemaChangeJobV2.java  |  14 +-
 .../org/apache/doris/analysis/AlterViewStmt.java   |  18 +-
 .../org/apache/doris/analysis/AnalyzeStmt.java     |   6 +-
 .../java/org/apache/doris/analysis/Analyzer.java   |  19 +-
 .../org/apache/doris/analysis/BaseTableRef.java    |   8 +-
 .../doris/analysis/CreateDataSyncJobStmt.java      |   2 +-
 .../doris/analysis/CreateRoutineLoadStmt.java      |   2 +-
 .../org/apache/doris/analysis/DataDescription.java |   2 +-
 .../org/apache/doris/analysis/DescribeStmt.java    |   2 +-
 .../org/apache/doris/analysis/EncryptKeyRef.java   |   2 +-
 .../java/org/apache/doris/analysis/ExportStmt.java |   2 +-
 .../java/org/apache/doris/analysis/FromClause.java |   2 +-
 .../apache/doris/analysis/FunctionCallExpr.java    |  16 +-
 .../java/org/apache/doris/analysis/InsertStmt.java |  21 ++-
 .../java/org/apache/doris/analysis/LoadStmt.java   |   2 +-
 .../org/apache/doris/analysis/LockTablesStmt.java  |   2 +-
 .../java/org/apache/doris/analysis/QueryStmt.java  |   8 +-
 .../java/org/apache/doris/analysis/SelectStmt.java |  20 +-
 .../apache/doris/analysis/SetOperationStmt.java    |   4 +-
 .../org/apache/doris/analysis/ShowAlterStmt.java   |   5 +-
 .../org/apache/doris/analysis/ShowDataStmt.java    |   2 +-
 .../apache/doris/analysis/ShowPartitionsStmt.java  |   2 +-
 .../org/apache/doris/analysis/ShowViewStmt.java    |   2 +-
 .../org/apache/doris/analysis/StmtRewriter.java    |   2 +-
 .../java/org/apache/doris/analysis/UpdateStmt.java |   2 +-
 .../java/org/apache/doris/analysis/WithClause.java |   6 +-
 .../org/apache/doris/backup/BackupHandler.java     |   4 +-
 .../java/org/apache/doris/backup/BackupJob.java    |   2 +-
 .../java/org/apache/doris/backup/RestoreJob.java   |  12 +-
 .../java/org/apache/doris/catalog/Catalog.java     | 166 +++++------------
 .../apache/doris/catalog/CatalogRecycleBin.java    |   2 +-
 .../apache/doris/catalog/ColocateTableIndex.java   |   2 +-
 .../org/apache/doris/catalog/EncryptKeyHelper.java |   8 +-
 .../org/apache/doris/catalog/MetadataViewer.java   |   6 +-
 .../org/apache/doris/catalog/RefreshManager.java   |   4 +-
 .../main/java/org/apache/doris/catalog/Table.java  |  49 +----
 .../java/org/apache/doris/catalog/TableIf.java     |  64 +++++--
 .../org/apache/doris/catalog/TabletStatMgr.java    |   4 +-
 .../doris/catalog/external/ExternalTable.java      |  40 ++--
 .../clone/ColocateTableCheckerAndBalancer.java     |   4 +-
 .../doris/clone/DynamicPartitionScheduler.java     |   6 +-
 .../java/org/apache/doris/clone/TabletChecker.java |  10 +-
 .../org/apache/doris/clone/TabletSchedCtx.java     |   4 +-
 .../org/apache/doris/clone/TabletScheduler.java    |   2 +-
 .../org/apache/doris/common/proc/DbsProcDir.java   |  32 ++--
 .../common/proc/IncompleteTabletsProcNode.java     |   7 +-
 .../apache/doris/common/proc/IndexInfoProcDir.java |  18 +-
 .../apache/doris/common/proc/JobsDbProcDir.java    |   7 +-
 .../doris/common/proc/StatisticProcNode.java       |  57 +++---
 .../org/apache/doris/common/proc/TableProcDir.java |  26 ++-
 .../apache/doris/common/proc/TablesProcDir.java    |  25 +--
 .../doris/common/proc/TabletHealthProcDir.java     |  35 ++--
 .../apache/doris/common/util/MetaLockUtils.java    |  34 ++--
 .../org/apache/doris/common/util/SmallFileMgr.java |   6 +-
 .../doris/consistency/CheckConsistencyJob.java     |   4 +-
 .../doris/consistency/ConsistencyChecker.java      |   6 +-
 .../org/apache/doris/datasource/DataSourceIf.java  |  28 +--
 .../org/apache/doris/datasource/DataSourceMgr.java |  38 +++-
 .../doris/datasource/EsExternalDataSource.java     |  10 +-
 .../doris/datasource/ExternalDataSource.java       |  28 +--
 .../doris/datasource/HMSExternalDataSource.java    |  35 ++--
 .../doris/datasource/InternalDataSource.java       |  41 ++--
 .../doris/external/elasticsearch/EsRepository.java |   4 +-
 .../iceberg/IcebergTableCreationRecordMgr.java     |   2 +-
 .../apache/doris/httpv2/rest/CancelLoadAction.java |   2 +-
 .../apache/doris/httpv2/rest/GetDdlStmtAction.java |   2 +-
 .../doris/httpv2/rest/GetStreamLoadState.java      |   2 +-
 .../apache/doris/httpv2/rest/MetaInfoAction.java   |  12 +-
 .../apache/doris/httpv2/rest/RowCountAction.java   |   2 +-
 .../org/apache/doris/httpv2/rest/ShowAction.java   |  15 +-
 .../doris/httpv2/rest/StorageTypeCheckAction.java  |   2 +-
 .../doris/httpv2/rest/TableQueryPlanAction.java    |   2 +-
 .../doris/httpv2/rest/TableRowCountAction.java     |   2 +-
 .../doris/httpv2/rest/TableSchemaAction.java       |   2 +-
 .../doris/httpv2/restv2/MetaInfoActionV2.java      |   6 +-
 .../doris/httpv2/restv2/StatisticAction.java       |   8 +-
 .../java/org/apache/doris/load/DeleteHandler.java  |   4 +-
 .../main/java/org/apache/doris/load/DeleteJob.java |   2 +-
 .../main/java/org/apache/doris/load/ExportJob.java |   2 +-
 .../main/java/org/apache/doris/load/ExportMgr.java |   2 +-
 .../src/main/java/org/apache/doris/load/Load.java  |  20 +-
 .../java/org/apache/doris/load/LoadChecker.java    |   4 +-
 .../org/apache/doris/load/StreamLoadRecordMgr.java |   2 +-
 .../org/apache/doris/load/loadv2/BulkLoadJob.java  |  25 +--
 .../apache/doris/load/loadv2/InsertLoadJob.java    |   9 +-
 .../java/org/apache/doris/load/loadv2/LoadJob.java |   4 +-
 .../org/apache/doris/load/loadv2/LoadManager.java  |   6 +-
 .../doris/load/loadv2/LoadingTaskPlanner.java      |   5 +-
 .../org/apache/doris/load/loadv2/MiniLoadJob.java  |   2 +-
 .../org/apache/doris/load/loadv2/SparkLoadJob.java |  14 +-
 .../doris/load/loadv2/SparkLoadPendingTask.java    |   4 +-
 .../load/routineload/KafkaRoutineLoadJob.java      |   2 +-
 .../doris/load/routineload/KafkaTaskInfo.java      |   3 +-
 .../doris/load/routineload/RoutineLoadJob.java     |  16 +-
 .../doris/load/routineload/RoutineLoadManager.java |   6 +-
 .../java/org/apache/doris/load/sync/SyncJob.java   |   4 +-
 .../org/apache/doris/load/sync/SyncJobManager.java |   8 +-
 .../apache/doris/load/sync/canal/CanalSyncJob.java |   2 +-
 .../doris/load/update/UpdateStmtExecutor.java      |   9 +-
 .../java/org/apache/doris/master/MasterImpl.java   |   2 +-
 .../master/PartitionInMemoryInfoCollector.java     |   4 +-
 .../org/apache/doris/master/ReportHandler.java     |   8 +-
 .../doris/nereids/rules/analysis/BindRelation.java |   2 +-
 .../java/org/apache/doris/persist/EditLog.java     |   3 +-
 .../org/apache/doris/policy/DropPolicyLog.java     |   2 +-
 .../main/java/org/apache/doris/policy/Policy.java  |   8 +-
 .../java/org/apache/doris/policy/RowPolicy.java    |   2 +-
 .../java/org/apache/doris/qe/ConnectContext.java   |   6 +-
 .../java/org/apache/doris/qe/ConnectProcessor.java |   8 +-
 .../java/org/apache/doris/qe/ShowExecutor.java     | 207 +++++++++++----------
 .../java/org/apache/doris/qe/StmtExecutor.java     |   9 +-
 .../apache/doris/service/FrontendServiceImpl.java  |  58 +++---
 .../doris/statistics/StatisticsJobManager.java     |   2 +-
 .../doris/statistics/StatisticsJobScheduler.java   |   2 +-
 .../apache/doris/statistics/StatisticsManager.java |  30 +--
 .../java/org/apache/doris/system/Diagnoser.java    |   2 +-
 .../org/apache/doris/system/SystemInfoService.java |   2 +-
 .../org/apache/doris/task/ExportPendingTask.java   |   2 +-
 .../java/org/apache/doris/task/LoadEtlTask.java    |   2 +-
 .../org/apache/doris/task/LoadPendingTask.java     |   2 +-
 .../doris/transaction/DatabaseTransactionMgr.java  |  19 +-
 .../transaction/DbUsedDataQuotaInfoCollector.java  |   4 +-
 .../doris/transaction/GlobalTransactionMgr.java    |   4 +-
 .../doris/transaction/PublishVersionDaemon.java    |   3 +-
 .../org/apache/doris/alter/AlterJobV2Test.java     |   3 +-
 .../java/org/apache/doris/alter/AlterTest.java     |  29 +--
 .../org/apache/doris/alter/BatchRollupJobTest.java |   6 +-
 .../org/apache/doris/alter/RollupJobV2Test.java    |  10 +-
 .../apache/doris/alter/SchemaChangeJobV2Test.java  |   8 +-
 .../org/apache/doris/analysis/AccessTestUtil.java  | 119 +++++++++---
 .../doris/analysis/AdminShowReplicaTest.java       |   2 +-
 .../doris/analysis/CreateDataSyncJobStmtTest.java  |   9 +-
 .../doris/analysis/CreateRoutineLoadStmtTest.java  |   9 +-
 .../apache/doris/analysis/DataDescriptionTest.java |   9 +-
 .../apache/doris/analysis/DescribeStmtTest.java    |  81 --------
 .../apache/doris/analysis/GroupByClauseTest.java   |   1 +
 .../org/apache/doris/analysis/LoadStmtTest.java    |   3 +
 .../apache/doris/analysis/ShowDataStmtTest.java    |  15 +-
 .../analysis/TableNameComparedLowercaseTest.java   |   6 +-
 .../analysis/TableNameStoredLowercaseTest.java     |   4 +-
 .../apache/doris/analysis/VirtualSlotRefTest.java  |   2 -
 .../org/apache/doris/backup/BackupHandlerTest.java |  11 +-
 .../org/apache/doris/backup/BackupJobTest.java     |  11 +-
 .../org/apache/doris/backup/CatalogMocker.java     |  22 ++-
 .../org/apache/doris/backup/RestoreJobTest.java    |   9 +-
 .../org/apache/doris/catalog/AdminStmtTest.java    |   2 +-
 .../apache/doris/catalog/CatalogOperationTest.java |   2 +-
 .../org/apache/doris/catalog/CatalogTestUtil.java  |   4 +-
 .../apache/doris/catalog/ColocateTableTest.java    |   6 +-
 .../apache/doris/catalog/CreateEncryptKeyTest.java |   4 +-
 .../apache/doris/catalog/CreateFunctionTest.java   |   4 +-
 .../apache/doris/catalog/CreateTableLikeTest.java  |  14 +-
 .../org/apache/doris/catalog/CreateTableTest.java  |   2 +-
 .../org/apache/doris/catalog/CreateViewTest.java   |   4 +-
 .../java/org/apache/doris/catalog/DropDbTest.java  |  20 +-
 .../apache/doris/catalog/DropPartitionTest.java    |   6 +-
 .../org/apache/doris/catalog/DropTableTest.java    |   4 +-
 .../doris/catalog/DynamicPartitionTableTest.java   | 166 +++++++++--------
 .../apache/doris/catalog/MetadataViewerTest.java   |  18 +-
 .../apache/doris/catalog/ModifyBackendTest.java    |   2 +-
 .../java/org/apache/doris/catalog/RecoverTest.java |   7 +-
 .../apache/doris/catalog/TempPartitionTest.java    |  21 ++-
 .../apache/doris/catalog/TruncateTableTest.java    |   2 +-
 .../org/apache/doris/clone/DiskRebalanceTest.java  |  13 +-
 .../java/org/apache/doris/clone/RebalanceTest.java |  17 +-
 .../doris/clone/TabletRepairAndBalanceTest.java    |   2 +-
 .../doris/cluster/SystemInfoServiceTest.java       |   9 +-
 .../apache/doris/common/proc/DbsProcDirTest.java   |  50 +++--
 .../apache/doris/common/util/SmallFileMgrTest.java |   8 +-
 .../elasticsearch/EsShardPartitionsTest.java       |   9 +-
 .../org/apache/doris/http/DorisHttpTestCase.java   |  49 +++--
 .../org/apache/doris/load/DeleteHandlerTest.java   |  14 +-
 .../org/apache/doris/load/LoadCheckerTest.java     |  11 +-
 .../doris/load/loadv2/BrokerLoadJobTest.java       |  70 +++----
 .../doris/load/loadv2/InsertLoadJobTest.java       |  11 +-
 .../apache/doris/load/loadv2/LoadManagerTest.java  |  34 ++--
 .../apache/doris/load/loadv2/SparkLoadJobTest.java |  15 +-
 .../doris/load/routineload/RoutineLoadJobTest.java |  35 ++--
 .../load/routineload/RoutineLoadManagerTest.java   |  74 ++++----
 .../load/routineload/RoutineLoadSchedulerTest.java |  28 +--
 .../apache/doris/load/sync/SyncJobManagerTest.java |   9 +-
 .../doris/load/sync/canal/CanalSyncJobTest.java    |  19 +-
 .../org/apache/doris/mysql/MysqlProtoTest.java     |  10 +-
 .../doris/mysql/privilege/PrivEntryTest.java       |   8 +-
 .../apache/doris/persist/LoadJobV2PersistTest.java |  11 +-
 .../org/apache/doris/planner/QueryPlanTest.java    |   8 +-
 .../apache/doris/planner/ResourceTagQueryTest.java |   2 +-
 .../org/apache/doris/qe/PartitionCacheTest.java    |  33 +++-
 .../java/org/apache/doris/qe/ShowExecutorTest.java |  30 ++-
 .../org/apache/doris/task/LoadEtlTaskTest.java     |  13 +-
 .../org/apache/doris/task/LoadPendingTaskTest.java |  13 +-
 .../transaction/DatabaseTransactionMgrTest.java    |   3 +-
 .../transaction/GlobalTransactionMgrTest.java      |  62 +++---
 .../org/apache/doris/utframe/AnotherDemoTest.java  |   4 +-
 .../doris/utframe/DemoMultiBackendsTest.java       |   4 +-
 .../java/org/apache/doris/utframe/DemoTest.java    |   4 +-
 gensrc/thrift/FrontendService.thrift               |   4 +-
 204 files changed, 1664 insertions(+), 1375 deletions(-)

diff --git a/be/src/exec/schema_scanner/schema_schemata_scanner.cpp b/be/src/exec/schema_scanner/schema_schemata_scanner.cpp
index cd794bdeaa..26e0ea580c 100644
--- a/be/src/exec/schema_scanner/schema_schemata_scanner.cpp
+++ b/be/src/exec/schema_scanner/schema_schemata_scanner.cpp
@@ -73,12 +73,16 @@ Status SchemaSchemataScanner::fill_one_row(Tuple* tuple, MemPool* pool) {
 
     // catalog
     {
-        void* slot = tuple->get_slot(_tuple_desc->slots()[0]->tuple_offset());
-        StringValue* str_slot = reinterpret_cast<StringValue*>(slot);
-        std::string catalog_name = _db_result.catalogs[_db_index];
-        str_slot->ptr = (char*)pool->allocate(catalog_name.size());
-        str_slot->len = catalog_name.size();
-        memcpy(str_slot->ptr, catalog_name.c_str(), str_slot->len);
+        if (!_db_result.__isset.catalogs) {
+            tuple->set_null(_tuple_desc->slots()[0]->null_indicator_offset());
+        } else {
+            void* slot = tuple->get_slot(_tuple_desc->slots()[0]->tuple_offset());
+            StringValue* str_slot = reinterpret_cast<StringValue*>(slot);
+            std::string catalog_name = _db_result.catalogs[_db_index];
+            str_slot->ptr = (char*)pool->allocate(catalog_name.size());
+            str_slot->len = catalog_name.size();
+            memcpy(str_slot->ptr, catalog_name.c_str(), str_slot->len);
+        }
     }
     // schema
     {
diff --git a/be/src/exec/schema_scanner/schema_tables_scanner.cpp b/be/src/exec/schema_scanner/schema_tables_scanner.cpp
index 142200f9ed..381c047b53 100644
--- a/be/src/exec/schema_scanner/schema_tables_scanner.cpp
+++ b/be/src/exec/schema_scanner/schema_tables_scanner.cpp
@@ -90,12 +90,16 @@ Status SchemaTablesScanner::fill_one_row(Tuple* tuple, MemPool* pool) {
     const TTableStatus& tbl_status = _table_result.tables[_table_index];
     // catalog
     {
-        void* slot = tuple->get_slot(_tuple_desc->slots()[0]->tuple_offset());
-        StringValue* str_slot = reinterpret_cast<StringValue*>(slot);
-        std::string catalog_name = _db_result.catalogs[_db_index - 1];
-        str_slot->ptr = (char*)pool->allocate(catalog_name.size());
-        str_slot->len = catalog_name.size();
-        memcpy(str_slot->ptr, catalog_name.c_str(), str_slot->len);
+        if (!_db_result.__isset.catalogs) {
+            tuple->set_null(_tuple_desc->slots()[0]->null_indicator_offset());
+        } else {
+            void* slot = tuple->get_slot(_tuple_desc->slots()[0]->tuple_offset());
+            StringValue* str_slot = reinterpret_cast<StringValue*>(slot);
+            std::string catalog_name = _db_result.catalogs[_db_index - 1];
+            str_slot->ptr = (char*)pool->allocate(catalog_name.size());
+            str_slot->len = catalog_name.size();
+            memcpy(str_slot->ptr, catalog_name.c_str(), str_slot->len);
+        }
     }
     // schema
     {
@@ -253,7 +257,9 @@ Status SchemaTablesScanner::fill_one_row(Tuple* tuple, MemPool* pool) {
 Status SchemaTablesScanner::get_new_table() {
     TGetTablesParams table_params;
     table_params.__set_db(_db_result.dbs[_db_index]);
-    table_params.__set_catalog(_db_result.catalogs[_db_index]);
+    if (_db_result.__isset.catalogs) {
+        table_params.__set_catalog(_db_result.catalogs[_db_index]);
+    }
     _db_index++;
     if (nullptr != _param->wild) {
         table_params.__set_pattern(*(_param->wild));
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java
index bc4159cd8a..2ae1b21eec 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/Alter.java
@@ -105,7 +105,7 @@ public class Alter {
         String tableName = stmt.getBaseIndexName();
         // check db
         String dbName = stmt.getDBName();
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
         // check cluster capacity
         Catalog.getCurrentSystemInfo().checkClusterCapacity(stmt.getClusterName());
         // check db quota
@@ -118,7 +118,7 @@ public class Alter {
     public void processDropMaterializedView(DropMaterializedViewStmt stmt) throws DdlException, MetaNotFoundException {
         // check db
         String dbName = stmt.getTableName().getDb();
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
 
         String tableName = stmt.getTableName().getTbl();
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableName, TableType.OLAP);
@@ -269,7 +269,7 @@ public class Alter {
     public void replayModifyComment(ModifyCommentOperationLog operation) throws MetaNotFoundException {
         long dbId = operation.getDbId();
         long tblId = operation.getTblId();
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         Table tbl = db.getTableOrMetaException(tblId);
         tbl.writeLock();
         try {
@@ -321,7 +321,7 @@ public class Alter {
     }
 
     public void replayProcessModifyEngine(ModifyTableEngineOperationLog log) {
-        Database db = Catalog.getCurrentCatalog().getDbNullable(log.getDbId());
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(log.getDbId());
         if (db == null) {
             return;
         }
@@ -377,7 +377,7 @@ public class Alter {
         String tableName = dbTableName.getTbl();
         final String clusterName = stmt.getClusterName();
 
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
         Table table = db.getTableOrDdlException(tableName);
         List<AlterClause> alterClauses = Lists.newArrayList();
         // some operations will take long time to process, need to be done outside the table lock
@@ -472,7 +472,7 @@ public class Alter {
         long origTblId = log.getOrigTblId();
         long newTblId = log.getNewTblId();
 
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         OlapTable origTable = (OlapTable) db.getTableOrMetaException(origTblId, TableType.OLAP);
         OlapTable newTbl = (OlapTable) db.getTableOrMetaException(newTblId, TableType.OLAP);
         List<Table> tableList = Lists.newArrayList(origTable, newTbl);
@@ -530,7 +530,7 @@ public class Alter {
         TableName dbTableName = stmt.getTbl();
         String dbName = dbTableName.getDb();
 
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
 
         String tableName = dbTableName.getTbl();
         View view = (View) db.getTableOrMetaException(tableName, TableType.VIEW);
@@ -572,7 +572,7 @@ public class Alter {
         String inlineViewDef = alterViewInfo.getInlineViewDef();
         List<Column> newFullSchema = alterViewInfo.getNewFullSchema();
 
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         View view = (View) db.getTableOrMetaException(tableId, TableType.VIEW);
 
         db.writeLock();
@@ -713,7 +713,7 @@ public class Alter {
     }
 
     public void replayModifyPartition(ModifyPartitionInfo info) throws MetaNotFoundException {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(info.getDbId());
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(info.getDbId());
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(info.getTableId(), TableType.OLAP);
         olapTable.writeLock();
         try {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/AlterHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/AlterHandler.java
index 347aa36747..473229dd1e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/AlterHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/AlterHandler.java
@@ -198,7 +198,7 @@ public abstract class AlterHandler extends MasterDaemon {
      * In summary, we only need to update replica's version when replica's version is smaller than X
      */
     public void handleFinishAlterTask(AlterReplicaTask task) throws MetaNotFoundException {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(task.getDbId());
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(task.getDbId());
 
         OlapTable tbl = (OlapTable) db.getTableOrMetaException(task.getTableId(), Table.TableType.OLAP);
         tbl.writeLockOrMetaException();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java
index 64319c4cfb..9612fbb83d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/MaterializedViewHandler.java
@@ -837,7 +837,7 @@ public class MaterializedViewHandler extends AlterHandler {
         long rollupIndexId = dropInfo.getIndexId();
 
         TabletInvertedIndex invertedIndex = Catalog.getCurrentInvertedIndex();
-        Database db = catalog.getDbOrMetaException(dbId);
+        Database db = catalog.getInternalDataSource().getDbOrMetaException(dbId);
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, Table.TableType.OLAP);
         olapTable.writeLock();
         try {
@@ -884,7 +884,7 @@ public class MaterializedViewHandler extends AlterHandler {
 
     private void changeTableStatus(long dbId, long tableId, OlapTableState olapTableState) {
         try {
-            Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
             OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, Table.TableType.OLAP);
             olapTable.writeLockOrMetaException();
             try {
@@ -1038,7 +1038,7 @@ public class MaterializedViewHandler extends AlterHandler {
         Preconditions.checkState(!Strings.isNullOrEmpty(dbName));
         Preconditions.checkState(!Strings.isNullOrEmpty(tableName));
 
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
 
         List<AlterJobV2> rollupJobV2List = new ArrayList<>();
         OlapTable olapTable;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java b/fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java
index 8d9c83046a..79ec2d4107 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java
@@ -182,8 +182,8 @@ public class RollupJobV2 extends AlterJobV2 implements GsonPostProcessable {
         Preconditions.checkState(jobState == JobState.PENDING, jobState);
 
         LOG.info("begin to send create rollup replica tasks. job: {}", jobId);
-        Database db = Catalog.getCurrentCatalog().getDbOrException(dbId,
-                s -> new AlterCancelException("Database " + s + " does not exist"));
+        Database db = Catalog.getCurrentInternalCatalog()
+                .getDbOrException(dbId, s -> new AlterCancelException("Database " + s + " does not exist"));
         if (!checkTableStable(db)) {
             return;
         }
@@ -336,8 +336,8 @@ public class RollupJobV2 extends AlterJobV2 implements GsonPostProcessable {
         }
 
         LOG.info("previous transactions are all finished, begin to send rollup tasks. job: {}", jobId);
-        Database db = Catalog.getCurrentCatalog().getDbOrException(dbId,
-                s -> new AlterCancelException("Databasee " + s + " does not exist"));
+        Database db = Catalog.getCurrentInternalCatalog()
+                .getDbOrException(dbId, s -> new AlterCancelException("Databasee " + s + " does not exist"));
 
         OlapTable tbl;
         try {
@@ -416,8 +416,8 @@ public class RollupJobV2 extends AlterJobV2 implements GsonPostProcessable {
         // must check if db or table still exist first.
         // or if table is dropped, the tasks will never be finished,
         // and the job will be in RUNNING state forever.
-        Database db = Catalog.getCurrentCatalog().getDbOrException(dbId,
-                s -> new AlterCancelException("Databasee " + s + " does not exist"));
+        Database db = Catalog.getCurrentInternalCatalog()
+                .getDbOrException(dbId, s -> new AlterCancelException("Databasee " + s + " does not exist"));
 
         OlapTable tbl;
         try {
@@ -527,7 +527,7 @@ public class RollupJobV2 extends AlterJobV2 implements GsonPostProcessable {
         AgentTaskQueue.removeBatchTask(rollupBatchTask, TTaskType.ALTER);
         // remove all rollup indexes, and set state to NORMAL
         TabletInvertedIndex invertedIndex = Catalog.getCurrentInvertedIndex();
-        Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (db != null) {
             OlapTable tbl = (OlapTable) db.getTableNullable(tableId);
             if (tbl != null) {
@@ -561,7 +561,7 @@ public class RollupJobV2 extends AlterJobV2 implements GsonPostProcessable {
      * These changes should be same as changes in RollupHander.processAddRollup()
      */
     private void replayCreateJob(RollupJobV2 replayedJob) throws MetaNotFoundException {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, Table.TableType.OLAP);
 
         olapTable.writeLock();
@@ -601,7 +601,7 @@ public class RollupJobV2 extends AlterJobV2 implements GsonPostProcessable {
      * Should replay all changes in runPendingJob()
      */
     private void replayPendingJob(RollupJobV2 replayedJob) throws MetaNotFoundException {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, Table.TableType.OLAP);
         olapTable.writeLock();
         try {
@@ -622,7 +622,7 @@ public class RollupJobV2 extends AlterJobV2 implements GsonPostProcessable {
      * Should replay all changes in runRuningJob()
      */
     private void replayRunningJob(RollupJobV2 replayedJob) {
-        Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (db != null) {
             OlapTable tbl = (OlapTable) db.getTableNullable(tableId);
             if (tbl != null) {
@@ -758,7 +758,7 @@ public class RollupJobV2 extends AlterJobV2 implements GsonPostProcessable {
         ConnectContext connectContext = new ConnectContext();
         Database db;
         try {
-            db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+            db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         } catch (MetaNotFoundException e) {
             throw new IOException("error happens when parsing create materialized view stmt: " + origStmt, e);
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
index 433812d6d1..94515cfcfb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeHandler.java
@@ -1788,7 +1788,7 @@ public class SchemaChangeHandler extends AlterHandler {
         Preconditions.checkState(!Strings.isNullOrEmpty(dbName));
         Preconditions.checkState(!Strings.isNullOrEmpty(tableName));
 
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
         AlterJobV2 schemaChangeJobV2 = null;
 
         OlapTable olapTable = db.getOlapTableOrDdlException(tableName);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java
index c1a5144579..d7a0662bb2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java
@@ -198,7 +198,7 @@ public class SchemaChangeJobV2 extends AlterJobV2 {
     protected void runPendingJob() throws AlterCancelException {
         Preconditions.checkState(jobState == JobState.PENDING, jobState);
         LOG.info("begin to send create replica tasks. job: {}", jobId);
-        Database db = Catalog.getCurrentCatalog()
+        Database db = Catalog.getCurrentInternalCatalog()
                 .getDbOrException(dbId, s -> new AlterCancelException("Database " + s + " does not exist"));
 
         if (!checkTableStable(db)) {
@@ -373,7 +373,7 @@ public class SchemaChangeJobV2 extends AlterJobV2 {
         }
 
         LOG.info("previous transactions are all finished, begin to send schema change tasks. job: {}", jobId);
-        Database db = Catalog.getCurrentCatalog()
+        Database db = Catalog.getCurrentInternalCatalog()
                 .getDbOrException(dbId, s -> new AlterCancelException("Database " + s + " does not exist"));
 
         OlapTable tbl;
@@ -479,7 +479,7 @@ public class SchemaChangeJobV2 extends AlterJobV2 {
         // must check if db or table still exist first.
         // or if table is dropped, the tasks will never be finished,
         // and the job will be in RUNNING state forever.
-        Database db = Catalog.getCurrentCatalog()
+        Database db = Catalog.getCurrentInternalCatalog()
                 .getDbOrException(dbId, s -> new AlterCancelException("Database " + s + " does not exist"));
 
         OlapTable tbl;
@@ -655,7 +655,7 @@ public class SchemaChangeJobV2 extends AlterJobV2 {
         AgentTaskQueue.removeBatchTask(schemaChangeBatchTask, TTaskType.ALTER);
         // remove all shadow indexes, and set state to NORMAL
         TabletInvertedIndex invertedIndex = Catalog.getCurrentInvertedIndex();
-        Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (db != null) {
             OlapTable tbl = (OlapTable) db.getTableNullable(tableId);
             if (tbl != null) {
@@ -699,7 +699,7 @@ public class SchemaChangeJobV2 extends AlterJobV2 {
      * These changes should be same as changes in SchemaChangeHandler.createJob()
      */
     private void replayCreateJob(SchemaChangeJobV2 replayedJob) throws MetaNotFoundException {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, TableType.OLAP);
         olapTable.writeLock();
         try {
@@ -737,7 +737,7 @@ public class SchemaChangeJobV2 extends AlterJobV2 {
      * Should replay all changes in runPendingJob()
      */
     private void replayPendingJob(SchemaChangeJobV2 replayedJob) throws MetaNotFoundException {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, TableType.OLAP);
         olapTable.writeLock();
         try {
@@ -757,7 +757,7 @@ public class SchemaChangeJobV2 extends AlterJobV2 {
      * Should replay all changes in runRunningJob()
      */
     private void replayRunningJob(SchemaChangeJobV2 replayedJob) {
-        Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (db != null) {
             OlapTable tbl = (OlapTable) db.getTableNullable(tableId);
             if (tbl != null) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterViewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterViewStmt.java
index 93a55b9908..fa12128dc6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterViewStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AlterViewStmt.java
@@ -18,7 +18,8 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.Catalog;
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.DatabaseIf;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.View;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.ErrorCode;
@@ -48,18 +49,17 @@ public class AlterViewStmt extends BaseViewStmt {
         }
         tableName.analyze(analyzer);
 
-
-        Table table = analyzer.getTableOrAnalysisException(tableName);
+        DatabaseIf db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(tableName.getDb());
+        TableIf table = db.getTableOrAnalysisException(tableName.getTbl());
         if (!(table instanceof View)) {
-            throw new AnalysisException(String.format("ALTER VIEW not allowed on a table:%s.%s",
-                    getDbName(), getTable()));
+            throw new AnalysisException(
+                    String.format("ALTER VIEW not allowed on a table:%s.%s", getDbName(), getTable()));
         }
 
-        if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(
-                ConnectContext.get(), tableName.getDb(), tableName.getTbl(), PrivPredicate.ALTER)) {
+        if (!Catalog.getCurrentCatalog().getAuth()
+                .checkTblPriv(ConnectContext.get(), tableName.getDb(), tableName.getTbl(), PrivPredicate.ALTER)) {
             ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "ALTER VIEW",
-                    ConnectContext.get().getQualifiedUser(),
-                    ConnectContext.get().getRemoteIP(),
+                    ConnectContext.get().getQualifiedUser(), ConnectContext.get().getRemoteIP(),
                     tableName.getDb() + ": " + tableName.getTbl());
         }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeStmt.java
index 7c2b94f1ad..00a5cf7479 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/AnalyzeStmt.java
@@ -100,7 +100,7 @@ public class AnalyzeStmt extends DdlStmt {
     public Database getDb() throws AnalysisException {
         Preconditions.checkArgument(isAnalyzed(),
                 "The db must be obtained after the parsing is complete");
-        return this.analyzer.getCatalog().getDbOrAnalysisException(this.dbId);
+        return this.analyzer.getCatalog().getInternalDataSource().getDbOrAnalysisException(this.dbId);
     }
 
     public List<Table> getTables() throws AnalysisException {
@@ -164,7 +164,7 @@ public class AnalyzeStmt extends DdlStmt {
             String tblName = this.dbTableName.getTbl();
             checkAnalyzePriv(dbName, tblName);
 
-            Database db = analyzer.getCatalog().getDbOrAnalysisException(dbName);
+            Database db = analyzer.getCatalog().getInternalDataSource().getDbOrAnalysisException(dbName);
             Table table = db.getTableOrAnalysisException(tblName);
 
             if (this.columnNames != null && !this.columnNames.isEmpty()) {
@@ -191,7 +191,7 @@ public class AnalyzeStmt extends DdlStmt {
             if (Strings.isNullOrEmpty(dbName)) {
                 ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_DB_ERROR);
             }
-            Database db = analyzer.getCatalog().getDbOrAnalysisException(dbName);
+            Database db = analyzer.getCatalog().getInternalDataSource().getDbOrAnalysisException(dbName);
 
             db.readLock();
             try {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
index 3ccc391f0a..ea3047a8d1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java
@@ -22,11 +22,12 @@ package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Column;
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.OlapTable.OlapTableState;
 import org.apache.doris.catalog.Partition.PartitionState;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.catalog.View;
@@ -655,14 +656,14 @@ public class Analyzer {
             ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_DB_ERROR);
         }
 
-        Database database = globalState.catalog.getDbOrAnalysisException(dbName);
-        Table table = database.getTableOrAnalysisException(tableName.getTbl());
+        DatabaseIf database = globalState.catalog.getCurrentDataSource().getDbOrAnalysisException(dbName);
+        TableIf table = database.getTableOrAnalysisException(tableName.getTbl());
 
         if (table.getType() == TableType.OLAP && (((OlapTable) table).getState() == OlapTableState.RESTORE
                 || ((OlapTable) table).getState() == OlapTableState.RESTORE_WITH_LOAD)) {
-            Boolean isNotRestoring = ((OlapTable) table).getPartitions().stream().filter(
-                    partition -> partition.getState() == PartitionState.RESTORE
-            ).collect(Collectors.toList()).isEmpty();
+            Boolean isNotRestoring = ((OlapTable) table).getPartitions().stream()
+                    .filter(partition -> partition.getState() == PartitionState.RESTORE).collect(Collectors.toList())
+                    .isEmpty();
 
             if (!isNotRestoring) {
                 // if doing restore with partitions, the status check push down to OlapScanNode::computePartitionInfo to
@@ -693,8 +694,8 @@ public class Analyzer {
         }
     }
 
-    public Table getTableOrAnalysisException(TableName tblName) throws AnalysisException {
-        Database db = globalState.catalog.getDbOrAnalysisException(tblName.getDb());
+    public TableIf getTableOrAnalysisException(TableName tblName) throws AnalysisException {
+        DatabaseIf db = globalState.catalog.getCurrentDataSource().getDbOrAnalysisException(tblName.getDb());
         return db.getTableOrAnalysisException(tblName.getTbl());
     }
 
@@ -760,7 +761,7 @@ public class Analyzer {
          * The inner subquery: select k1 from table c where a.k1=k1;
          * There is a associated column (a.k1) which belongs to the outer query appears in the inner subquery.
          * This column could not be resolved because doris can only resolved the parent column instead of grandpa.
-         * The exception of this query like that: Unknown column 'k1' in 'a'
+         * The exception to this query like that: Unknown column 'k1' in 'a'
          */
         if (d == null && hasAncestors() && isSubquery) {
             // analyzer father for subquery
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/BaseTableRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/BaseTableRef.java
index 39f722a92a..bd7458718a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/BaseTableRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/BaseTableRef.java
@@ -17,7 +17,7 @@
 
 package org.apache.doris.analysis;
 
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.UserException;
 
 import org.apache.logging.log4j.LogManager;
@@ -30,9 +30,9 @@ import org.apache.logging.log4j.Logger;
 public class BaseTableRef extends TableRef {
     private static final Logger LOG = LogManager.getLogger(BaseTableRef.class);
 
-    private Table table;
+    private TableIf table;
 
-    public BaseTableRef(TableRef ref, Table table, TableName tableName) {
+    public BaseTableRef(TableRef ref, TableIf table, TableName tableName) {
         super(ref);
         this.table = table;
         this.name = tableName;
@@ -40,7 +40,7 @@ public class BaseTableRef extends TableRef {
         if (hasExplicitAlias()) {
             return;
         }
-        aliases = new String[] { name.toString(), tableName.getNoClusterString(), tableName.getTbl() };
+        aliases = new String[] {name.toString(), tableName.getNoClusterString(), tableName.getTbl()};
     }
 
     protected BaseTableRef(BaseTableRef other) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDataSyncJobStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDataSyncJobStmt.java
index 67159630c3..69c7ea0fa2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDataSyncJobStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateDataSyncJobStmt.java
@@ -93,7 +93,7 @@ public class CreateDataSyncJobStmt extends DdlStmt {
         for (ChannelDescription channelDescription : channelDescriptions) {
             channelDescription.analyze(dbName);
             String tableName = channelDescription.getTargetTable();
-            Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbName);
+            Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbName);
             OlapTable olapTable = db.getOlapTableOrAnalysisException(tableName);
             if (olapTable.getKeysType() != KeysType.UNIQUE_KEYS) {
                 throw new AnalysisException("Table: " + tableName
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateRoutineLoadStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateRoutineLoadStmt.java
index a55d61d945..e7a9269cb1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateRoutineLoadStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateRoutineLoadStmt.java
@@ -330,7 +330,7 @@ public class CreateRoutineLoadStmt extends DdlStmt {
         if (Strings.isNullOrEmpty(tableName)) {
             throw new AnalysisException("Table name should not be null");
         }
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbName);
         Table table = db.getTableOrAnalysisException(tableName);
         if (mergeType != LoadTask.MergeType.APPEND
                 && (table.getType() != Table.TableType.OLAP
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DataDescription.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DataDescription.java
index 86d7722305..01cf141c71 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DataDescription.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DataDescription.java
@@ -713,7 +713,7 @@ public class DataDescription {
     }
 
     private void analyzeSequenceCol(String fullDbName) throws AnalysisException {
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(fullDbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(fullDbName);
         OlapTable olapTable = db.getOlapTableOrAnalysisException(tableName);
         // no sequence column in load and table schema
         if (!hasSequenceCol() && !olapTable.hasSequenceCol()) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/DescribeStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/DescribeStmt.java
index 257ea98c83..b9908b44cb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/DescribeStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/DescribeStmt.java
@@ -108,7 +108,7 @@ public class DescribeStmt extends ShowStmt {
                                                 dbTableName.getDb() + ": " + dbTableName.getTbl());
         }
 
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbTableName.getDb());
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbTableName.getDb());
         Table table = db.getTableOrAnalysisException(dbTableName.getTbl());
 
         table.readLock();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/EncryptKeyRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/EncryptKeyRef.java
index 9da397cb9d..9cd76a5e34 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/EncryptKeyRef.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/EncryptKeyRef.java
@@ -60,7 +60,7 @@ public class EncryptKeyRef extends Expr {
             ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_DB_ERROR);
         } else {
             dbName = ClusterNamespace.getFullName(analyzer.getClusterName(), dbName);
-            Database database = analyzer.getCatalog().getDbOrAnalysisException(dbName);
+            Database database = analyzer.getCatalog().getInternalDataSource().getDbOrAnalysisException(dbName);
 
             EncryptKey encryptKey = database.getEncryptKey(encryptKeyName.getKeyName());
             if (encryptKey != null) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExportStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExportStmt.java
index b8f2c2c9be..a045512155 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExportStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExportStmt.java
@@ -190,7 +190,7 @@ public class ExportStmt extends StatementBase {
     }
 
     private void checkTable(Catalog catalog) throws AnalysisException {
-        Database db = catalog.getDbOrAnalysisException(tblName.getDb());
+        Database db = catalog.getInternalDataSource().getDbOrAnalysisException(tblName.getDb());
         Table table = db.getTableOrAnalysisException(tblName.getTbl());
         table.readLock();
         try {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FromClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FromClause.java
index dfb247a7c4..dfd40a1718 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FromClause.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FromClause.java
@@ -87,7 +87,7 @@ public class FromClause implements ParseNode, Iterable<TableRef> {
                 ErrorReport.reportAnalysisException(ErrorCode.ERR_NO_DB_ERROR);
             }
 
-            Database db = analyzer.getCatalog().getDbOrAnalysisException(dbName);
+            Database db = analyzer.getCatalog().getInternalDataSource().getDbOrAnalysisException(dbName);
             String tblName = tableName.getTbl();
             db.getTableOrAnalysisException(tblName);
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
index 26f55a321f..03c4cbe6af 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java
@@ -25,6 +25,7 @@ import org.apache.doris.catalog.AliasFunction;
 import org.apache.doris.catalog.ArrayType;
 import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Function;
 import org.apache.doris.catalog.FunctionSet;
 import org.apache.doris.catalog.ScalarFunction;
@@ -931,15 +932,16 @@ public class FunctionCallExpr extends Expr {
                     String dbName = fnName.analyzeDb(analyzer);
                     if (!Strings.isNullOrEmpty(dbName)) {
                         // check operation privilege
-                        if (!Catalog.getCurrentCatalog().getAuth().checkDbPriv(
-                                ConnectContext.get(), dbName, PrivPredicate.SELECT)) {
+                        if (!Catalog.getCurrentCatalog().getAuth()
+                                .checkDbPriv(ConnectContext.get(), dbName, PrivPredicate.SELECT)) {
                             ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, "SELECT");
                         }
-                        Database db = Catalog.getCurrentCatalog().getDbNullable(dbName);
-                        if (db != null) {
-                            Function searchDesc = new Function(
-                                    fnName, Arrays.asList(collectChildReturnTypes()), Type.INVALID, false);
-                            fn = db.getFunction(searchDesc, Function.CompareMode.IS_NONSTRICT_SUPERTYPE_OF);
+                        DatabaseIf db = Catalog.getCurrentCatalog().getCurrentDataSource().getDbNullable(dbName);
+                        if (db != null && (db instanceof Database)) {
+                            Function searchDesc =
+                                    new Function(fnName, Arrays.asList(collectChildReturnTypes()), Type.INVALID, false);
+                            fn = ((Database) db).getFunction(searchDesc,
+                                    Function.CompareMode.IS_NONSTRICT_SUPERTYPE_OF);
                         }
                     }
                 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/InsertStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/InsertStmt.java
index 62a8a9887e..f3b29b6398 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/InsertStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/InsertStmt.java
@@ -22,12 +22,14 @@ import org.apache.doris.catalog.BrokerTable;
 import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.MysqlTable;
 import org.apache.doris.catalog.OdbcTable;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.Partition;
 import org.apache.doris.catalog.PartitionType;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.ErrorCode;
@@ -188,7 +190,7 @@ public class InsertStmt extends DdlStmt {
         return tblName.getTbl();
     }
 
-    public void getTables(Analyzer analyzer, Map<Long, Table> tableMap, Set<String> parentViewNameSet)
+    public void getTables(Analyzer analyzer, Map<Long, TableIf> tableMap, Set<String> parentViewNameSet)
             throws AnalysisException {
         // get dbs of statement
         queryStmt.getTables(analyzer, tableMap, parentViewNameSet);
@@ -196,15 +198,15 @@ public class InsertStmt extends DdlStmt {
         String dbName = tblName.getDb();
         String tableName = tblName.getTbl();
         // check exist
-        Database db = analyzer.getCatalog().getDbOrAnalysisException(dbName);
-        Table table = db.getTableOrAnalysisException(tblName.getTbl());
+        DatabaseIf db = analyzer.getCatalog().getInternalDataSource().getDbOrAnalysisException(dbName);
+        TableIf table = db.getTableOrAnalysisException(tblName.getTbl());
 
         // check access
-        if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), dbName, tableName,
-                                                                PrivPredicate.LOAD)) {
+        if (!Catalog.getCurrentCatalog().getAuth()
+                .checkTblPriv(ConnectContext.get(), dbName, tableName, PrivPredicate.LOAD)) {
             ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "LOAD",
-                                                ConnectContext.get().getQualifiedUser(),
-                                                ConnectContext.get().getRemoteIP(), dbName + ": " + tableName);
+                    ConnectContext.get().getQualifiedUser(), ConnectContext.get().getRemoteIP(),
+                    dbName + ": " + tableName);
         }
 
         tableMap.put(table.getId(), table);
@@ -294,7 +296,7 @@ public class InsertStmt extends DdlStmt {
         // create data sink
         createDataSink();
 
-        db = analyzer.getCatalog().getDbOrAnalysisException(tblName.getDb());
+        db = analyzer.getCatalog().getInternalDataSource().getDbOrAnalysisException(tblName.getDb());
 
         // create label and begin transaction
         long timeoutSecond = ConnectContext.get().getSessionVariable().getQueryTimeoutS();
@@ -325,7 +327,8 @@ public class InsertStmt extends DdlStmt {
     private void analyzeTargetTable(Analyzer analyzer) throws AnalysisException {
         // Get table
         if (targetTable == null) {
-            targetTable = analyzer.getTableOrAnalysisException(tblName);
+            DatabaseIf db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(tblName.getDb());
+            targetTable = (Table) db.getTableOrAnalysisException(tblName.getTbl());
         }
 
         if (targetTable instanceof OlapTable) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/LoadStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/LoadStmt.java
index 469f4d4523..e5e4940b2e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LoadStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LoadStmt.java
@@ -335,7 +335,7 @@ public class LoadStmt extends DdlStmt {
             if (dataDescription.isLoadFromTable()) {
                 isLoadFromTable = true;
             }
-            Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(label.getDbName());
+            Database db = analyzer.getCatalog().getInternalDataSource().getDbOrAnalysisException(label.getDbName());
             OlapTable table = db.getOlapTableOrAnalysisException(dataDescription.getTableName());
             if (dataDescription.getMergeType() != LoadTask.MergeType.APPEND
                     && table.getKeysType() != KeysType.UNIQUE_KEYS) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/LockTablesStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/LockTablesStmt.java
index 924187ba90..1123af3839 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/LockTablesStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/LockTablesStmt.java
@@ -59,7 +59,7 @@ public class LockTablesStmt extends StatementBase {
             if (Strings.isNullOrEmpty(tableName)) {
                 ErrorReport.reportAnalysisException(ErrorCode.ERR_UNKNOWN_TABLE, tableName, dbName);
             }
-            Database db = analyzer.getCatalog().getDbOrAnalysisException(dbName);
+            Database db = analyzer.getCatalog().getInternalDataSource().getDbOrAnalysisException(dbName);
             db.getTableOrAnalysisException(tableName);
 
             // check auth
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java
index a32b93ac3c..d11f27d100 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/QueryStmt.java
@@ -20,7 +20,7 @@
 
 package org.apache.doris.analysis;
 
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.ErrorCode;
 import org.apache.doris.common.ErrorReport;
@@ -455,8 +455,8 @@ public abstract class QueryStmt extends StatementBase {
         return resultExprs.get((int) pos - 1).clone();
     }
 
-    public void getWithClauseTables(Analyzer analyzer, Map<Long, Table> tableMap,
-            Set<String> parentViewNameSet) throws AnalysisException {
+    public void getWithClauseTables(Analyzer analyzer, Map<Long, TableIf> tableMap, Set<String> parentViewNameSet)
+            throws AnalysisException {
         if (withClause != null) {
             withClause.getTables(analyzer, tableMap, parentViewNameSet);
         }
@@ -535,7 +535,7 @@ public abstract class QueryStmt extends StatementBase {
     // tmp in child stmt "(select siteid, citycode from tmp)" do not contain with_Clause
     // so need to check is view name by parentViewNameSet.
     // issue link: https://github.com/apache/doris/issues/4598
-    public abstract void getTables(Analyzer analyzer, Map<Long, Table> tables, Set<String> parentViewNameSet)
+    public abstract void getTables(Analyzer analyzer, Map<Long, TableIf> tables, Set<String> parentViewNameSet)
             throws AnalysisException;
 
     // get TableRefs in this query, including physical TableRefs of this statement and
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
index de397d8a28..d6f413e89e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
@@ -23,10 +23,10 @@ package org.apache.doris.analysis;
 import org.apache.doris.catalog.AggregateFunction;
 import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Column;
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.FunctionSet;
 import org.apache.doris.catalog.OlapTable;
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.catalog.View;
@@ -290,8 +290,8 @@ public class SelectStmt extends QueryStmt {
     }
 
     @Override
-    public void getTables(Analyzer analyzer, Map<Long, Table> tableMap,
-            Set<String> parentViewNameSet) throws AnalysisException {
+    public void getTables(Analyzer analyzer, Map<Long, TableIf> tableMap, Set<String> parentViewNameSet)
+            throws AnalysisException {
         getWithClauseTables(analyzer, tableMap, parentViewNameSet);
         for (TableRef tblRef : fromClause) {
             if (tblRef instanceof InlineViewRef) {
@@ -315,16 +315,14 @@ public class SelectStmt extends QueryStmt {
                 if (Strings.isNullOrEmpty(tableName)) {
                     ErrorReport.reportAnalysisException(ErrorCode.ERR_UNKNOWN_TABLE, tableName, dbName);
                 }
-                Database db = analyzer.getCatalog().getDbOrAnalysisException(dbName);
-                Table table = db.getTableOrAnalysisException(tableName);
+                DatabaseIf db = analyzer.getCatalog().getCurrentDataSource().getDbOrAnalysisException(dbName);
+                TableIf table = db.getTableOrAnalysisException(tableName);
 
                 // check auth
-                if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), dbName,
-                        tableName,
-                        PrivPredicate.SELECT)) {
+                if (!Catalog.getCurrentCatalog().getAuth()
+                        .checkTblPriv(ConnectContext.get(), dbName, tableName, PrivPredicate.SELECT)) {
                     ErrorReport.reportAnalysisException(ErrorCode.ERR_TABLEACCESS_DENIED_ERROR, "SELECT",
-                            ConnectContext.get().getQualifiedUser(),
-                            ConnectContext.get().getRemoteIP(),
+                            ConnectContext.get().getQualifiedUser(), ConnectContext.get().getRemoteIP(),
                             dbName + ": " + tableName);
                 }
                 tableMap.put(table.getId(), table);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SetOperationStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/SetOperationStmt.java
index 21968fd19c..9816c30bb2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SetOperationStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SetOperationStmt.java
@@ -17,7 +17,7 @@
 
 package org.apache.doris.analysis;
 
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.rewrite.ExprRewriter;
@@ -213,7 +213,7 @@ public class SetOperationStmt extends QueryStmt {
     }
 
     @Override
-    public void getTables(Analyzer analyzer, Map<Long, Table> tableMap, Set<String> parentViewNameSet)
+    public void getTables(Analyzer analyzer, Map<Long, TableIf> tableMap, Set<String> parentViewNameSet)
             throws AnalysisException {
         getWithClauseTables(analyzer, tableMap, parentViewNameSet);
         for (SetOperand op : operands) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAlterStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAlterStmt.java
index 1b4dc7f4ac..4bcb72d9d8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAlterStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowAlterStmt.java
@@ -18,7 +18,7 @@
 package org.apache.doris.analysis;
 
 import org.apache.doris.catalog.Column;
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.ScalarType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.cluster.ClusterNamespace;
@@ -189,9 +189,8 @@ public class ShowAlterStmt extends ShowStmt {
         }
     }
 
-
     public void handleShowAlterTable(Analyzer analyzer) throws UserException {
-        Database db = analyzer.getCatalog().getDbOrAnalysisException(dbName);
+        DatabaseIf db = analyzer.getCatalog().getInternalDataSource().getDbOrAnalysisException(dbName);
 
         // build proc path
         StringBuilder sb = new StringBuilder();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataStmt.java
index abfce939f3..dd6a2f02d0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowDataStmt.java
@@ -105,7 +105,7 @@ public class ShowDataStmt extends ShowStmt {
             dbName = ClusterNamespace.getFullName(getClusterName(), dbName);
         }
 
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbName);
 
         // order by
         if (orderByElements != null && !orderByElements.isEmpty()) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java
index 7b2bf92fa8..07a418a58e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowPartitionsStmt.java
@@ -108,7 +108,7 @@ public class ShowPartitionsStmt extends ShowStmt {
                                                 ConnectContext.get().getRemoteIP(),
                                                 dbName + ": " + tableName);
         }
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbName);
         Table table = db.getTableOrMetaException(tableName, Table.TableType.OLAP);
         table.readLock();
         try {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowViewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowViewStmt.java
index 9c7ea82381..14c677c90a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowViewStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ShowViewStmt.java
@@ -97,7 +97,7 @@ public class ShowViewStmt extends ShowStmt {
                     dbName + ": " + getTbl());
         }
 
-        Database database = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbName);
+        Database database = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbName);
         database.getOlapTableOrAnalysisException(tbl.getTbl());
         for (Table table : database.getViews()) {
             View view = (View) table;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java
index 66c864fb57..0bb58a4778 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java
@@ -1191,7 +1191,7 @@ public class StmtRewriter {
             if (dbName == null) {
                 dbName = analyzer.getDefaultDb();
             }
-            Database db = currentCatalog.getDbOrAnalysisException(dbName);
+            Database db = currentCatalog.getInternalDataSource().getDbOrAnalysisException(dbName);
             long dbId = db.getId();
             long tableId = table.getId();
             RowPolicy matchPolicy = currentCatalog.getPolicyMgr().getMatchTablePolicy(dbId, tableId, user);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/UpdateStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/UpdateStmt.java
index f19f73dda5..e86a76b215 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/UpdateStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/UpdateStmt.java
@@ -103,7 +103,7 @@ public class UpdateStmt extends DdlStmt {
         String targetTableName = tableName.getTbl();
         Preconditions.checkNotNull(dbName);
         Preconditions.checkNotNull(targetTableName);
-        Database database = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbName);
+        Database database = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbName);
         targetTable = database.getTableOrAnalysisException(tableName.getTbl());
         if (targetTable.getType() != Table.TableType.OLAP
                 || ((OlapTable) targetTable).getKeysType() != KeysType.UNIQUE_KEYS) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/WithClause.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/WithClause.java
index 98979fc028..e9e1e57d10 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/WithClause.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/WithClause.java
@@ -20,7 +20,7 @@
 
 package org.apache.doris.analysis;
 
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.View;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
@@ -113,8 +113,8 @@ public class WithClause implements ParseNode {
         }
     }
 
-    public void getTables(Analyzer analyzer, Map<Long, Table> tableMap,
-            Set<String> parentViewNameSet) throws AnalysisException {
+    public void getTables(Analyzer analyzer, Map<Long, TableIf> tableMap, Set<String> parentViewNameSet)
+            throws AnalysisException {
         for (View view : views) {
             QueryStmt stmt = view.getQueryStmt();
             parentViewNameSet.add(view.getName());
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 c529259fbc..28704a7bdd 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
@@ -245,7 +245,7 @@ public class BackupHandler extends MasterDaemon implements Writable {
 
         // check if db exist
         String dbName = stmt.getDbName();
-        Database db = catalog.getDbOrDdlException(dbName);
+        Database db = catalog.getInternalDataSource().getDbOrDdlException(dbName);
 
         // Try to get sequence lock.
         // We expect at most one operation on a repo at same time.
@@ -540,7 +540,7 @@ public class BackupHandler extends MasterDaemon implements Writable {
 
     public void cancel(CancelBackupStmt stmt) throws DdlException {
         String dbName = stmt.getDbName();
-        Database db = catalog.getDbOrDdlException(dbName);
+        Database db = catalog.getInternalDataSource().getDbOrDdlException(dbName);
 
         AbstractJob job = getCurrentJob(db.getId());
         if (job == null || (job instanceof BackupJob && stmt.isRestore())
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 da07f64342..5cc6c0aba4 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
@@ -345,7 +345,7 @@ public class BackupJob extends AbstractJob {
     }
 
     private void prepareAndSendSnapshotTask() {
-        Database db = catalog.getDbNullable(dbId);
+        Database db = catalog.getInternalDataSource().getDbNullable(dbId);
         if (db == null) {
             status = new Status(ErrCode.NOT_FOUND, "database " + dbId + " does not exist");
             return;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java b/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java
index 78148acc1f..dbdc3ad575 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/backup/RestoreJob.java
@@ -363,7 +363,7 @@ public class RestoreJob extends AbstractJob {
             return;
         }
 
-        Database db = catalog.getDbNullable(dbId);
+        Database db = catalog.getInternalDataSource().getDbNullable(dbId);
         if (db == null) {
             status = new Status(ErrCode.NOT_FOUND, "database " + dbId + " has been dropped");
             return;
@@ -418,7 +418,7 @@ public class RestoreJob extends AbstractJob {
      * 6. make snapshot for all replicas for incremental download later.
      */
     private void checkAndPrepareMeta() {
-        Database db = catalog.getDbNullable(dbId);
+        Database db = catalog.getInternalDataSource().getDbNullable(dbId);
         if (db == null) {
             status = new Status(ErrCode.NOT_FOUND, "database " + dbId + " does not exist");
             return;
@@ -1086,7 +1086,7 @@ public class RestoreJob extends AbstractJob {
     private void replayCheckAndPrepareMeta() {
         Database db;
         try {
-            db = catalog.getDbOrMetaException(dbId);
+            db = catalog.getInternalDataSource().getDbOrMetaException(dbId);
         } catch (MetaNotFoundException e) {
             LOG.warn("[INCONSISTENT META] replayCheckAndPrepareMeta failed", e);
             return;
@@ -1222,7 +1222,7 @@ public class RestoreJob extends AbstractJob {
         for (long dbId : dbToSnapshotInfos.keySet()) {
             List<SnapshotInfo> infos = dbToSnapshotInfos.get(dbId);
 
-            Database db = catalog.getDbNullable(dbId);
+            Database db = catalog.getInternalDataSource().getDbNullable(dbId);
             if (db == null) {
                 status = new Status(ErrCode.NOT_FOUND, "db " + dbId + " does not exist");
                 return;
@@ -1417,7 +1417,7 @@ public class RestoreJob extends AbstractJob {
     }
 
     private Status allTabletCommitted(boolean isReplay) {
-        Database db = catalog.getDbNullable(dbId);
+        Database db = catalog.getInternalDataSource().getDbNullable(dbId);
         if (db == null) {
             return new Status(ErrCode.NOT_FOUND, "database " + dbId + " does not exist");
         }
@@ -1587,7 +1587,7 @@ public class RestoreJob extends AbstractJob {
         }
 
         // clean restored objs
-        Database db = catalog.getDbNullable(dbId);
+        Database db = catalog.getInternalDataSource().getDbNullable(dbId);
         if (db != null) {
             // rollback table's state to NORMAL
             setTableStateToNormal(db);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java
index 4b8c6a14da..0095d6b11f 100755
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Catalog.java
@@ -115,6 +115,7 @@ import org.apache.doris.common.util.SmallFileMgr;
 import org.apache.doris.common.util.TimeUtils;
 import org.apache.doris.common.util.Util;
 import org.apache.doris.consistency.ConsistencyChecker;
+import org.apache.doris.datasource.DataSourceIf;
 import org.apache.doris.datasource.DataSourceMgr;
 import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.deploy.DeployManager;
@@ -249,7 +250,6 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
-import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ConcurrentHashMap;
@@ -258,7 +258,6 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.stream.Collectors;
-import javax.annotation.Nullable;
 
 public class Catalog {
     private static final Logger LOG = LogManager.getLogger(Catalog.class);
@@ -478,10 +477,20 @@ public class Catalog {
         return dataSourceMgr;
     }
 
+    public DataSourceIf getCurrentDataSource() {
+        // TODO: this should be got from connect context.
+        // Will be fixed later.
+        return dataSourceMgr.getInternalDataSource();
+    }
+
     public InternalDataSource getInternalDataSource() {
         return dataSourceMgr.getInternalDataSource();
     }
 
+    public static InternalDataSource getCurrentInternalCatalog() {
+        return getCurrentCatalog().getInternalDataSource();
+    }
+
     private static class SingletonHolder {
         private static final Catalog INSTANCE = new Catalog();
     }
@@ -2647,10 +2656,10 @@ public class Catalog {
         getInternalDataSource().replayRecoverPartition(info);
     }
 
-    public static void getDdlStmt(Table table, List<String> createTableStmt, List<String> addPartitionStmt,
-                                  List<String> createRollupStmt, boolean separatePartition, boolean hidePassword) {
-        getDdlStmt(null, null, table, createTableStmt, addPartitionStmt, createRollupStmt,
-                separatePartition, hidePassword, false);
+    public static void getDdlStmt(TableIf table, List<String> createTableStmt, List<String> addPartitionStmt,
+            List<String> createRollupStmt, boolean separatePartition, boolean hidePassword) {
+        getDdlStmt(null, null, table, createTableStmt, addPartitionStmt, createRollupStmt, separatePartition,
+                hidePassword, false);
     }
 
     /**
@@ -2658,9 +2667,9 @@ public class Catalog {
      *
      * @param getDdlForLike Get schema for 'create table like' or not. when true, without hidden columns.
      */
-    public static void getDdlStmt(DdlStmt ddlStmt, String dbName, Table table, List<String> createTableStmt,
-                                  List<String> addPartitionStmt, List<String> createRollupStmt,
-                                  boolean separatePartition, boolean hidePassword, boolean getDdlForLike) {
+    public static void getDdlStmt(DdlStmt ddlStmt, String dbName, TableIf table, List<String> createTableStmt,
+            List<String> addPartitionStmt, List<String> createRollupStmt, boolean separatePartition,
+            boolean hidePassword, boolean getDdlForLike) {
         StringBuilder sb = new StringBuilder();
 
         // 1. create table
@@ -3160,71 +3169,6 @@ public class Catalog {
         return token;
     }
 
-    @Nullable
-    public Database getDbNullable(String dbName) {
-        return (Database) getInternalDataSource().getDbNullable(dbName);
-    }
-
-    @Nullable
-    public Database getDbNullable(long dbId) {
-        return (Database) getInternalDataSource().getDbNullable(dbId);
-    }
-
-    public Optional<Database> getDb(String dbName) {
-        return Optional.ofNullable(getDbNullable(dbName));
-    }
-
-    public Optional<Database> getDb(long dbId) {
-        return Optional.ofNullable(getDbNullable(dbId));
-    }
-
-    public <E extends Exception> Database getDbOrException(
-            String dbName, java.util.function.Function<String, E> e) throws E {
-        Database db = getDbNullable(dbName);
-        if (db == null) {
-            throw e.apply(dbName);
-        }
-        return db;
-    }
-
-    public <E extends Exception> Database getDbOrException(long dbId, java.util.function.Function<Long, E> e) throws E {
-        Database db = getDbNullable(dbId);
-        if (db == null) {
-            throw e.apply(dbId);
-        }
-        return db;
-    }
-
-    public Database getDbOrMetaException(String dbName) throws MetaNotFoundException {
-        return getDbOrException(dbName,
-                s -> new MetaNotFoundException("unknown databases, dbName=" + s, ErrorCode.ERR_BAD_DB_ERROR));
-    }
-
-    public Database getDbOrMetaException(long dbId) throws MetaNotFoundException {
-        return getDbOrException(dbId,
-                s -> new MetaNotFoundException("unknown databases, dbId=" + s, ErrorCode.ERR_BAD_DB_ERROR));
-    }
-
-    public Database getDbOrDdlException(String dbName) throws DdlException {
-        return getDbOrException(dbName,
-                s -> new DdlException(ErrorCode.ERR_BAD_DB_ERROR.formatErrorMsg(s), ErrorCode.ERR_BAD_DB_ERROR));
-    }
-
-    public Database getDbOrDdlException(long dbId) throws DdlException {
-        return getDbOrException(dbId,
-                s -> new DdlException(ErrorCode.ERR_BAD_DB_ERROR.formatErrorMsg(s), ErrorCode.ERR_BAD_DB_ERROR));
-    }
-
-    public Database getDbOrAnalysisException(String dbName) throws AnalysisException {
-        return getDbOrException(dbName,
-                s -> new AnalysisException(ErrorCode.ERR_BAD_DB_ERROR.formatErrorMsg(s), ErrorCode.ERR_BAD_DB_ERROR));
-    }
-
-    public Database getDbOrAnalysisException(long dbId) throws AnalysisException {
-        return getDbOrException(dbId,
-                s -> new AnalysisException(ErrorCode.ERR_BAD_DB_ERROR.formatErrorMsg(s), ErrorCode.ERR_BAD_DB_ERROR));
-    }
-
     public EditLog getEditLog() {
         return editLog;
     }
@@ -3234,18 +3178,6 @@ public class Catalog {
         return idGenerator.getNextId();
     }
 
-    public List<String> getDbNames() {
-        return getInternalDataSource().getDbNames();
-    }
-
-    public List<String> getClusterDbNames(String clusterName) throws AnalysisException {
-        return getInternalDataSource().getClusterDbNames(clusterName);
-    }
-
-    public List<Long> getDbIds() {
-        return getInternalDataSource().getDbIds();
-    }
-
     public HashMap<Long, TStorageMedium> getPartitionIdToStorageMediumMap() {
         HashMap<Long, TStorageMedium> storageMediumMap = new HashMap<Long, TStorageMedium>();
 
@@ -3253,10 +3185,10 @@ public class Catalog {
         // dbId -> (tableId -> partitionId)
         HashMap<Long, Multimap<Long, Long>> changedPartitionsMap = new HashMap<Long, Multimap<Long, Long>>();
         long currentTimeMs = System.currentTimeMillis();
-        List<Long> dbIds = getDbIds();
+        List<Long> dbIds = getInternalDataSource().getDbIds();
 
         for (long dbId : dbIds) {
-            Database db = this.getDbNullable(dbId);
+            Database db = getInternalDataSource().getDbNullable(dbId);
             if (db == null) {
                 LOG.warn("db {} does not exist while doing backend report", dbId);
                 continue;
@@ -3299,7 +3231,7 @@ public class Catalog {
 
         // handle data property changed
         for (Long dbId : changedPartitionsMap.keySet()) {
-            Database db = getDbNullable(dbId);
+            Database db = getInternalDataSource().getDbNullable(dbId);
             if (db == null) {
                 LOG.warn("db {} does not exist while checking backend storage medium", dbId);
                 continue;
@@ -3307,7 +3239,7 @@ public class Catalog {
             Multimap<Long, Long> tableIdToPartitionIds = changedPartitionsMap.get(dbId);
 
             for (Long tableId : tableIdToPartitionIds.keySet()) {
-                Table table = db.getTableNullable(tableId);
+                TableIf table = db.getTableNullable(tableId);
                 if (table == null) {
                     continue;
                 }
@@ -3731,7 +3663,7 @@ public class Catalog {
         long tableId = tableInfo.getTableId();
         String newTableName = tableInfo.getNewTableName();
 
-        Database db = this.getDbOrMetaException(dbId);
+        Database db = getInternalDataSource().getDbOrMetaException(dbId);
         db.writeLock();
         try {
             Table table = db.getTableOrMetaException(tableId);
@@ -3845,7 +3777,7 @@ public class Catalog {
         long tableId = info.getTableId();
         Map<String, String> properties = info.getPropertyMap();
 
-        Database db = this.getDbOrMetaException(dbId);
+        Database db = getInternalDataSource().getDbOrMetaException(dbId);
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, TableType.OLAP);
         olapTable.writeLock();
         try {
@@ -3905,7 +3837,7 @@ public class Catalog {
         long indexId = tableInfo.getIndexId();
         String newRollupName = tableInfo.getNewRollupName();
 
-        Database db = this.getDbOrMetaException(dbId);
+        Database db = getInternalDataSource().getDbOrMetaException(dbId);
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, TableType.OLAP);
         olapTable.writeLock();
         try {
@@ -3967,7 +3899,7 @@ public class Catalog {
         long partitionId = tableInfo.getPartitionId();
         String newPartitionName = tableInfo.getNewPartitionName();
 
-        Database db = this.getDbOrMetaException(dbId);
+        Database db = getInternalDataSource().getDbOrMetaException(dbId);
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, TableType.OLAP);
         olapTable.writeLock();
         try {
@@ -4114,7 +4046,7 @@ public class Catalog {
         long tableId = info.getTableId();
         Map<String, String> properties = info.getProperties();
 
-        Database db = this.getDbOrMetaException(dbId);
+        Database db = getInternalDataSource().getDbOrMetaException(dbId);
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, TableType.OLAP);
         olapTable.writeLock();
         try {
@@ -4195,7 +4127,7 @@ public class Catalog {
         long tableId = info.getTableId();
         int bucketNum = info.getBucketNum();
 
-        Database db = this.getDbOrMetaException(dbId);
+        Database db = getInternalDataSource().getDbOrMetaException(dbId);
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, TableType.OLAP);
         olapTable.writeLock();
         try {
@@ -4233,7 +4165,7 @@ public class Catalog {
             ErrorReport.reportDdlException(ErrorCode.ERR_DBACCESS_DENIED_ERROR, ctx.getQualifiedUser(), qualifiedDb);
         }
 
-        this.getDbOrDdlException(qualifiedDb);
+        getInternalDataSource().getDbOrDdlException(qualifiedDb);
         ctx.setDatabase(qualifiedDb);
     }
 
@@ -4252,7 +4184,7 @@ public class Catalog {
         String tableName = stmt.getTable();
 
         // check if db exists
-        Database db = this.getDbOrDdlException(dbName);
+        Database db = getInternalDataSource().getDbOrDdlException(dbName);
 
         // check if table exists in db
         if (db.getTable(tableName).isPresent()) {
@@ -4278,7 +4210,7 @@ public class Catalog {
             throw new DdlException("failed to init view stmt", e);
         }
 
-        if (!db.createTableWithLock(newView, false, stmt.isSetIfNotExists()).first) {
+        if (!((Database) db).createTableWithLock(newView, false, stmt.isSetIfNotExists()).first) {
             throw new DdlException("Failed to create view[" + tableName + "].");
         }
         LOG.info("successfully create view[" + tableName + "-" + newView.getId() + "]");
@@ -4476,23 +4408,23 @@ public class Catalog {
     public String dumpImage() {
         LOG.info("begin to dump meta data");
         String dumpFilePath;
-        List<Database> databases = Lists.newArrayList();
-        List<List<Table>> tableLists = Lists.newArrayList();
+        List<DatabaseIf> databases = Lists.newArrayList();
+        List<List<TableIf>> tableLists = Lists.newArrayList();
         tryLock(true);
         try {
             // sort all dbs to avoid potential dead lock
-            for (long dbId : getDbIds()) {
-                Database db = this.getDbNullable(dbId);
+            for (long dbId : getInternalDataSource().getDbIds()) {
+                Database db = getInternalDataSource().getDbNullable(dbId);
                 databases.add(db);
             }
-            databases.sort(Comparator.comparing(Database::getId));
+            databases.sort(Comparator.comparing(DatabaseIf::getId));
 
             // lock all dbs
             MetaLockUtils.readLockDatabases(databases);
             LOG.info("acquired all the dbs' read lock.");
             // lock all tables
-            for (Database db : databases) {
-                List<Table> tableList = db.getTablesOnIdOrder();
+            for (DatabaseIf db : databases) {
+                List<TableIf> tableList = db.getTablesOnIdOrder();
                 MetaLockUtils.readLockTables(tableList);
                 tableLists.add(tableList);
             }
@@ -4544,25 +4476,25 @@ public class Catalog {
 
     public void createFunction(CreateFunctionStmt stmt) throws UserException {
         FunctionName name = stmt.getFunctionName();
-        Database db = this.getDbOrDdlException(name.getDb());
+        Database db = getInternalDataSource().getDbOrDdlException(name.getDb());
         db.addFunction(stmt.getFunction());
     }
 
     public void replayCreateFunction(Function function) throws MetaNotFoundException {
         String dbName = function.getFunctionName().getDb();
-        Database db = this.getDbOrMetaException(dbName);
+        Database db = getInternalDataSource().getDbOrMetaException(dbName);
         db.replayAddFunction(function);
     }
 
     public void dropFunction(DropFunctionStmt stmt) throws UserException {
         FunctionName name = stmt.getFunctionName();
-        Database db = this.getDbOrDdlException(name.getDb());
+        Database db = getInternalDataSource().getDbOrDdlException(name.getDb());
         db.dropFunction(stmt.getFunction());
     }
 
     public void replayDropFunction(FunctionSearchDesc functionSearchDesc) throws MetaNotFoundException {
         String dbName = functionSearchDesc.getName().getDb();
-        Database db = this.getDbOrMetaException(dbName);
+        Database db = getInternalDataSource().getDbOrMetaException(dbName);
         db.replayDropFunction(functionSearchDesc);
     }
 
@@ -4630,9 +4562,8 @@ public class Catalog {
         // but we need to get replica from db->tbl->partition->...
         List<ReplicaPersistInfo> replicaPersistInfos = backendTabletsInfo.getReplicaPersistInfos();
         for (ReplicaPersistInfo info : replicaPersistInfos) {
-            OlapTable olapTable = (OlapTable) this.getDb(info.getDbId())
-                    .flatMap(db -> db.getTable(info.getTableId()))
-                    .filter(t -> t.getType() == TableType.OLAP)
+            OlapTable olapTable = (OlapTable) getInternalDataSource().getDb(info.getDbId())
+                    .flatMap(db -> db.getTable(info.getTableId())).filter(t -> t.getType() == TableType.OLAP)
                     .orElse(null);
             if (olapTable == null) {
                 continue;
@@ -4680,7 +4611,7 @@ public class Catalog {
     }
 
     public void replayConvertDistributionType(TableInfo info) throws MetaNotFoundException {
-        Database db = this.getDbOrMetaException(info.getDbId());
+        Database db = getInternalDataSource().getDbOrMetaException(info.getDbId());
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(info.getTableId(), TableType.OLAP);
         olapTable.writeLock();
         try {
@@ -4726,7 +4657,7 @@ public class Catalog {
             throws MetaNotFoundException {
         long dbId = replaceTempPartitionLog.getDbId();
         long tableId = replaceTempPartitionLog.getTblId();
-        Database db = this.getDbOrMetaException(dbId);
+        Database db = getInternalDataSource().getDbOrMetaException(dbId);
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, TableType.OLAP);
         olapTable.writeLock();
         try {
@@ -4815,7 +4746,7 @@ public class Catalog {
             if (meta == null) {
                 throw new MetaNotFoundException("tablet does not exist");
             }
-            Database db = this.getDbOrMetaException(meta.getDbId());
+            Database db = getInternalDataSource().getDbOrMetaException(meta.getDbId());
             Table table = db.getTableOrMetaException(meta.getTableId());
             table.writeLockOrMetaException();
             try {
@@ -4939,8 +4870,7 @@ public class Catalog {
         String tableName = stmt.getTblName();
         String type = stmt.getCompactionType();
 
-
-        Database db = this.getDbOrDdlException(dbName);
+        Database db = getInternalDataSource().getDbOrDdlException(dbName);
         OlapTable olapTable = db.getOlapTableOrDdlException(tableName);
 
         AgentBatchTask batchTask = new AgentBatchTask();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/CatalogRecycleBin.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/CatalogRecycleBin.java
index 15d25ad153..f2656c07cf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/CatalogRecycleBin.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/CatalogRecycleBin.java
@@ -544,7 +544,7 @@ public class CatalogRecycleBin extends MasterDaemon implements Writable {
             // we need to get olap table to get schema hash info
             // first find it in catalog. if not found, it should be in recycle bin
             OlapTable olapTable = null;
-            Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
             if (db == null) {
                 // just log. db should be in recycle bin
                 if (!idToDatabase.containsKey(dbId)) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateTableIndex.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateTableIndex.java
index b77890b8e7..07847c6c5a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateTableIndex.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ColocateTableIndex.java
@@ -521,7 +521,7 @@ public class ColocateTableIndex implements Writable {
     }
 
     public void replayAddTableToGroup(ColocatePersistInfo info) throws MetaNotFoundException {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(info.getGroupId().dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(info.getGroupId().dbId);
         OlapTable tbl = (OlapTable) db.getTableOrMetaException(info.getTableId(),
                 org.apache.doris.catalog.Table.TableType.OLAP);
         writeLock();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/EncryptKeyHelper.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/EncryptKeyHelper.java
index 86b89ee412..0c4cecfda2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/EncryptKeyHelper.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/EncryptKeyHelper.java
@@ -32,25 +32,25 @@ public class EncryptKeyHelper {
 
     public static void createEncryptKey(CreateEncryptKeyStmt stmt) throws UserException {
         EncryptKeyName name = stmt.getEncryptKeyName();
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(name.getDb());
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(name.getDb());
         db.addEncryptKey(stmt.getEncryptKey());
     }
 
     public static void replayCreateEncryptKey(EncryptKey encryptKey) throws MetaNotFoundException {
         String dbName = encryptKey.getEncryptKeyName().getDb();
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbName);
         db.replayAddEncryptKey(encryptKey);
     }
 
     public static void dropEncryptKey(DropEncryptKeyStmt stmt) throws UserException {
         EncryptKeyName name = stmt.getEncryptKeyName();
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(name.getDb());
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(name.getDb());
         db.dropEncryptKey(stmt.getEncryptKeysSearchDesc());
     }
 
     public static void replayDropEncryptKey(EncryptKeySearchDesc encryptKeySearchDesc) throws MetaNotFoundException {
         String dbName = encryptKeySearchDesc.getKeyEncryptKeyName().getDb();
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbName);
         db.replayDropEncryptKey(encryptKeySearchDesc);
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/MetadataViewer.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/MetadataViewer.java
index f8babe93b9..56d6411f4a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/MetadataViewer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/MetadataViewer.java
@@ -51,7 +51,7 @@ public class MetadataViewer {
         Catalog catalog = Catalog.getCurrentCatalog();
         SystemInfoService infoService = Catalog.getCurrentSystemInfo();
 
-        Database db = catalog.getDbOrDdlException(dbName);
+        Database db = catalog.getInternalDataSource().getDbOrDdlException(dbName);
         OlapTable olapTable = db.getOlapTableOrDdlException(tblName);
 
         olapTable.readLock();
@@ -169,7 +169,7 @@ public class MetadataViewer {
         Catalog catalog = Catalog.getCurrentCatalog();
         SystemInfoService infoService = Catalog.getCurrentSystemInfo();
 
-        Database db = catalog.getDbOrDdlException(dbName);
+        Database db = catalog.getInternalDataSource().getDbOrDdlException(dbName);
         OlapTable olapTable = db.getOlapTableOrDdlException(tblName);
         olapTable.readLock();
         try {
@@ -267,7 +267,7 @@ public class MetadataViewer {
             throw new DdlException("Should specify one and only one partitions");
         }
 
-        Database db = catalog.getDbOrDdlException(dbName);
+        Database db = catalog.getInternalDataSource().getDbOrDdlException(dbName);
         OlapTable olapTable = db.getOlapTableOrDdlException(tblName);
 
         olapTable.readLock();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java
index a6bf673eb2..5b5ee2b7ca 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/RefreshManager.java
@@ -40,7 +40,7 @@ public class RefreshManager {
         Catalog catalog = Catalog.getCurrentCatalog();
 
         // 0. check table type
-        Database db = catalog.getDbOrDdlException(dbName);
+        Database db = catalog.getInternalDataSource().getDbOrDdlException(dbName);
         Table table = db.getTableNullable(tableName);
         if (!(table instanceof IcebergTable)) {
             throw new DdlException("Only support refresh Iceberg table.");
@@ -67,7 +67,7 @@ public class RefreshManager {
         String dbName = stmt.getDbName();
         Catalog catalog = Catalog.getCurrentCatalog();
 
-        Database db = catalog.getDbOrDdlException(dbName);
+        Database db = catalog.getInternalDataSource().getDbOrDdlException(dbName);
 
         // 0. build iceberg property
         // Since we have only persisted database properties with key-value format in DatabaseProperty,
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java
index 4284353faa..b31c9b5b9c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Table.java
@@ -239,6 +239,7 @@ public class Table extends MetaObject implements Writable, TableIf {
         return id;
     }
 
+    @Override
     public String getName() {
         return name;
     }
@@ -402,58 +403,22 @@ public class Table extends MetaObject implements Writable, TableIf {
         return null;
     }
 
+    @Override
     public String getEngine() {
-        switch (type) {
-            case MYSQL:
-                return "MySQL";
-            case ODBC:
-                return "Odbc";
-            case OLAP:
-                return "Doris";
-            case SCHEMA:
-                return "MEMORY";
-            case INLINE_VIEW:
-                return "InlineView";
-            case VIEW:
-                return "View";
-            case BROKER:
-                return "Broker";
-            case ELASTICSEARCH:
-                return "ElasticSearch";
-            case HIVE:
-                return "Hive";
-            case HUDI:
-                return "Hudi";
-            default:
-                return null;
-        }
+        return type.toEngineName();
     }
 
+    @Override
     public String getMysqlType() {
-        switch (type) {
-            case OLAP:
-                return "BASE TABLE";
-            case SCHEMA:
-                return "SYSTEM VIEW";
-            case INLINE_VIEW:
-            case VIEW:
-                return "VIEW";
-            case MYSQL:
-            case ODBC:
-            case BROKER:
-            case ELASTICSEARCH:
-            case HIVE:
-            case HUDI:
-                return "EXTERNAL TABLE";
-            default:
-                return null;
-        }
+        return type.toMysqlType();
     }
 
+    @Override
     public String getComment() {
         return getComment(false);
     }
 
+    @Override
     public String getComment(boolean escapeQuota) {
         if (!Strings.isNullOrEmpty(comment)) {
             if (!escapeQuota) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIf.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIf.java
index 01efa961ed..3802139839 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIf.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TableIf.java
@@ -88,20 +88,62 @@ public interface TableIf {
 
     long getAvgRowLength();
 
+    long getLastCheckTime();
+
+    String getComment(boolean escapeQuota);
+
     /**
      * Doris table type.
      */
     public enum TableType {
-        MYSQL,
-        ODBC,
-        OLAP,
-        SCHEMA,
-        INLINE_VIEW,
-        VIEW,
-        BROKER,
-        ELASTICSEARCH,
-        HIVE,
-        ICEBERG,
-        HUDI
+        MYSQL, ODBC, OLAP, SCHEMA, INLINE_VIEW, VIEW, BROKER, ELASTICSEARCH, HIVE, ICEBERG, HUDI;
+
+        public String toEngineName() {
+            switch (this) {
+                case MYSQL:
+                    return "MySQL";
+                case ODBC:
+                    return "Odbc";
+                case OLAP:
+                    return "Doris";
+                case SCHEMA:
+                    return "MEMORY";
+                case INLINE_VIEW:
+                    return "InlineView";
+                case VIEW:
+                    return "View";
+                case BROKER:
+                    return "Broker";
+                case ELASTICSEARCH:
+                    return "ElasticSearch";
+                case HIVE:
+                    return "Hive";
+                case HUDI:
+                    return "Hudi";
+                default:
+                    return null;
+            }
+        }
+
+        public String toMysqlType() {
+            switch (this) {
+                case OLAP:
+                    return "BASE TABLE";
+                case SCHEMA:
+                    return "SYSTEM VIEW";
+                case INLINE_VIEW:
+                case VIEW:
+                    return "VIEW";
+                case MYSQL:
+                case ODBC:
+                case BROKER:
+                case ELASTICSEARCH:
+                case HIVE:
+                case HUDI:
+                    return "EXTERNAL TABLE";
+                default:
+                    return null;
+            }
+        }
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletStatMgr.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletStatMgr.java
index 09d936d79b..7d497ba23d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletStatMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/TabletStatMgr.java
@@ -76,9 +76,9 @@ public class TabletStatMgr extends MasterDaemon {
 
         // after update replica in all backends, update index row num
         start = System.currentTimeMillis();
-        List<Long> dbIds = Catalog.getCurrentCatalog().getDbIds();
+        List<Long> dbIds = Catalog.getCurrentInternalCatalog().getDbIds();
         for (Long dbId : dbIds) {
-            Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
             if (db == null) {
                 continue;
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/external/ExternalTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/external/ExternalTable.java
index ab5a3fa6ef..a834e5508e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/external/ExternalTable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/external/ExternalTable.java
@@ -201,47 +201,53 @@ public class ExternalTable implements TableIf {
         throw new NotImplementedException();
     }
 
+    @Override
+    public String getEngine() {
+        return getType().toEngineName();
+    }
+
     @Override
     public String getMysqlType() {
-        throw new NotImplementedException();
+        return getType().toMysqlType();
     }
 
     @Override
-    public String getEngine() {
-        throw new NotImplementedException();
+    public long getRowCount() {
+        return 0;
     }
 
     @Override
-    public String getComment() {
-        throw new NotImplementedException();
+    public long getAvgRowLength() {
+        return 0;
     }
 
     @Override
-    public long getCreateTime() {
-        throw new NotImplementedException();
+    public long getDataLength() {
+        return 0;
     }
 
     @Override
-    public long getUpdateTime() {
-        throw new NotImplementedException();
+    public long getCreateTime() {
+        return 0;
     }
 
     @Override
-    public long getRowCount() {
-        throw new NotImplementedException();
+    public long getUpdateTime() {
+        return 0;
     }
 
     @Override
-    public long getDataLength() {
-        throw new NotImplementedException();
+    public long getLastCheckTime() {
+        return 0;
     }
 
     @Override
-    public long getAvgRowLength() {
-        throw new NotImplementedException();
+    public String getComment() {
+        return "";
     }
 
-    public long getLastCheckTime() {
-        throw new NotImplementedException();
+    @Override
+    public String getComment(boolean escapeQuota) {
+        return "";
     }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/clone/ColocateTableCheckerAndBalancer.java b/fe/fe-core/src/main/java/org/apache/doris/clone/ColocateTableCheckerAndBalancer.java
index 240c02ad56..2904a9efc2 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/clone/ColocateTableCheckerAndBalancer.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/clone/ColocateTableCheckerAndBalancer.java
@@ -146,7 +146,7 @@ public class ColocateTableCheckerAndBalancer extends MasterDaemon {
         // get all groups
         Set<GroupId> groupIds = colocateIndex.getAllGroupIds();
         for (GroupId groupId : groupIds) {
-            Database db = catalog.getDbNullable(groupId.dbId);
+            Database db = catalog.getInternalDataSource().getDbNullable(groupId.dbId);
             if (db == null) {
                 continue;
             }
@@ -214,7 +214,7 @@ public class ColocateTableCheckerAndBalancer extends MasterDaemon {
         Set<GroupId> groupIds = colocateIndex.getAllGroupIds();
         for (GroupId groupId : groupIds) {
             List<Long> tableIds = colocateIndex.getAllTableIds(groupId);
-            Database db = catalog.getDbNullable(groupId.dbId);
+            Database db = catalog.getInternalDataSource().getDbNullable(groupId.dbId);
             if (db == null) {
                 continue;
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java b/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
index 3a6c2fd508..b240578041 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/clone/DynamicPartitionScheduler.java
@@ -383,7 +383,7 @@ public class DynamicPartitionScheduler extends MasterDaemon {
             Pair<Long, Long> tableInfo = iterator.next();
             Long dbId = tableInfo.first;
             Long tableId = tableInfo.second;
-            Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
             if (db == null) {
                 iterator.remove();
                 continue;
@@ -494,8 +494,8 @@ public class DynamicPartitionScheduler extends MasterDaemon {
     }
 
     private void initDynamicPartitionTable() {
-        for (Long dbId : Catalog.getCurrentCatalog().getDbIds()) {
-            Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        for (Long dbId : Catalog.getCurrentCatalog().getInternalDataSource().getDbIds()) {
+            Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
             if (db == null) {
                 continue;
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletChecker.java b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletChecker.java
index 6bb75a8333..ad4a08ab3d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletChecker.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletChecker.java
@@ -241,7 +241,7 @@ public class TabletChecker extends MasterDaemon {
 
         OUT:
         for (long dbId : copiedPrios.rowKeySet()) {
-            Database db = catalog.getDbNullable(dbId);
+            Database db = catalog.getInternalDataSource().getDbNullable(dbId);
             if (db == null) {
                 continue;
             }
@@ -273,10 +273,10 @@ public class TabletChecker extends MasterDaemon {
         }
 
         // 2. Traverse other partitions not in "prios"
-        List<Long> dbIds = catalog.getDbIds();
+        List<Long> dbIds = catalog.getInternalDataSource().getDbIds();
         OUT:
         for (Long dbId : dbIds) {
-            Database db = catalog.getDbNullable(dbId);
+            Database db = catalog.getInternalDataSource().getDbNullable(dbId);
             if (db == null) {
                 continue;
             }
@@ -435,7 +435,7 @@ public class TabletChecker extends MasterDaemon {
         while (iter.hasNext()) {
             Map.Entry<Long, Map<Long, Set<PrioPart>>> dbEntry = iter.next();
             long dbId = dbEntry.getKey();
-            Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
             if (db == null) {
                 iter.remove();
                 continue;
@@ -528,7 +528,7 @@ public class TabletChecker extends MasterDaemon {
     public static RepairTabletInfo getRepairTabletInfo(String dbName, String tblName,
             List<String> partitions) throws DdlException {
         Catalog catalog = Catalog.getCurrentCatalog();
-        Database db = catalog.getDbOrDdlException(dbName);
+        Database db = catalog.getInternalDataSource().getDbOrDdlException(dbName);
 
         long dbId = db.getId();
         long tblId = -1;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletSchedCtx.java b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletSchedCtx.java
index ef9c3dda0e..78b39056f0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletSchedCtx.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletSchedCtx.java
@@ -743,7 +743,7 @@ public class TabletSchedCtx implements Comparable<TabletSchedCtx> {
             AgentTaskQueue.removeTask(cloneTask.getBackendId(), TTaskType.CLONE, cloneTask.getSignature());
 
             // clear all CLONE replicas
-            Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
             if (db != null) {
                 Table table = db.getTableNullable(tblId);
                 if (table != null && table.writeLockIfExist()) {
@@ -924,7 +924,7 @@ public class TabletSchedCtx implements Comparable<TabletSchedCtx> {
         }
 
         // 1. check the tablet status first
-        Database db = Catalog.getCurrentCatalog().getDbOrException(dbId,
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrException(dbId,
                 s -> new SchedException(Status.UNRECOVERABLE, "db " + dbId + " does not exist"));
         OlapTable olapTable = (OlapTable) db.getTableOrException(tblId,
                 s -> new SchedException(Status.UNRECOVERABLE, "tbl " + tabletId + " does not exist"));
diff --git a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletScheduler.java b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletScheduler.java
index 8e35c5fa23..058f1a20da 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/clone/TabletScheduler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/clone/TabletScheduler.java
@@ -487,7 +487,7 @@ public class TabletScheduler extends MasterDaemon {
         stat.counterTabletScheduled.incrementAndGet();
 
         Pair<TabletStatus, TabletSchedCtx.Priority> statusPair;
-        Database db = Catalog.getCurrentCatalog().getDbOrException(tabletCtx.getDbId(),
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrException(tabletCtx.getDbId(),
                 s -> new SchedException(Status.UNRECOVERABLE, "db " + tabletCtx.getDbId() + " does not exist"));
         OlapTable tbl = (OlapTable) db.getTableOrException(tabletCtx.getTblId(),
                 s -> new SchedException(Status.UNRECOVERABLE, "tbl " + tabletCtx.getTblId() + " does not exist"));
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/DbsProcDir.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/DbsProcDir.java
index 08419d4f46..ec08a50695 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/DbsProcDir.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/DbsProcDir.java
@@ -19,7 +19,9 @@ package org.apache.doris.common.proc;
 
 import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.common.AnalysisException;
+import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.Pair;
 import org.apache.doris.common.util.DebugUtil;
 import org.apache.doris.common.util.ListComparator;
@@ -51,7 +53,6 @@ public class DbsProcDir implements ProcDirInterface {
 
     @Override
     public boolean register(String name, ProcNodeInterface node) {
-        // 不支持静态注册,全部都是动态的查看
         return false;
     }
 
@@ -68,7 +69,10 @@ public class DbsProcDir implements ProcDirInterface {
             throw new AnalysisException("Invalid db id format: " + dbIdStr);
         }
 
-        Database db = catalog.getDbOrAnalysisException(dbId);
+        DatabaseIf db = catalog.getInternalDataSource().getDbNullable(dbId);
+        if (db == null) {
+            throw new AnalysisException("Database " + dbId + " does not exist");
+        }
 
         return new TablesProcDir(db);
     }
@@ -79,7 +83,7 @@ public class DbsProcDir implements ProcDirInterface {
         BaseProcResult result = new BaseProcResult();
         result.setNames(TITLE_NAMES);
 
-        List<String> dbNames = catalog.getDbNames();
+        List<String> dbNames = catalog.getInternalDataSource().getDbNames();
         if (dbNames == null || dbNames.isEmpty()) {
             // empty
             return result;
@@ -88,7 +92,7 @@ public class DbsProcDir implements ProcDirInterface {
         // get info
         List<List<Comparable>> dbInfos = new ArrayList<List<Comparable>>();
         for (String dbName : dbNames) {
-            Database db = catalog.getDbNullable(dbName);
+            DatabaseIf db = catalog.getInternalDataSource().getDbNullable(dbName);
             if (db == null) {
                 continue;
             }
@@ -100,15 +104,19 @@ public class DbsProcDir implements ProcDirInterface {
                 dbInfo.add(dbName);
                 dbInfo.add(tableNum);
 
-                long dataQuota = db.getDataQuota();
-                Pair<Double, String> quotaUnitPair = DebugUtil.getByteUint(dataQuota);
-                String readableQuota = DebugUtil.DECIMAL_FORMAT_SCALE_3.format(quotaUnitPair.first) + " "
-                        + quotaUnitPair.second;
+                String readableQuota = FeConstants.null_string;
+                String lastCheckTime = FeConstants.null_string;
+                long replicaQuota = 0;
+                if (db instanceof Database) {
+                    long dataQuota = ((Database) db).getDataQuota();
+                    Pair<Double, String> quotaUnitPair = DebugUtil.getByteUint(dataQuota);
+                    readableQuota =
+                            DebugUtil.DECIMAL_FORMAT_SCALE_3.format(quotaUnitPair.first) + " " + quotaUnitPair.second;
+                    lastCheckTime = TimeUtils.longToTimeString(((Database) db).getLastCheckTime());
+                    replicaQuota = ((Database) db).getReplicaQuota();
+                }
                 dbInfo.add(readableQuota);
-
-                dbInfo.add(TimeUtils.longToTimeString(db.getLastCheckTime()));
-
-                long replicaQuota = db.getReplicaQuota();
+                dbInfo.add(lastCheckTime);
                 dbInfo.add(replicaQuota);
 
             } finally {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/IncompleteTabletsProcNode.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/IncompleteTabletsProcNode.java
index 5dbe2d7cc7..1bd1e10ed8 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/IncompleteTabletsProcNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/IncompleteTabletsProcNode.java
@@ -17,7 +17,8 @@
 
 package org.apache.doris.common.proc;
 
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.AnalysisException;
 
 import com.google.common.base.Joiner;
@@ -36,9 +37,9 @@ public class IncompleteTabletsProcNode implements ProcNodeInterface {
             .build();
     private static final Joiner JOINER = Joiner.on(",");
 
-    final Database db;
+    final DatabaseIf<TableIf> db;
 
-    public IncompleteTabletsProcNode(Database db) {
+    public IncompleteTabletsProcNode(DatabaseIf db) {
         this.db = db;
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/IndexInfoProcDir.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/IndexInfoProcDir.java
index 56c3dc7b26..6ab28a094b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/IndexInfoProcDir.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/IndexInfoProcDir.java
@@ -18,10 +18,10 @@
 package org.apache.doris.common.proc;
 
 import org.apache.doris.catalog.Column;
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.MaterializedIndexMeta;
 import org.apache.doris.catalog.OlapTable;
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.AnalysisException;
 
@@ -38,15 +38,14 @@ import java.util.Set;
  * show indexNames(to schema)
  */
 public class IndexInfoProcDir implements ProcDirInterface {
-    public static final ImmutableList<String> TITLE_NAMES = new ImmutableList.Builder<String>()
-            .add("IndexId").add("IndexName").add("SchemaVersion").add("SchemaHash")
-            .add("ShortKeyColumnCount").add("StorageType").add("Keys")
-            .build();
+    public static final ImmutableList<String> TITLE_NAMES =
+            new ImmutableList.Builder<String>().add("IndexId").add("IndexName").add("SchemaVersion").add("SchemaHash")
+                    .add("ShortKeyColumnCount").add("StorageType").add("Keys").build();
 
-    private Database db;
-    private Table table;
+    private DatabaseIf db;
+    private TableIf table;
 
-    public IndexInfoProcDir(Database db, Table table) {
+    public IndexInfoProcDir(DatabaseIf db, TableIf table) {
         this.db = db;
         this.table = table;
     }
@@ -137,5 +136,4 @@ public class IndexInfoProcDir implements ProcDirInterface {
             table.readUnlock();
         }
     }
-
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/JobsDbProcDir.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/JobsDbProcDir.java
index ba1dc88ba1..a318b53a5b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/JobsDbProcDir.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/JobsDbProcDir.java
@@ -60,7 +60,7 @@ public class JobsDbProcDir implements ProcDirInterface {
             throw new AnalysisException("Invalid db id format: " + dbIdStr);
         }
 
-        Database db = catalog.getDbOrAnalysisException(dbId);
+        Database db = catalog.getInternalDataSource().getDbOrAnalysisException(dbId);
 
         return new JobsProcDir(catalog, db);
     }
@@ -72,13 +72,14 @@ public class JobsDbProcDir implements ProcDirInterface {
         BaseProcResult result = new BaseProcResult();
 
         result.setNames(TITLE_NAMES);
-        List<String> names = catalog.getDbNames();
+        List<String> names = catalog.getInternalDataSource().getDbNames();
         if (names == null || names.isEmpty()) {
             return result;
         }
 
         for (String name : names) {
-            catalog.getDb(name).ifPresent(db -> result.addRow(Lists.newArrayList(String.valueOf(db.getId()), name)));
+            catalog.getInternalDataSource().getDb(name)
+                    .ifPresent(db -> result.addRow(Lists.newArrayList(String.valueOf(db.getId()), name)));
         }
 
         return result;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/StatisticProcNode.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/StatisticProcNode.java
index a585a29f76..7e7189ae7f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/StatisticProcNode.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/StatisticProcNode.java
@@ -18,11 +18,12 @@
 package org.apache.doris.common.proc;
 
 import org.apache.doris.catalog.Catalog;
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.MaterializedIndex;
 import org.apache.doris.catalog.MaterializedIndex.IndexExtState;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.Partition;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Tablet;
 import org.apache.doris.common.AnalysisException;
@@ -51,13 +52,13 @@ public class StatisticProcNode implements ProcNodeInterface {
 
     @Override
     public ProcResult fetchResult() throws AnalysisException {
-        List<DBStatistic> statistics = catalog.getDbIds().parallelStream()
+        List<DBStatistic> statistics = catalog.getDataSourceMgr().getDbIds().parallelStream()
                 // skip information_schema database
-                .flatMap(id -> Stream.of(id == 0 ? null : catalog.getDbNullable(id)))
-                .filter(Objects::nonNull).map(DBStatistic::new)
+                .flatMap(id -> Stream.of(id == 0 ? null : catalog.getDataSourceMgr().getDbNullable(id)))
+                .filter(Objects::nonNull)
+                .map(DBStatistic::new)
                 // sort by dbName
-                .sorted(Comparator.comparing(db -> db.db.getFullName()))
-                .collect(Collectors.toList());
+                .sorted(Comparator.comparing(db -> db.db.getFullName())).collect(Collectors.toList());
 
         List<List<String>> rows = new ArrayList<>(statistics.size() + 1);
         for (DBStatistic statistic : statistics) {
@@ -70,7 +71,7 @@ public class StatisticProcNode implements ProcNodeInterface {
 
     static class DBStatistic {
         boolean summary;
-        Database db;
+        DatabaseIf<TableIf> db;
         int dbNum;
         int tableNum;
         int partitionNum;
@@ -82,32 +83,34 @@ public class StatisticProcNode implements ProcNodeInterface {
             this.summary = true;
         }
 
-        DBStatistic(Database db) {
+        DBStatistic(DatabaseIf db) {
             Preconditions.checkNotNull(db);
             this.summary = false;
             this.db = db;
             this.dbNum = 1;
 
-            db.getTables().stream().filter(t -> t != null && t.getType() == TableType.OLAP).forEach(t -> {
+            this.db.getTables().stream().filter(t -> t != null).forEach(t -> {
                 ++tableNum;
-                OlapTable olapTable = (OlapTable) t;
-                olapTable.readLock();
-                try {
-                    for (Partition partition : olapTable.getAllPartitions()) {
-                        ++partitionNum;
-                        for (MaterializedIndex materializedIndex
-                                : partition.getMaterializedIndices(IndexExtState.VISIBLE)) {
-                            ++indexNum;
-                            List<Tablet> tablets = materializedIndex.getTablets();
-                            for (int i = 0; i < tablets.size(); ++i) {
-                                Tablet tablet = tablets.get(i);
-                                ++tabletNum;
-                                replicaNum += tablet.getReplicas().size();
-                            } // end for tablets
-                        } // end for indices
-                    } // end for partitions
-                } finally {
-                    olapTable.readUnlock();
+                if (t.getType() == TableType.OLAP) {
+                    OlapTable olapTable = (OlapTable) t;
+                    olapTable.readLock();
+                    try {
+                        for (Partition partition : olapTable.getAllPartitions()) {
+                            ++partitionNum;
+                            for (MaterializedIndex materializedIndex : partition.getMaterializedIndices(
+                                    IndexExtState.VISIBLE)) {
+                                ++indexNum;
+                                List<Tablet> tablets = materializedIndex.getTablets();
+                                for (int i = 0; i < tablets.size(); ++i) {
+                                    Tablet tablet = tablets.get(i);
+                                    ++tabletNum;
+                                    replicaNum += tablet.getReplicas().size();
+                                } // end for tablets
+                            } // end for indices
+                        } // end for partitions
+                    } finally {
+                        olapTable.readUnlock();
+                    }
                 }
             });
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/TableProcDir.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/TableProcDir.java
index f8cb5770cd..9ce12e9ab4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/TableProcDir.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/TableProcDir.java
@@ -18,9 +18,10 @@
 package org.apache.doris.common.proc;
 
 import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.EsTable;
 import org.apache.doris.catalog.OlapTable;
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.AnalysisException;
 
@@ -34,24 +35,19 @@ import com.google.common.collect.Lists;
  * show choice to schema or to partitions
  */
 public class TableProcDir implements ProcDirInterface {
-    public static final ImmutableList<String> TITLE_NAMES = new ImmutableList.Builder<String>()
-            .add("Nodes")
-            .build();
+    public static final ImmutableList<String> TITLE_NAMES = new ImmutableList.Builder<String>().add("Nodes").build();
 
     public static final String INDEX_SCHEMA = "index_schema";
     private static final String PARTITIONS = "partitions";
     private static final String TEMP_PARTITIONS = "temp_partitions";
 
-    private static final ImmutableList<String> CHILDREN_NODES = new ImmutableList.Builder<String>()
-            .add(PARTITIONS)
-            .add(TEMP_PARTITIONS)
-            .add(INDEX_SCHEMA)
-            .build();
+    private static final ImmutableList<String> CHILDREN_NODES =
+            new ImmutableList.Builder<String>().add(PARTITIONS).add(TEMP_PARTITIONS).add(INDEX_SCHEMA).build();
 
-    private Database db;
-    private Table table;
+    private DatabaseIf db;
+    private TableIf table;
 
-    public TableProcDir(Database db, Table table) {
+    public TableProcDir(DatabaseIf db, TableIf table) {
         this.db = db;
         this.table = table;
     }
@@ -83,15 +79,15 @@ public class TableProcDir implements ProcDirInterface {
 
         if (entryName.equals(PARTITIONS)) {
             if (table.getType() == TableType.OLAP) {
-                return new PartitionsProcDir(db, (OlapTable) table, false);
+                return new PartitionsProcDir((Database) db, (OlapTable) table, false);
             } else if (table.getType() == TableType.ELASTICSEARCH) {
-                return new EsPartitionsProcDir(db, (EsTable) table);
+                return new EsPartitionsProcDir((Database) db, (EsTable) table);
             } else {
                 throw new AnalysisException("Table[" + table.getName() + "] is not a OLAP or ELASTICSEARCH table");
             }
         } else if (entryName.equals(TEMP_PARTITIONS)) {
             if (table.getType() == TableType.OLAP) {
-                return new PartitionsProcDir(db, (OlapTable) table, true);
+                return new PartitionsProcDir((Database) db, (OlapTable) table, true);
             } else {
                 throw new AnalysisException("Table[" + table.getName() + "] does not have temp partitions");
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/TablesProcDir.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/TablesProcDir.java
index 53d02ea320..3b43ec8871 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/TablesProcDir.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/TablesProcDir.java
@@ -18,11 +18,11 @@
 package org.apache.doris.common.proc;
 
 import org.apache.doris.catalog.Column;
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.PartitionType;
 import org.apache.doris.catalog.RangePartitionInfo;
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FeConstants;
@@ -47,9 +47,9 @@ public class TablesProcDir implements ProcDirInterface {
             .add("PartitionNum").add("State").add("Type").add("LastConsistencyCheckTime").add("ReplicaCount")
             .build();
 
-    private Database db;
+    private DatabaseIf db;
 
-    public TablesProcDir(Database db) {
+    public TablesProcDir(DatabaseIf db) {
         this.db = db;
     }
 
@@ -72,8 +72,7 @@ public class TablesProcDir implements ProcDirInterface {
             throw new AnalysisException("Invalid table id format: " + tableIdStr);
         }
 
-        Table table = db.getTableOrAnalysisException(tableId);
-
+        TableIf table = db.getTableOrAnalysisException(tableId);
         return new TableProcDir(db, table);
     }
 
@@ -83,8 +82,8 @@ public class TablesProcDir implements ProcDirInterface {
 
         // get info
         List<List<Comparable>> tableInfos = new ArrayList<List<Comparable>>();
-        List<Table> tableList = db.getTables();
-        for (Table table : tableList) {
+        List<TableIf> tableList = db.getTables();
+        for (TableIf table : tableList) {
             List<Comparable> tableInfo = new ArrayList<Comparable>();
             int partitionNum = 1;
             long replicaCount = 0;
@@ -114,6 +113,9 @@ public class TablesProcDir implements ProcDirInterface {
                     tableInfo.add(partitionNum);
                     tableInfo.add(olapTable.getState());
                     tableInfo.add(table.getType());
+                    // last check time
+                    tableInfo.add(TimeUtils.longToTimeString(olapTable.getLastCheckTime()));
+                    tableInfo.add(replicaCount);
                 } else {
                     tableInfo.add(table.getId());
                     tableInfo.add(table.getName());
@@ -122,11 +124,12 @@ public class TablesProcDir implements ProcDirInterface {
                     tableInfo.add(partitionNum);
                     tableInfo.add(FeConstants.null_string);
                     tableInfo.add(table.getType());
+                    // last check time
+                    tableInfo.add(FeConstants.null_string);
+                    tableInfo.add(replicaCount);
                 }
 
-                // last check time
-                tableInfo.add(TimeUtils.longToTimeString(table.getLastCheckTime()));
-                tableInfo.add(replicaCount);
+
                 tableInfos.add(tableInfo);
             } finally {
                 table.readUnlock();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/proc/TabletHealthProcDir.java b/fe/fe-core/src/main/java/org/apache/doris/common/proc/TabletHealthProcDir.java
index bf847c84af..c88377924b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/proc/TabletHealthProcDir.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/proc/TabletHealthProcDir.java
@@ -19,13 +19,14 @@ package org.apache.doris.common.proc;
 
 import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.ColocateTableIndex;
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.MaterializedIndex;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.Partition;
 import org.apache.doris.catalog.Replica;
 import org.apache.doris.catalog.ReplicaAllocation;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.Tablet;
 import org.apache.doris.clone.TabletSchedCtx;
 import org.apache.doris.common.AnalysisException;
@@ -78,7 +79,7 @@ public class TabletHealthProcDir implements ProcDirInterface {
     public ProcNodeInterface lookup(String dbIdStr) throws AnalysisException {
         try {
             long dbId = Long.parseLong(dbIdStr);
-            return catalog.getDb(dbId).map(IncompleteTabletsProcNode::new).orElse(null);
+            return catalog.getInternalDataSource().getDb(dbId).map(IncompleteTabletsProcNode::new).orElse(null);
         } catch (NumberFormatException e) {
             throw new AnalysisException("Invalid db id format: " + dbIdStr);
         }
@@ -86,13 +87,12 @@ public class TabletHealthProcDir implements ProcDirInterface {
 
     @Override
     public ProcResult fetchResult() throws AnalysisException {
-        List<DBTabletStatistic> statistics = catalog.getDbIds().parallelStream()
+        List<DBTabletStatistic> statistics = catalog.getInternalDataSource().getDbIds().parallelStream()
                 // skip information_schema database
-                .flatMap(id -> Stream.of(id == 0 ? null : catalog.getDbNullable(id)))
+                .flatMap(id -> Stream.of(id == 0 ? null : catalog.getInternalDataSource().getDbNullable(id)))
                 .filter(Objects::nonNull).map(DBTabletStatistic::new)
                 // sort by dbName
-                .sorted(Comparator.comparing(db -> db.db.getFullName()))
-                .collect(Collectors.toList());
+                .sorted(Comparator.comparing(db -> db.db.getFullName())).collect(Collectors.toList());
 
         List<List<String>> rows = new ArrayList<>(statistics.size() + 1);
         for (DBTabletStatistic statistic : statistics) {
@@ -104,7 +104,7 @@ public class TabletHealthProcDir implements ProcDirInterface {
 
     static class DBTabletStatistic {
         boolean summary;
-        Database db;
+        DatabaseIf<TableIf> db;
         int dbNum;
         int tabletNum;
         int healthyNum;
@@ -144,7 +144,7 @@ public class TabletHealthProcDir implements ProcDirInterface {
             this.summary = true;
         }
 
-        DBTabletStatistic(Database db) {
+        DBTabletStatistic(DatabaseIf db) {
             Preconditions.checkNotNull(db);
             this.summary = false;
             this.db = db;
@@ -167,11 +167,11 @@ public class TabletHealthProcDir implements ProcDirInterface {
 
             SystemInfoService infoService = Catalog.getCurrentSystemInfo();
             ColocateTableIndex colocateTableIndex = Catalog.getCurrentColocateIndex();
-            List<Long> aliveBeIdsInCluster = infoService.getClusterBackendIds(db.getClusterName(), true);
+            List<Long> aliveBeIdsInCluster = infoService.getClusterBackendIds(SystemInfoService.DEFAULT_CLUSTER, true);
             this.cloningTabletIds = AgentTaskQueue.getTask(db.getId(), TTaskType.CLONE)
                     .stream().map(AgentTask::getTabletId).collect(Collectors.toSet());
             this.cloningNum = cloningTabletIds.size();
-            db.getTables().stream().filter(t -> t != null && t.getType() == Table.TableType.OLAP).forEach(t -> {
+            this.db.getTables().stream().filter(t -> t != null && t.getType() == Table.TableType.OLAP).forEach(t -> {
                 OlapTable olapTable = (OlapTable) t;
                 ColocateTableIndex.GroupId groupId = colocateTableIndex.isColocateTable(olapTable.getId())
                         ? colocateTableIndex.getGroup(olapTable.getId()) : null;
@@ -180,8 +180,8 @@ public class TabletHealthProcDir implements ProcDirInterface {
                     for (Partition partition : olapTable.getAllPartitions()) {
                         ReplicaAllocation replicaAlloc = olapTable.getPartitionInfo()
                                 .getReplicaAllocation(partition.getId());
-                        for (MaterializedIndex materializedIndex : partition
-                                .getMaterializedIndices(MaterializedIndex.IndexExtState.VISIBLE)) {
+                        for (MaterializedIndex materializedIndex : partition.getMaterializedIndices(
+                                MaterializedIndex.IndexExtState.VISIBLE)) {
                             List<Tablet> tablets = materializedIndex.getTablets();
                             for (int i = 0; i < tablets.size(); ++i) {
                                 Tablet tablet = tablets.get(i);
@@ -189,12 +189,13 @@ public class TabletHealthProcDir implements ProcDirInterface {
                                 Tablet.TabletStatus res = null;
                                 if (groupId != null) {
                                     Set<Long> backendsSet = colocateTableIndex.getTabletBackendsByGroup(groupId, i);
-                                    res = tablet.getColocateHealthStatus(
-                                            partition.getVisibleVersion(), replicaAlloc, backendsSet);
+                                    res = tablet.getColocateHealthStatus(partition.getVisibleVersion(), replicaAlloc,
+                                            backendsSet);
                                 } else {
-                                    Pair<Tablet.TabletStatus, TabletSchedCtx.Priority> pair
-                                            = tablet.getHealthStatusWithPriority(infoService, db.getClusterName(),
-                                            partition.getVisibleVersion(), replicaAlloc, aliveBeIdsInCluster);
+                                    Pair<Tablet.TabletStatus, TabletSchedCtx.Priority> pair =
+                                            tablet.getHealthStatusWithPriority(infoService,
+                                                    SystemInfoService.DEFAULT_CLUSTER, partition.getVisibleVersion(),
+                                                    replicaAlloc, aliveBeIdsInCluster);
                                     res = pair.first;
                                 }
                                 switch (res) { // CHECKSTYLE IGNORE THIS LINE: missing switch default
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/MetaLockUtils.java b/fe/fe-core/src/main/java/org/apache/doris/common/util/MetaLockUtils.java
index 82954dce5c..ece62cbc10 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/util/MetaLockUtils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/MetaLockUtils.java
@@ -17,8 +17,8 @@
 
 package org.apache.doris.common.util;
 
-import org.apache.doris.catalog.Database;
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.DatabaseIf;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.MetaNotFoundException;
 
 import com.google.common.collect.Lists;
@@ -33,39 +33,39 @@ import java.util.concurrent.TimeUnit;
  */
 public class MetaLockUtils {
 
-    public static void readLockDatabases(List<Database> databaseList) {
-        for (Database database : databaseList) {
+    public static void readLockDatabases(List<? extends DatabaseIf> databaseList) {
+        for (DatabaseIf database : databaseList) {
             database.readLock();
         }
     }
 
-    public static void readUnlockDatabases(List<Database> databaseList) {
+    public static void readUnlockDatabases(List<? extends DatabaseIf> databaseList) {
         for (int i = databaseList.size() - 1; i >= 0; i--) {
             databaseList.get(i).readUnlock();
         }
     }
 
-    public static void readLockTables(List<Table> tableList) {
-        for (Table table : tableList) {
+    public static void readLockTables(List<? extends TableIf> tableList) {
+        for (TableIf table : tableList) {
             table.readLock();
         }
     }
 
-    public static void readUnlockTables(List<Table> tableList) {
+    public static void readUnlockTables(List<? extends TableIf> tableList) {
         for (int i = tableList.size() - 1; i >= 0; i--) {
             tableList.get(i).readUnlock();
         }
     }
 
-    public static void writeLockTables(List<Table> tableList) {
-        for (Table table : tableList) {
+    public static void writeLockTables(List<? extends TableIf> tableList) {
+        for (TableIf table : tableList) {
             table.writeLock();
         }
     }
 
-    public static List<Table> writeLockTablesIfExist(List<Table> tableList) {
-        List<Table> lockedTablesList = Lists.newArrayListWithCapacity(tableList.size());
-        for (Table table : tableList) {
+    public static List<? extends TableIf> writeLockTablesIfExist(List<? extends TableIf> tableList) {
+        List<TableIf> lockedTablesList = Lists.newArrayListWithCapacity(tableList.size());
+        for (TableIf table : tableList) {
             if (table.writeLockIfExist()) {
                 lockedTablesList.add(table);
             }
@@ -73,7 +73,7 @@ public class MetaLockUtils {
         return lockedTablesList;
     }
 
-    public static void writeLockTablesOrMetaException(List<Table> tableList) throws MetaNotFoundException {
+    public static void writeLockTablesOrMetaException(List<? extends TableIf> tableList) throws MetaNotFoundException {
         for (int i = 0; i < tableList.size(); i++) {
             try {
                 tableList.get(i).writeLockOrMetaException();
@@ -86,8 +86,8 @@ public class MetaLockUtils {
         }
     }
 
-    public static boolean tryWriteLockTablesOrMetaException(List<Table> tableList,
-            long timeout, TimeUnit unit) throws MetaNotFoundException {
+    public static boolean tryWriteLockTablesOrMetaException(List<? extends TableIf> tableList, long timeout,
+            TimeUnit unit) throws MetaNotFoundException {
         for (int i = 0; i < tableList.size(); i++) {
             try {
                 if (!tableList.get(i).tryWriteLockOrMetaException(timeout, unit)) {
@@ -106,7 +106,7 @@ public class MetaLockUtils {
         return true;
     }
 
-    public static void writeUnlockTables(List<Table> tableList) {
+    public static void writeUnlockTables(List<? extends TableIf> tableList) {
         for (int i = tableList.size() - 1; i >= 0; i--) {
             tableList.get(i).writeUnlock();
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/common/util/SmallFileMgr.java b/fe/fe-core/src/main/java/org/apache/doris/common/util/SmallFileMgr.java
index e96c527906..ae4bb3c2c9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/common/util/SmallFileMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/common/util/SmallFileMgr.java
@@ -164,14 +164,14 @@ public class SmallFileMgr implements Writable {
 
     public void createFile(CreateFileStmt stmt) throws DdlException {
         String dbName = stmt.getDbName();
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
         downloadAndAddFile(db.getId(), stmt.getCatalogName(), stmt.getFileName(),
                 stmt.getDownloadUrl(), stmt.getChecksum(), stmt.isSaveContent());
     }
 
     public void dropFile(DropFileStmt stmt) throws DdlException {
         String dbName = stmt.getDbName();
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
         removeFile(db.getId(), stmt.getCatalogName(), stmt.getFileName(), false);
     }
 
@@ -455,7 +455,7 @@ public class SmallFileMgr implements Writable {
     }
 
     public List<List<String>> getInfo(String dbName) throws DdlException {
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
         List<List<String>> infos = Lists.newArrayList();
         synchronized (files) {
             if (files.containsRow(db.getId())) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/consistency/CheckConsistencyJob.java b/fe/fe-core/src/main/java/org/apache/doris/consistency/CheckConsistencyJob.java
index 0d0327d8b3..b3f43ae346 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/consistency/CheckConsistencyJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/consistency/CheckConsistencyJob.java
@@ -112,7 +112,7 @@ public class CheckConsistencyJob {
             return false;
         }
 
-        Database db = Catalog.getCurrentCatalog().getDbNullable(tabletMeta.getDbId());
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(tabletMeta.getDbId());
         if (db == null) {
             LOG.debug("db[{}] does not exist", tabletMeta.getDbId());
             return false;
@@ -253,7 +253,7 @@ public class CheckConsistencyJob {
             return -1;
         }
 
-        Database db = Catalog.getCurrentCatalog().getDbNullable(tabletMeta.getDbId());
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(tabletMeta.getDbId());
         if (db == null) {
             LOG.warn("db[{}] does not exist", tabletMeta.getDbId());
             return -1;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/consistency/ConsistencyChecker.java b/fe/fe-core/src/main/java/org/apache/doris/consistency/ConsistencyChecker.java
index 8b7741f724..420d778020 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/consistency/ConsistencyChecker.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/consistency/ConsistencyChecker.java
@@ -238,7 +238,7 @@ public class ConsistencyChecker extends MasterDaemon {
         List<Long> chosenTablets = Lists.newArrayList();
 
         // sort dbs
-        List<Long> dbIds = catalog.getDbIds();
+        List<Long> dbIds = catalog.getInternalDataSource().getDbIds();
         if (dbIds.isEmpty()) {
             return chosenTablets;
         }
@@ -248,7 +248,7 @@ public class ConsistencyChecker extends MasterDaemon {
                 // skip 'information_schema' database
                 continue;
             }
-            Database db = catalog.getDbNullable(dbId);
+            Database db = catalog.getInternalDataSource().getDbNullable(dbId);
             if (db == null) {
                 continue;
             }
@@ -365,7 +365,7 @@ public class ConsistencyChecker extends MasterDaemon {
     }
 
     public void replayFinishConsistencyCheck(ConsistencyCheckInfo info, Catalog catalog) throws MetaNotFoundException {
-        Database db = catalog.getDbOrMetaException(info.getDbId());
+        Database db = catalog.getInternalDataSource().getDbOrMetaException(info.getDbId());
         OlapTable table = (OlapTable) db.getTableOrMetaException(info.getTableId());
         table.writeLock();
         try {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/DataSourceIf.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/DataSourceIf.java
index 4ac11d2480..93260e2746 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/DataSourceIf.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/DataSourceIf.java
@@ -30,7 +30,7 @@ import javax.annotation.Nullable;
 /**
  * The interface of DataSource(catalog).
  */
-public interface DataSourceIf {
+public interface DataSourceIf<T extends DatabaseIf> {
 
     // Type of this data source
     String getType();
@@ -42,31 +42,33 @@ public interface DataSourceIf {
 
     List<String> getDbNames();
 
+    List<Long> getDbIds();
+
     @Nullable
-    DatabaseIf getDbNullable(String dbName);
+    T getDbNullable(String dbName);
 
     @Nullable
-    DatabaseIf getDbNullable(long dbId);
+    T getDbNullable(long dbId);
 
-    Optional<DatabaseIf> getDb(String dbName);
+    Optional<T> getDb(String dbName);
 
-    Optional<DatabaseIf> getDb(long dbId);
+    Optional<T> getDb(long dbId);
 
-    <E extends Exception> DatabaseIf getDbOrException(String dbName, java.util.function.Function<String, E> e) throws E;
+    <E extends Exception> T getDbOrException(String dbName, java.util.function.Function<String, E> e) throws E;
 
-    <E extends Exception> DatabaseIf getDbOrException(long dbId, java.util.function.Function<Long, E> e) throws E;
+    <E extends Exception> T getDbOrException(long dbId, java.util.function.Function<Long, E> e) throws E;
 
-    DatabaseIf getDbOrMetaException(String dbName) throws MetaNotFoundException;
+    T getDbOrMetaException(String dbName) throws MetaNotFoundException;
 
-    DatabaseIf getDbOrMetaException(long dbId) throws MetaNotFoundException;
+    T getDbOrMetaException(long dbId) throws MetaNotFoundException;
 
-    DatabaseIf getDbOrDdlException(String dbName) throws DdlException;
+    T getDbOrDdlException(String dbName) throws DdlException;
 
-    DatabaseIf getDbOrDdlException(long dbId) throws DdlException;
+    T getDbOrDdlException(long dbId) throws DdlException;
 
-    DatabaseIf getDbOrAnalysisException(String dbName) throws AnalysisException;
+    T getDbOrAnalysisException(String dbName) throws AnalysisException;
 
-    DatabaseIf getDbOrAnalysisException(long dbId) throws AnalysisException;
+    T getDbOrAnalysisException(long dbId) throws AnalysisException;
 
     Map<String, String> getProperties();
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/DataSourceMgr.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/DataSourceMgr.java
index 8f04e035b2..192d25b6a4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/DataSourceMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/DataSourceMgr.java
@@ -23,6 +23,7 @@ import org.apache.doris.analysis.CreateCatalogStmt;
 import org.apache.doris.analysis.DropCatalogStmt;
 import org.apache.doris.analysis.ShowCatalogStmt;
 import org.apache.doris.catalog.Catalog;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.ErrorCode;
@@ -83,6 +84,39 @@ public class DataSourceMgr implements Writable {
         return nameToCatalogs.get(name);
     }
 
+    public DatabaseIf getDbNullable(long dbId) {
+        DatabaseIf db = internalDataSource.getDbNullable(dbId);
+        if (db != null) {
+            return db;
+        }
+        for (DataSourceIf ds : nameToCatalogs.values()) {
+            if (ds == internalDataSource) {
+                continue;
+            }
+            db = ds.getDbNullable(dbId);
+            if (db != null) {
+                return db;
+            }
+        }
+        return null;
+    }
+
+    public List<Long> getDbIds() {
+        List<Long> dbIds = Lists.newArrayList();
+        for (DataSourceIf ds : nameToCatalogs.values()) {
+            dbIds.addAll(ds.getDbIds());
+        }
+        return dbIds;
+    }
+
+    public List<String> getDbNames() {
+        List<String> dbNames = Lists.newArrayList();
+        for (DataSourceIf ds : nameToCatalogs.values()) {
+            dbNames.addAll(ds.getDbNames());
+        }
+        return dbNames;
+    }
+
     private void writeLock() {
         lock.writeLock().lock();
     }
@@ -187,13 +221,13 @@ public class DataSourceMgr implements Writable {
                 if (!nameToCatalogs.containsKey(showStmt.getCatalogName())) {
                     throw new AnalysisException("No catalog found with name: " + showStmt.getCatalogName());
                 }
-                DataSourceIf ds = nameToCatalogs.get(showStmt.getCatalogName());
+                DataSourceIf<DatabaseIf> ds = nameToCatalogs.get(showStmt.getCatalogName());
                 if (!Catalog.getCurrentCatalog().getAuth().checkCtlPriv(
                         ConnectContext.get(), ds.getName(), PrivPredicate.SHOW)) {
                     ErrorReport.reportAnalysisException(ErrorCode.ERR_CATALOG_ACCESS_DENIED,
                             ConnectContext.get().getQualifiedUser(), ds.getName());
                 }
-                for (Map.Entry<String, String>  elem : ds.getProperties().entrySet()) {
+                for (Map.Entry<String, String> elem : ds.getProperties().entrySet()) {
                     List<String> row = Lists.newArrayList();
                     row.add(elem.getKey());
                     row.add(elem.getValue());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/EsExternalDataSource.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/EsExternalDataSource.java
index 41909b0927..ddbf5b5aa1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/EsExternalDataSource.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/EsExternalDataSource.java
@@ -17,6 +17,9 @@
 
 package org.apache.doris.datasource;
 
+
+import com.google.common.collect.Lists;
+
 import java.util.List;
 import java.util.Map;
 
@@ -24,7 +27,6 @@ import java.util.Map;
  * External data source for elasticsearch
  */
 public class EsExternalDataSource extends ExternalDataSource {
-
     /**
      * Default constructor for EsExternalDataSource.
      */
@@ -48,4 +50,10 @@ public class EsExternalDataSource extends ExternalDataSource {
     public boolean tableExist(SessionContext ctx, String dbName, String tblName) {
         return false;
     }
+
+    @Override
+    public List<Long> getDbIds() {
+        // TODO: implement it
+        return Lists.newArrayList();
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalDataSource.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalDataSource.java
index 7e94e90a30..3ae70e5c2c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalDataSource.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalDataSource.java
@@ -17,7 +17,7 @@
 
 package org.apache.doris.datasource;
 
-import org.apache.doris.catalog.DatabaseIf;
+import org.apache.doris.catalog.external.ExternalDatabase;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.MetaNotFoundException;
@@ -42,7 +42,7 @@ import java.util.function.Function;
  * The abstract class for all types of external data sources.
  */
 @Data
-public abstract class ExternalDataSource implements DataSourceIf, Writable {
+public abstract class ExternalDataSource implements DataSourceIf<ExternalDatabase>, Writable {
     // Unique id of this data source, will be assigned after data source is loaded.
     @SerializedName(value = "id")
     protected long id;
@@ -96,63 +96,63 @@ public abstract class ExternalDataSource implements DataSourceIf, Writable {
 
     @Nullable
     @Override
-    public DatabaseIf getDbNullable(String dbName) {
+    public ExternalDatabase getDbNullable(String dbName) {
         throw new NotImplementedException();
     }
 
     @Nullable
     @Override
-    public DatabaseIf getDbNullable(long dbId) {
+    public ExternalDatabase getDbNullable(long dbId) {
         throw new NotImplementedException();
     }
 
     @Override
-    public Optional<DatabaseIf> getDb(String dbName) {
+    public Optional<ExternalDatabase> getDb(String dbName) {
         throw new NotImplementedException();
     }
 
     @Override
-    public Optional<DatabaseIf> getDb(long dbId) {
+    public Optional<ExternalDatabase> getDb(long dbId) {
         throw new NotImplementedException();
     }
 
     @Override
-    public <E extends Exception> DatabaseIf getDbOrException(String dbName, Function<String, E> e) throws E {
+    public <E extends Exception> ExternalDatabase getDbOrException(String dbName, Function<String, E> e) throws E {
         throw new NotImplementedException();
     }
 
     @Override
-    public <E extends Exception> DatabaseIf getDbOrException(long dbId, Function<Long, E> e) throws E {
+    public <E extends Exception> ExternalDatabase getDbOrException(long dbId, Function<Long, E> e) throws E {
         throw new NotImplementedException();
     }
 
     @Override
-    public DatabaseIf getDbOrMetaException(String dbName) throws MetaNotFoundException {
+    public ExternalDatabase getDbOrMetaException(String dbName) throws MetaNotFoundException {
         throw new NotImplementedException();
     }
 
     @Override
-    public DatabaseIf getDbOrMetaException(long dbId) throws MetaNotFoundException {
+    public ExternalDatabase getDbOrMetaException(long dbId) throws MetaNotFoundException {
         throw new NotImplementedException();
     }
 
     @Override
-    public DatabaseIf getDbOrDdlException(String dbName) throws DdlException {
+    public ExternalDatabase getDbOrDdlException(String dbName) throws DdlException {
         throw new NotImplementedException();
     }
 
     @Override
-    public DatabaseIf getDbOrDdlException(long dbId) throws DdlException {
+    public ExternalDatabase getDbOrDdlException(long dbId) throws DdlException {
         throw new NotImplementedException();
     }
 
     @Override
-    public DatabaseIf getDbOrAnalysisException(String dbName) throws AnalysisException {
+    public ExternalDatabase getDbOrAnalysisException(String dbName) throws AnalysisException {
         throw new NotImplementedException();
     }
 
     @Override
-    public DatabaseIf getDbOrAnalysisException(long dbId) throws AnalysisException {
+    public ExternalDatabase getDbOrAnalysisException(long dbId) throws AnalysisException {
         throw new NotImplementedException();
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/HMSExternalDataSource.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/HMSExternalDataSource.java
index fa7b27d5a3..b7097ff4cf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/HMSExternalDataSource.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/HMSExternalDataSource.java
@@ -17,7 +17,7 @@
 
 package org.apache.doris.datasource;
 
-import org.apache.doris.catalog.DatabaseIf;
+import org.apache.doris.catalog.external.ExternalDatabase;
 import org.apache.doris.catalog.external.HMSExternalDatabase;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
@@ -139,7 +139,7 @@ public class HMSExternalDataSource extends ExternalDataSource {
 
     @Nullable
     @Override
-    public DatabaseIf getDbNullable(String dbName) {
+    public ExternalDatabase getDbNullable(String dbName) {
         try {
             client.getDatabase(dbName);
         } catch (TException e) {
@@ -155,7 +155,7 @@ public class HMSExternalDataSource extends ExternalDataSource {
 
     @Nullable
     @Override
-    public DatabaseIf getDbNullable(long dbId) {
+    public ExternalDatabase getDbNullable(long dbId) {
         for (Map.Entry<String, Long> entry : dbNameToId.entrySet()) {
             if (entry.getValue() == dbId) {
                 return new HMSExternalDatabase(this, dbId, entry.getKey(), hiveMetastoreUris);
@@ -165,18 +165,18 @@ public class HMSExternalDataSource extends ExternalDataSource {
     }
 
     @Override
-    public Optional<DatabaseIf> getDb(String dbName) {
+    public Optional<ExternalDatabase> getDb(String dbName) {
         return Optional.ofNullable(getDbNullable(dbName));
     }
 
     @Override
-    public Optional<DatabaseIf> getDb(long dbId) {
+    public Optional<ExternalDatabase> getDb(long dbId) {
         return Optional.ofNullable(getDbNullable(dbId));
     }
 
     @Override
-    public <E extends Exception> DatabaseIf getDbOrException(String dbName, Function<String, E> e) throws E {
-        DatabaseIf db = getDbNullable(dbName);
+    public <E extends Exception> ExternalDatabase getDbOrException(String dbName, Function<String, E> e) throws E {
+        ExternalDatabase db = getDbNullable(dbName);
         if (db == null) {
             throw e.apply(dbName);
         }
@@ -184,8 +184,8 @@ public class HMSExternalDataSource extends ExternalDataSource {
     }
 
     @Override
-    public <E extends Exception> DatabaseIf getDbOrException(long dbId, Function<Long, E> e) throws E {
-        DatabaseIf db = getDbNullable(dbId);
+    public <E extends Exception> ExternalDatabase getDbOrException(long dbId, Function<Long, E> e) throws E {
+        ExternalDatabase db = getDbNullable(dbId);
         if (db == null) {
             throw e.apply(dbId);
         }
@@ -193,38 +193,43 @@ public class HMSExternalDataSource extends ExternalDataSource {
     }
 
     @Override
-    public DatabaseIf getDbOrMetaException(String dbName) throws MetaNotFoundException {
+    public ExternalDatabase getDbOrMetaException(String dbName) throws MetaNotFoundException {
         return getDbOrException(dbName,
                 s -> new MetaNotFoundException("unknown databases, dbName=" + s, ErrorCode.ERR_BAD_DB_ERROR));
     }
 
     @Override
-    public DatabaseIf getDbOrMetaException(long dbId) throws MetaNotFoundException {
+    public ExternalDatabase getDbOrMetaException(long dbId) throws MetaNotFoundException {
         return getDbOrException(dbId,
                 s -> new MetaNotFoundException("unknown databases, dbId=" + s, ErrorCode.ERR_BAD_DB_ERROR));
     }
 
     @Override
-    public DatabaseIf getDbOrDdlException(String dbName) throws DdlException {
+    public ExternalDatabase getDbOrDdlException(String dbName) throws DdlException {
         return getDbOrException(dbName,
                 s -> new DdlException(ErrorCode.ERR_BAD_DB_ERROR.formatErrorMsg(s), ErrorCode.ERR_BAD_DB_ERROR));
     }
 
     @Override
-    public DatabaseIf getDbOrDdlException(long dbId) throws DdlException {
+    public ExternalDatabase getDbOrDdlException(long dbId) throws DdlException {
         return getDbOrException(dbId,
                 s -> new DdlException(ErrorCode.ERR_BAD_DB_ERROR.formatErrorMsg(s), ErrorCode.ERR_BAD_DB_ERROR));
     }
 
     @Override
-    public DatabaseIf getDbOrAnalysisException(String dbName) throws AnalysisException {
+    public ExternalDatabase getDbOrAnalysisException(String dbName) throws AnalysisException {
         return getDbOrException(dbName,
                 s -> new AnalysisException(ErrorCode.ERR_BAD_DB_ERROR.formatErrorMsg(s), ErrorCode.ERR_BAD_DB_ERROR));
     }
 
     @Override
-    public DatabaseIf getDbOrAnalysisException(long dbId) throws AnalysisException {
+    public ExternalDatabase getDbOrAnalysisException(long dbId) throws AnalysisException {
         return getDbOrException(dbId,
                 s -> new AnalysisException(ErrorCode.ERR_BAD_DB_ERROR.formatErrorMsg(s), ErrorCode.ERR_BAD_DB_ERROR));
     }
+
+    @Override
+    public List<Long> getDbIds() {
+        return Lists.newArrayList(dbNameToId.values());
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalDataSource.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalDataSource.java
index fccf262082..1a76da5a76 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalDataSource.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalDataSource.java
@@ -99,6 +99,7 @@ import org.apache.doris.catalog.Replica.ReplicaState;
 import org.apache.doris.catalog.ReplicaAllocation;
 import org.apache.doris.catalog.SinglePartitionInfo;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.TableIndexes;
 import org.apache.doris.catalog.Tablet;
@@ -197,8 +198,8 @@ import java.util.function.Function;
  * Such as Database, tables, etc.
  * There is only one internal data source in a cluster. And its id is always 0.
  */
-public class InternalDataSource implements DataSourceIf {
-    public static final String INTERNAL_DS_NAME = "__internal";
+public class InternalDataSource implements DataSourceIf<Database> {
+    public static final String INTERNAL_DS_NAME = "internal_catalog";
     public static final long INTERNAL_DS_ID = 0L;
 
     private static final Logger LOG = LogManager.getLogger(InternalDataSource.class);
@@ -217,7 +218,7 @@ public class InternalDataSource implements DataSourceIf {
 
     @Override
     public long getId() {
-        return 0;
+        return INTERNAL_DS_ID;
     }
 
     @Override
@@ -238,7 +239,7 @@ public class InternalDataSource implements DataSourceIf {
 
     @Nullable
     @Override
-    public DatabaseIf getDbNullable(String dbName) {
+    public Database getDbNullable(String dbName) {
         if (fullNameToDb.containsKey(dbName)) {
             return fullNameToDb.get(dbName);
         } else {
@@ -258,23 +259,23 @@ public class InternalDataSource implements DataSourceIf {
 
     @Nullable
     @Override
-    public DatabaseIf getDbNullable(long dbId) {
+    public Database getDbNullable(long dbId) {
         return idToDb.get(dbId);
     }
 
     @Override
-    public Optional<DatabaseIf> getDb(String dbName) {
+    public Optional<Database> getDb(String dbName) {
         return Optional.ofNullable(getDbNullable(dbName));
     }
 
     @Override
-    public Optional<DatabaseIf> getDb(long dbId) {
+    public Optional<Database> getDb(long dbId) {
         return Optional.ofNullable(getDbNullable(dbId));
     }
 
     @Override
-    public <E extends Exception> DatabaseIf getDbOrException(String dbName, Function<String, E> e) throws E {
-        DatabaseIf db = getDbNullable(dbName);
+    public <E extends Exception> Database getDbOrException(String dbName, Function<String, E> e) throws E {
+        Database db = getDbNullable(dbName);
         if (db == null) {
             throw e.apply(dbName);
         }
@@ -282,8 +283,8 @@ public class InternalDataSource implements DataSourceIf {
     }
 
     @Override
-    public <E extends Exception> DatabaseIf getDbOrException(long dbId, Function<Long, E> e) throws E {
-        DatabaseIf db = getDbNullable(dbId);
+    public <E extends Exception> Database getDbOrException(long dbId, Function<Long, E> e) throws E {
+        Database db = getDbNullable(dbId);
         if (db == null) {
             throw e.apply(dbId);
         }
@@ -291,37 +292,37 @@ public class InternalDataSource implements DataSourceIf {
     }
 
     @Override
-    public DatabaseIf getDbOrMetaException(String dbName) throws MetaNotFoundException {
+    public Database getDbOrMetaException(String dbName) throws MetaNotFoundException {
         return getDbOrException(dbName,
                 s -> new MetaNotFoundException("unknown databases, dbName=" + s, ErrorCode.ERR_BAD_DB_ERROR));
     }
 
     @Override
-    public DatabaseIf getDbOrMetaException(long dbId) throws MetaNotFoundException {
+    public Database getDbOrMetaException(long dbId) throws MetaNotFoundException {
         return getDbOrException(dbId,
                 s -> new MetaNotFoundException("unknown databases, dbId=" + s, ErrorCode.ERR_BAD_DB_ERROR));
     }
 
     @Override
-    public DatabaseIf getDbOrDdlException(String dbName) throws DdlException {
+    public Database getDbOrDdlException(String dbName) throws DdlException {
         return getDbOrException(dbName,
                 s -> new DdlException(ErrorCode.ERR_BAD_DB_ERROR.formatErrorMsg(s), ErrorCode.ERR_BAD_DB_ERROR));
     }
 
     @Override
-    public DatabaseIf getDbOrDdlException(long dbId) throws DdlException {
+    public Database getDbOrDdlException(long dbId) throws DdlException {
         return getDbOrException(dbId,
                 s -> new DdlException(ErrorCode.ERR_BAD_DB_ERROR.formatErrorMsg(s), ErrorCode.ERR_BAD_DB_ERROR));
     }
 
     @Override
-    public DatabaseIf getDbOrAnalysisException(String dbName) throws AnalysisException {
+    public Database getDbOrAnalysisException(String dbName) throws AnalysisException {
         return getDbOrException(dbName,
                 s -> new AnalysisException(ErrorCode.ERR_BAD_DB_ERROR.formatErrorMsg(s), ErrorCode.ERR_BAD_DB_ERROR));
     }
 
     @Override
-    public DatabaseIf getDbOrAnalysisException(long dbId) throws AnalysisException {
+    public Database getDbOrAnalysisException(long dbId) throws AnalysisException {
         return getDbOrException(dbId,
                 s -> new AnalysisException(ErrorCode.ERR_BAD_DB_ERROR.formatErrorMsg(s), ErrorCode.ERR_BAD_DB_ERROR));
     }
@@ -1124,8 +1125,8 @@ public class InternalDataSource implements DataSourceIf {
 
     public void createTableLike(CreateTableLikeStmt stmt) throws DdlException {
         try {
-            Database db = Catalog.getCurrentCatalog().getDbOrDdlException(stmt.getExistedDbName());
-            Table table = db.getTableOrDdlException(stmt.getExistedTableName());
+            DatabaseIf db = getDbOrDdlException(stmt.getExistedDbName());
+            TableIf table = db.getTableOrDdlException(stmt.getExistedTableName());
 
             if (table.getType() == TableType.VIEW) {
                 throw new DdlException("Not support create table from a View");
@@ -3097,7 +3098,7 @@ public class InternalDataSource implements DataSourceIf {
             String dbName = InfoSchemaDb.getFullInfoSchemaDbName(cluster.getName());
             // Use real Catalog instance to avoid InfoSchemaDb id continuously increment
             // when checkpoint thread load image.
-            InfoSchemaDb db = (InfoSchemaDb) Catalog.getServingCatalog().getDbNullable(dbName);
+            InfoSchemaDb db = (InfoSchemaDb) Catalog.getServingCatalog().getInternalDataSource().getDbNullable(dbName);
             if (db == null) {
                 db = new InfoSchemaDb(cluster.getName());
                 db.setClusterName(cluster.getName());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/EsRepository.java b/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/EsRepository.java
index 2671485272..95f54dceb7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/EsRepository.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/external/elasticsearch/EsRepository.java
@@ -90,9 +90,9 @@ public class EsRepository extends MasterDaemon {
         if (Catalog.isCheckpointThread()) {
             return;
         }
-        List<Long> dbIds = Catalog.getCurrentCatalog().getDbIds();
+        List<Long> dbIds = Catalog.getCurrentCatalog().getInternalDataSource().getDbIds();
         for (Long dbId : dbIds) {
-            Database database = Catalog.getCurrentCatalog().getDbNullable(dbId);
+            Database database = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
             if (database == null) {
                 continue;
             }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/external/iceberg/IcebergTableCreationRecordMgr.java b/fe/fe-core/src/main/java/org/apache/doris/external/iceberg/IcebergTableCreationRecordMgr.java
index e726ef9fa3..33ec03143d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/external/iceberg/IcebergTableCreationRecordMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/external/iceberg/IcebergTableCreationRecordMgr.java
@@ -116,7 +116,7 @@ public class IcebergTableCreationRecordMgr extends MasterDaemon {
     // remove already created tables or failed tables
     private void removeDuplicateTables() {
         for (Map.Entry<Long, Map<Long, IcebergTableCreationRecord>> entry : dbToTableToCreationRecord.entrySet()) {
-            Catalog.getCurrentCatalog().getDb(entry.getKey()).ifPresent(db -> {
+            Catalog.getCurrentInternalCatalog().getDb(entry.getKey()).ifPresent(db -> {
                 if (dbToTableIdentifiers.containsKey(db)) {
                     for (Map.Entry<Long, IcebergTableCreationRecord> innerEntry : entry.getValue().entrySet()) {
                         String tableName = innerEntry.getValue().getTable();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/CancelLoadAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/CancelLoadAction.java
index 63c2a88aa4..af5db711fe 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/CancelLoadAction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/CancelLoadAction.java
@@ -65,7 +65,7 @@ public class CancelLoadAction extends RestBaseController {
 
         Database db;
         try {
-            db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+            db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
         } catch (MetaNotFoundException e) {
             return ResponseEntityBuilder.okWithCommonError(e.getMessage());
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetDdlStmtAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetDdlStmtAction.java
index 601adfd60e..c26eaba334 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetDdlStmtAction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetDdlStmtAction.java
@@ -64,7 +64,7 @@ public class GetDdlStmtAction extends RestBaseController {
         String fullDbName = getFullDbName(dbName);
         Table table;
         try {
-            Database db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+            Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
             table = db.getTableOrMetaException(tableName, Table.TableType.OLAP);
         } catch (MetaNotFoundException e) {
             return ResponseEntityBuilder.okWithCommonError(e.getMessage());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetStreamLoadState.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetStreamLoadState.java
index 8041d0a18f..e0f0702816 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetStreamLoadState.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetStreamLoadState.java
@@ -54,7 +54,7 @@ public class GetStreamLoadState extends RestBaseController {
 
         Database db;
         try {
-            db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+            db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
         } catch (MetaNotFoundException e) {
             return ResponseEntityBuilder.okWithCommonError(e.getMessage());
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/MetaInfoAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/MetaInfoAction.java
index 1e4d4e686e..6f3bbbce5c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/MetaInfoAction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/MetaInfoAction.java
@@ -22,7 +22,6 @@ import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.Table;
 import org.apache.doris.cluster.ClusterNamespace;
-import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.MetaNotFoundException;
@@ -92,12 +91,7 @@ public class MetaInfoAction extends RestBaseController {
         }
 
         // 1. get all database with privilege
-        List<String> dbNames = null;
-        try {
-            dbNames = Catalog.getCurrentCatalog().getClusterDbNames(ns);
-        } catch (AnalysisException e) {
-            return ResponseEntityBuilder.okWithCommonError("namespace does not exist: " + ns);
-        }
+        List<String> dbNames = Catalog.getCurrentCatalog().getCurrentDataSource().getDbNames();
         List<String> dbNameSet = Lists.newArrayList();
         for (String fullName : dbNames) {
             final String db = ClusterNamespace.getNameFromFullName(fullName);
@@ -142,7 +136,7 @@ public class MetaInfoAction extends RestBaseController {
         String fullDbName = getFullDbName(dbName);
         Database db;
         try {
-            db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+            db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
         } catch (MetaNotFoundException e) {
             return ResponseEntityBuilder.okWithCommonError(e.getMessage());
         }
@@ -225,7 +219,7 @@ public class MetaInfoAction extends RestBaseController {
         Database db;
         Table tbl;
         try {
-            db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+            db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
             tbl = db.getTableOrMetaException(tblName, Table.TableType.OLAP);
         } catch (MetaNotFoundException e) {
             return ResponseEntityBuilder.okWithCommonError(e.getMessage());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/RowCountAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/RowCountAction.java
index 75510386fd..934dade5f6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/RowCountAction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/RowCountAction.java
@@ -67,7 +67,7 @@ public class RowCountAction extends RestBaseController {
         Map<String, Long> indexRowCountMap = Maps.newHashMap();
         OlapTable olapTable;
         try {
-            Database db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+            Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
             olapTable = (OlapTable) db.getTableOrMetaException(tableName, Table.TableType.OLAP);
         } catch (MetaNotFoundException e) {
             return ResponseEntityBuilder.okWithCommonError(e.getMessage());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/ShowAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/ShowAction.java
index d358df47f2..00800ffceb 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/ShowAction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/ShowAction.java
@@ -19,6 +19,7 @@ package org.apache.doris.httpv2.rest;
 
 import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.Table;
 import org.apache.doris.catalog.TableIf.TableType;
@@ -170,16 +171,16 @@ public class ShowAction extends RestBaseController {
         long totalSize = 0;
         if (dbName != null) {
             String fullDbName = getFullDbName(dbName);
-            Database db = Catalog.getCurrentCatalog().getDbNullable(fullDbName);
+            DatabaseIf db = Catalog.getCurrentInternalCatalog().getDbNullable(fullDbName);
             if (db == null) {
                 return ResponseEntityBuilder.okWithCommonError("database " + fullDbName + " not found.");
             }
             totalSize = getDataSizeOfDatabase(db);
             oneEntry.put(fullDbName, totalSize);
         } else {
-            for (long dbId : Catalog.getCurrentCatalog().getDbIds()) {
-                Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
-                if (db == null && db.isInfoSchemaDb()) {
+            for (long dbId : Catalog.getCurrentInternalCatalog().getDbIds()) {
+                DatabaseIf db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
+                if (db == null || !(db instanceof Database) || ((Database) db).isInfoSchemaDb()) {
                     continue;
                 }
                 totalSize += getDataSizeOfDatabase(db);
@@ -246,7 +247,7 @@ public class ShowAction extends RestBaseController {
         return feInfo;
     }
 
-    public long getDataSizeOfDatabase(Database db) {
+    public long getDataSizeOfDatabase(DatabaseIf db) {
         long totalSize = 0;
         db.readLock();
         try {
@@ -272,10 +273,10 @@ public class ShowAction extends RestBaseController {
 
     private Map<String, Long> getDataSize() {
         Map<String, Long> result = new HashMap<String, Long>();
-        List<String> dbNames = Catalog.getCurrentCatalog().getDbNames();
+        List<String> dbNames = Catalog.getCurrentInternalCatalog().getDbNames();
 
         for (String dbName : dbNames) {
-            Catalog.getCurrentCatalog().getDb(dbName).ifPresent(db -> {
+            Catalog.getCurrentInternalCatalog().getDb(dbName).ifPresent(db -> {
                 long totalSize = getDataSizeOfDatabase(db);
                 result.put(dbName, totalSize);
             });
diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/StorageTypeCheckAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/StorageTypeCheckAction.java
index efcf005a21..7331923917 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/StorageTypeCheckAction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/StorageTypeCheckAction.java
@@ -56,7 +56,7 @@ public class StorageTypeCheckAction extends RestBaseController {
         String fullDbName = getFullDbName(dbName);
         Database db;
         try {
-            db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+            db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
         } catch (MetaNotFoundException e) {
             return ResponseEntityBuilder.okWithCommonError(e.getMessage());
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TableQueryPlanAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TableQueryPlanAction.java
index 61ca6bc947..ceccd41ff6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TableQueryPlanAction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TableQueryPlanAction.java
@@ -111,7 +111,7 @@ public class TableQueryPlanAction extends RestBaseController {
             checkTblAuth(ConnectContext.get().getCurrentUserIdentity(), fullDbName, tblName, PrivPredicate.SELECT);
             Table table;
             try {
-                Database db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+                Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
                 table = db.getTableOrMetaException(tblName, Table.TableType.OLAP);
             } catch (MetaNotFoundException e) {
                 return ResponseEntityBuilder.okWithCommonError(e.getMessage());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TableRowCountAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TableRowCountAction.java
index c67983cf92..55b98c595e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TableRowCountAction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TableRowCountAction.java
@@ -62,7 +62,7 @@ public class TableRowCountAction extends RestBaseController {
             checkTblAuth(ConnectContext.get().getCurrentUserIdentity(), fullDbName, tblName, PrivPredicate.SELECT);
             OlapTable olapTable;
             try {
-                Database db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+                Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
                 olapTable = (OlapTable) db.getTableOrMetaException(tblName, Table.TableType.OLAP);
             } catch (MetaNotFoundException e) {
                 return ResponseEntityBuilder.okWithCommonError(e.getMessage());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TableSchemaAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TableSchemaAction.java
index 94f6c8e578..beeca5739c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TableSchemaAction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/TableSchemaAction.java
@@ -65,7 +65,7 @@ public class TableSchemaAction extends RestBaseController {
             checkTblAuth(ConnectContext.get().getCurrentUserIdentity(), fullDbName, tblName, PrivPredicate.SELECT);
             OlapTable table;
             try {
-                Database db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+                Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
                 table = (OlapTable) db.getTableOrMetaException(tblName, Table.TableType.OLAP);
             } catch (MetaNotFoundException e) {
                 return ResponseEntityBuilder.okWithCommonError(e.getMessage());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/MetaInfoActionV2.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/MetaInfoActionV2.java
index 811cae6b5e..a122ca335d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/MetaInfoActionV2.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/MetaInfoActionV2.java
@@ -92,7 +92,7 @@ public class MetaInfoActionV2 extends RestBaseController {
         // 1. get all database with privilege
         List<String> dbNames = null;
         try {
-            dbNames = Catalog.getCurrentCatalog().getClusterDbNames(ns);
+            dbNames = Catalog.getCurrentInternalCatalog().getClusterDbNames(ns);
         } catch (AnalysisException e) {
             return ResponseEntityBuilder.okWithCommonError("namespace does not exist: " + ns);
         }
@@ -139,7 +139,7 @@ public class MetaInfoActionV2 extends RestBaseController {
         String fullDbName = getFullDbName(dbName);
         Database db;
         try {
-            db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+            db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
         } catch (MetaNotFoundException e) {
             return ResponseEntityBuilder.okWithCommonError(e.getMessage());
         }
@@ -211,7 +211,7 @@ public class MetaInfoActionV2 extends RestBaseController {
         boolean withMv = !Strings.isNullOrEmpty(withMvPara) && withMvPara.equals("1");
 
         try {
-            Database db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+            Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
             db.readLock();
             try {
                 Table tbl = db.getTableOrMetaException(tblName, Table.TableType.OLAP);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/StatisticAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/StatisticAction.java
index 3b8b7f7353..0da2d8ca32 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/StatisticAction.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/StatisticAction.java
@@ -18,6 +18,7 @@
 package org.apache.doris.httpv2.restv2;
 
 import org.apache.doris.catalog.Catalog;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.httpv2.entity.ResponseEntityBuilder;
 import org.apache.doris.httpv2.rest.RestBaseController;
 import org.apache.doris.system.Backend;
@@ -51,7 +52,7 @@ public class StatisticAction extends RestBaseController {
         Catalog catalog = Catalog.getCurrentCatalog();
         SystemInfoService infoService = Catalog.getCurrentSystemInfo();
 
-        resultMap.put("dbCount", catalog.getDbIds().size());
+        resultMap.put("dbCount", catalog.getInternalDataSource().getDbIds().size());
         resultMap.put("tblCount", getTblCount(catalog));
         resultMap.put("diskOccupancy", getDiskOccupancy(infoService));
         resultMap.put("beCount", infoService.getClusterBackendIds(SystemInfoService.DEFAULT_CLUSTER).size());
@@ -62,8 +63,9 @@ public class StatisticAction extends RestBaseController {
     }
 
     private int getTblCount(Catalog catalog) {
-        return catalog.getDbIds().stream().map(catalog::getDbNullable).filter(Objects::nonNull)
-                .map(db -> db.getTables().size()).reduce(Integer::sum).orElse(0);
+        InternalDataSource ds = catalog.getInternalDataSource();
+        return ds.getDbIds().stream().map(ds::getDbNullable).filter(Objects::nonNull).map(db -> db.getTables().size())
+                .reduce(Integer::sum).orElse(0);
     }
 
     private long getDiskOccupancy(SystemInfoService infoService) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/DeleteHandler.java b/fe/fe-core/src/main/java/org/apache/doris/load/DeleteHandler.java
index d25bc8b2b3..ce080b8870 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/DeleteHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/DeleteHandler.java
@@ -145,7 +145,7 @@ public class DeleteHandler implements Writable {
         List<String> partitionNames = stmt.getPartitionNames();
         boolean noPartitionSpecified = partitionNames.isEmpty();
         List<Predicate> conditions = stmt.getDeleteConditions();
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
 
         DeleteJob deleteJob = null;
         try {
@@ -692,7 +692,7 @@ public class DeleteHandler implements Writable {
     // show delete stmt
     public List<List<Comparable>> getDeleteInfosByDb(long dbId) {
         LinkedList<List<Comparable>> infos = new LinkedList<List<Comparable>>();
-        Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (db == null) {
             return infos;
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/DeleteJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/DeleteJob.java
index c53b731025..874e4e7753 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/DeleteJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/DeleteJob.java
@@ -85,7 +85,7 @@ public class DeleteJob extends AbstractTxnStateChangeCallback {
      */
     public void checkAndUpdateQuorum() throws MetaNotFoundException {
         long dbId = deleteInfo.getDbId();
-        Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
 
         for (TabletDeleteInfo tDeleteInfo : getTabletDeleteInfo()) {
             Short replicaNum = partitionReplicaNum.get(tDeleteInfo.getPartitionId());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/ExportJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/ExportJob.java
index 2c72befa63..9559c0f80c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/ExportJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/ExportJob.java
@@ -197,7 +197,7 @@ public class ExportJob implements Writable {
 
     public void setJob(ExportStmt stmt) throws UserException {
         String dbName = stmt.getTblName().getDb();
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
         Preconditions.checkNotNull(stmt.getBrokerDesc());
         this.brokerDesc = stmt.getBrokerDesc();
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/ExportMgr.java b/fe/fe-core/src/main/java/org/apache/doris/load/ExportMgr.java
index 32c2fcf552..1d7c581199 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/ExportMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/ExportMgr.java
@@ -168,7 +168,7 @@ public class ExportMgr {
                 TableName tableName = job.getTableName();
                 if (tableName == null || tableName.getTbl().equals("DUMMY")) {
                     // forward compatibility, no table name is saved before
-                    Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+                    Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
                     if (db == null) {
                         continue;
                     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/Load.java b/fe/fe-core/src/main/java/org/apache/doris/load/Load.java
index 97ba9e20db..f6b85a0ebe 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/Load.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/Load.java
@@ -367,7 +367,7 @@ public class Load {
     public void addLoadJob(LoadStmt stmt, EtlJobType etlJobType, long timestamp) throws DdlException {
         // get db
         String dbName = stmt.getLabel().getDbName();
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
 
         // create job
         LoadJob job = createLoadJob(stmt, etlJobType, db, timestamp);
@@ -1607,7 +1607,7 @@ public class Load {
     // return true if we truly register a mini load label
     // return false otherwise (eg: a retry request)
     public boolean registerMiniLabel(String fullDbName, String label, long timestamp) throws DdlException {
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(fullDbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(fullDbName);
 
         long dbId = db.getId();
         writeLock();
@@ -1634,7 +1634,7 @@ public class Load {
     }
 
     public void deregisterMiniLabel(String fullDbName, String label) throws DdlException {
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(fullDbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(fullDbName);
 
         long dbId = db.getId();
         writeLock();
@@ -2078,7 +2078,7 @@ public class Load {
         }
 
         long dbId = loadJob.getDbId();
-        Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (db == null) {
             return infos;
         }
@@ -2250,7 +2250,7 @@ public class Load {
     public void getJobInfo(JobInfo info) throws DdlException, MetaNotFoundException {
         String fullDbName = ClusterNamespace.getFullName(info.clusterName, info.dbName);
         info.dbName = fullDbName;
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
         readLock();
         try {
             Map<String, List<LoadJob>> labelToLoadJobs = dbLabelToLoadJobs.get(db.getId());
@@ -2367,7 +2367,7 @@ public class Load {
 
     public void replayQuorumLoadJob(LoadJob job, Catalog catalog) throws MetaNotFoundException {
         // TODO: need to call this.writeLock()?
-        Database db = catalog.getDbOrMetaException(job.getDbId());
+        Database db = catalog.getInternalDataSource().getDbOrMetaException(job.getDbId());
 
         List<Long> tableIds = Lists.newArrayList();
         long tblId = job.getTableId();
@@ -2445,7 +2445,7 @@ public class Load {
 
     public void replayFinishLoadJob(LoadJob job, Catalog catalog) throws MetaNotFoundException {
         // TODO: need to call this.writeLock()?
-        Database db = catalog.getDbOrMetaException(job.getDbId());
+        Database db = catalog.getCurrentInternalCatalog().getDbOrMetaException(job.getDbId());
         // After finish, the idToTableLoadInfo in load job will be set to null.
         // We lost table info. So we have to use db lock here.
         db.writeLock();
@@ -2462,7 +2462,7 @@ public class Load {
     }
 
     public void replayClearRollupInfo(ReplicaPersistInfo info, Catalog catalog) throws MetaNotFoundException {
-        Database db = catalog.getDbOrMetaException(info.getDbId());
+        Database db = catalog.getInternalDataSource().getDbOrMetaException(info.getDbId());
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(info.getTableId(), TableType.OLAP);
         olapTable.writeLock();
         try {
@@ -2650,7 +2650,7 @@ public class Load {
                     }
 
                     long dbId = job.getDbId();
-                    Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+                    Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
                     if (db == null) {
                         LOG.warn("db does not exist. id: {}", dbId);
                         break;
@@ -2683,7 +2683,7 @@ public class Load {
 
         long jobId = job.getId();
         long dbId = job.getDbId();
-        Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         String errMsg = msg;
         if (db == null) {
             // if db is null, update job to cancelled
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/LoadChecker.java b/fe/fe-core/src/main/java/org/apache/doris/load/LoadChecker.java
index f829e31e01..0faf356029 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/LoadChecker.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/LoadChecker.java
@@ -229,7 +229,7 @@ public class LoadChecker extends MasterDaemon {
         Load load = Catalog.getCurrentCatalog().getLoadInstance();
         // get db
         long dbId = job.getDbId();
-        Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (db == null) {
             load.cancelLoadJob(job, CancelType.LOAD_RUN_FAIL, "db does not exist. id: " + dbId);
             return;
@@ -532,7 +532,7 @@ public class LoadChecker extends MasterDaemon {
         // if db is null, cancel load job
         Load load = Catalog.getCurrentCatalog().getLoadInstance();
         long dbId = job.getDbId();
-        Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (db == null) {
             load.cancelLoadJob(job, CancelType.LOAD_RUN_FAIL, "db does not exist. id: " + dbId);
             return;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/StreamLoadRecordMgr.java b/fe/fe-core/src/main/java/org/apache/doris/load/StreamLoadRecordMgr.java
index f5edc57077..63132c1948 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/StreamLoadRecordMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/StreamLoadRecordMgr.java
@@ -301,7 +301,7 @@ public class StreamLoadRecordMgr extends MasterDaemon {
                     }
 
                     String fullDbName = ClusterNamespace.getFullName(cluster, streamLoadItem.getDb());
-                    Database db = Catalog.getCurrentCatalog().getDbNullable(fullDbName);
+                    Database db = Catalog.getCurrentInternalCatalog().getDbNullable(fullDbName);
                     if (db == null) {
                         String dbName = fullDbName;
                         if (Strings.isNullOrEmpty(streamLoadItem.getCluster())) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/BulkLoadJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/BulkLoadJob.java
index 6f4ad21fc1..49165bd59e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/BulkLoadJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/BulkLoadJob.java
@@ -27,6 +27,7 @@ import org.apache.doris.catalog.AuthorizationInfo;
 import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.MetaNotFoundException;
 import org.apache.doris.common.io.Text;
@@ -110,19 +111,19 @@ public abstract class BulkLoadJob extends LoadJob {
     public static BulkLoadJob fromLoadStmt(LoadStmt stmt) throws DdlException {
         // get db id
         String dbName = stmt.getLabel().getDbName();
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
 
         // create job
         BulkLoadJob bulkLoadJob;
         try {
             switch (stmt.getEtlJobType()) {
                 case BROKER:
-                    bulkLoadJob = new BrokerLoadJob(db.getId(), stmt.getLabel().getLabelName(),
-                            stmt.getBrokerDesc(), stmt.getOrigStmt(), stmt.getUserInfo());
+                    bulkLoadJob = new BrokerLoadJob(db.getId(), stmt.getLabel().getLabelName(), stmt.getBrokerDesc(),
+                            stmt.getOrigStmt(), stmt.getUserInfo());
                     break;
                 case SPARK:
-                    bulkLoadJob = new SparkLoadJob(db.getId(), stmt.getLabel().getLabelName(),
-                            stmt.getResourceDesc(), stmt.getOrigStmt(), stmt.getUserInfo());
+                    bulkLoadJob = new SparkLoadJob(db.getId(), stmt.getLabel().getLabelName(), stmt.getResourceDesc(),
+                            stmt.getOrigStmt(), stmt.getUserInfo());
                     break;
                 case MINI:
                 case DELETE:
@@ -133,7 +134,7 @@ public abstract class BulkLoadJob extends LoadJob {
                     throw new DdlException("Unknown load job type.");
             }
             bulkLoadJob.setJobProperties(stmt.getProperties());
-            bulkLoadJob.checkAndSetDataSourceInfo(db, stmt.getDataDescriptions());
+            bulkLoadJob.checkAndSetDataSourceInfo((Database) db, stmt.getDataDescriptions());
             return bulkLoadJob;
         } catch (MetaNotFoundException e) {
             throw new DdlException(e.getMessage());
@@ -162,23 +163,23 @@ public abstract class BulkLoadJob extends LoadJob {
     }
 
     private AuthorizationInfo gatherAuthInfo() throws MetaNotFoundException {
-        Database database = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database database = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         return new AuthorizationInfo(database.getFullName(), getTableNames());
     }
 
     @Override
     public Set<String> getTableNamesForShow() {
-        Optional<Database> db = Catalog.getCurrentCatalog().getDb(dbId);
+        Optional<Database> db = Catalog.getCurrentInternalCatalog().getDb(dbId);
         return fileGroupAggInfo.getAllTableIds().stream()
-                .map(tableId -> db.flatMap(d -> d.getTable(tableId))
-                        .map(Table::getName).orElse(String.valueOf(tableId)))
+                .map(tableId -> db.flatMap(d -> d.getTable(tableId)).map(TableIf::getName)
+                        .orElse(String.valueOf(tableId)))
                 .collect(Collectors.toSet());
     }
 
     @Override
     public Set<String> getTableNames() throws MetaNotFoundException {
         Set<String> result = Sets.newHashSet();
-        Database database = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database database = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         // The database will not be locked in here.
         // The getTable is a thread-safe method called without read lock of database
         for (long tableId : fileGroupAggInfo.getAllTableIds()) {
@@ -259,7 +260,7 @@ public abstract class BulkLoadJob extends LoadJob {
                 Long.valueOf(sessionVariables.get(SessionVariable.SQL_MODE))));
         LoadStmt stmt;
         try {
-            Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbId);
             stmt = (LoadStmt) SqlParserUtils.getStmt(parser, originStmt.idx);
             for (DataDescription dataDescription : stmt.getDataDescriptions()) {
                 dataDescription.analyzeWithoutCheckPriv(db.getFullName());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/InsertLoadJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/InsertLoadJob.java
index d638c0d9d6..65a4dad027 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/InsertLoadJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/InsertLoadJob.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.AuthorizationInfo;
 import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.MetaNotFoundException;
 import org.apache.doris.load.EtlJobType;
 import org.apache.doris.load.FailMsg;
@@ -69,20 +70,20 @@ public class InsertLoadJob extends LoadJob {
     }
 
     public AuthorizationInfo gatherAuthInfo() throws MetaNotFoundException {
-        Database database = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database database = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         return new AuthorizationInfo(database.getFullName(), getTableNames());
     }
 
     @Override
     public Set<String> getTableNamesForShow() {
-        String name = Catalog.getCurrentCatalog().getDb(dbId).flatMap(db -> db.getTable(tableId))
-                .map(Table::getName).orElse(String.valueOf(tableId));
+        String name = Catalog.getCurrentInternalCatalog().getDb(dbId).flatMap(db -> db.getTable(tableId))
+                .map(TableIf::getName).orElse(String.valueOf(tableId));
         return Sets.newHashSet(name);
     }
 
     @Override
     public Set<String> getTableNames() throws MetaNotFoundException {
-        Database database = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database database = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         Table table = database.getTableOrMetaException(tableId);
         return Sets.newHashSet(table.getName());
     }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadJob.java
index 845aa35ec3..4535c6851c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadJob.java
@@ -267,7 +267,7 @@ public abstract class LoadJob extends AbstractTxnStateChangeCallback implements
     }
 
     public Database getDb() throws MetaNotFoundException {
-        return Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        return Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
     }
 
     public long getDbId() {
@@ -595,7 +595,7 @@ public abstract class LoadJob extends AbstractTxnStateChangeCallback implements
      * @throws DdlException
      */
     private void checkAuthWithoutAuthInfo(String command) throws DdlException {
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbId);
 
         // check auth
         try {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadManager.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadManager.java
index 5d54451ee8..17b7af2508 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadManager.java
@@ -289,7 +289,7 @@ public class LoadManager implements Writable {
             long createTimestamp, String failMsg, String trackingUrl) throws MetaNotFoundException {
 
         // get db id
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbName);
 
         LoadJob loadJob;
         switch (jobType) {
@@ -337,7 +337,7 @@ public class LoadManager implements Writable {
      * Cancel load job by stmt.
      **/
     public void cancelLoadJob(CancelLoadStmt stmt) throws DdlException, AnalysisException {
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(stmt.getDbName());
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(stmt.getDbName());
         // List of load jobs waiting to be cancelled
         List<LoadJob> matchLoadJobs = Lists.newArrayList();
         readLock();
@@ -632,7 +632,7 @@ public class LoadManager implements Writable {
     }
 
     private Database checkDb(String dbName) throws DdlException {
-        return Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        return Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
     }
 
     /**
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadingTaskPlanner.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadingTaskPlanner.java
index b91c839441..039abaa7d0 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadingTaskPlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/LoadingTaskPlanner.java
@@ -95,8 +95,9 @@ public class LoadingTaskPlanner {
         this.loadParallelism = loadParallelism;
         this.sendBatchParallelism = sendBatchParallelism;
         this.userInfo = userInfo;
-        if (Catalog.getCurrentCatalog().getAuth().checkDbPriv(userInfo,
-                Catalog.getCurrentCatalog().getDbNullable(dbId).getFullName(), PrivPredicate.SELECT)) {
+        if (Catalog.getCurrentCatalog().getAuth()
+                .checkDbPriv(userInfo, Catalog.getCurrentInternalCatalog().getDbNullable(dbId).getFullName(),
+                        PrivPredicate.SELECT)) {
             this.analyzer.setUDFAllowed(true);
         } else {
             this.analyzer.setUDFAllowed(false);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/MiniLoadJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/MiniLoadJob.java
index 2c76672cd0..4c59ffdaea 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/MiniLoadJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/MiniLoadJob.java
@@ -82,7 +82,7 @@ public class MiniLoadJob extends LoadJob {
     }
 
     public AuthorizationInfo gatherAuthInfo() throws MetaNotFoundException {
-        Database database = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database database = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         return new AuthorizationInfo(database.getFullName(), getTableNames());
     }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/SparkLoadJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/SparkLoadJob.java
index 7b1397c859..b9ec64ea7f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/SparkLoadJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/SparkLoadJob.java
@@ -40,6 +40,7 @@ import org.apache.doris.catalog.Resource;
 import org.apache.doris.catalog.ScalarType;
 import org.apache.doris.catalog.SparkResource;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.Tablet;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
@@ -419,19 +420,16 @@ public class SparkLoadJob extends BulkLoadJob {
         try {
             db = getDb();
         } catch (MetaNotFoundException e) {
-            String errMsg = new LogBuilder(LogKey.LOAD_JOB, id)
-                    .add("database_id", dbId)
-                    .add("label", label)
-                    .add("error_msg", "db has been deleted when job is loading")
-                    .build();
+            String errMsg = new LogBuilder(LogKey.LOAD_JOB, id).add("database_id", dbId).add("label", label)
+                    .add("error_msg", "db has been deleted when job is loading").build();
             throw new MetaNotFoundException(errMsg);
         }
 
         AgentBatchTask batchTask = new AgentBatchTask();
         boolean hasLoadPartitions = false;
         Set<Long> totalTablets = Sets.newHashSet();
-        List<Table> tableList = db.getTablesOnIdOrderOrThrowException(
-                Lists.newArrayList(tableToLoadPartitions.keySet()));
+        List<? extends TableIf> tableList =
+                db.getTablesOnIdOrderOrThrowException(Lists.newArrayList(tableToLoadPartitions.keySet()));
         MetaLockUtils.readLockTables(tableList);
         try {
             writeLock();
@@ -445,7 +443,7 @@ public class SparkLoadJob extends BulkLoadJob {
                     return totalTablets;
                 }
 
-                for (Table table : tableList) {
+                for (TableIf table : tableList) {
                     Set<Long> partitionIds = tableToLoadPartitions.get(table.getId());
                     OlapTable olapTable = (OlapTable) table;
                     for (long partitionId : partitionIds) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/SparkLoadPendingTask.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/SparkLoadPendingTask.java
index 33590743ab..ad56376c03 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/SparkLoadPendingTask.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/SparkLoadPendingTask.java
@@ -131,8 +131,8 @@ public class SparkLoadPendingTask extends LoadTask {
     }
 
     private void createEtlJobConf() throws LoadException {
-        Database db = Catalog.getCurrentCatalog().getDbOrException(
-                dbId, s -> new LoadException("db does not exist. id: " + s));
+        Database db = Catalog.getCurrentInternalCatalog()
+                .getDbOrException(dbId, s -> new LoadException("db does not exist. id: " + s));
 
         Map<Long, EtlTable> tables = Maps.newHashMap();
         Map<Long, Set<Long>> tableIdToPartitionIds = Maps.newHashMap();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/KafkaRoutineLoadJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/KafkaRoutineLoadJob.java
index f1401e5884..9b16af079a 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/KafkaRoutineLoadJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/KafkaRoutineLoadJob.java
@@ -385,7 +385,7 @@ public class KafkaRoutineLoadJob extends RoutineLoadJob {
 
     public static KafkaRoutineLoadJob fromCreateStmt(CreateRoutineLoadStmt stmt) throws UserException {
         // check db and table
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(stmt.getDBName());
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(stmt.getDBName());
         OlapTable olapTable = db.getOlapTableOrDdlException(stmt.getTableName());
         checkMeta(olapTable, stmt.getRoutineLoadDesc());
         long tableId = olapTable.getId();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/KafkaTaskInfo.java b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/KafkaTaskInfo.java
index d522bd9ebe..5169bceb68 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/KafkaTaskInfo.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/KafkaTaskInfo.java
@@ -79,7 +79,8 @@ public class KafkaTaskInfo extends RoutineLoadTaskInfo {
         tRoutineLoadTask.setId(queryId);
         tRoutineLoadTask.setJobId(jobId);
         tRoutineLoadTask.setTxnId(txnId);
-        Database database = Catalog.getCurrentCatalog().getDbOrMetaException(routineLoadJob.getDbId());
+        Database database =
+                Catalog.getCurrentInternalCatalog().getDbOrMetaException(routineLoadJob.getDbId());
         Table tbl = database.getTableOrMetaException(routineLoadJob.getTableId());
         tRoutineLoadTask.setDb(database.getFullName());
         tRoutineLoadTask.setTbl(tbl.getName());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadJob.java
index 940715c096..7ee83e36c9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadJob.java
@@ -405,7 +405,7 @@ public abstract class RoutineLoadJob extends AbstractTxnStateChangeCallback impl
     }
 
     public String getDbFullName() throws MetaNotFoundException {
-        return Catalog.getCurrentCatalog().getDbOrMetaException(dbId).getFullName();
+        return Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId).getFullName();
     }
 
     public long getTableId() {
@@ -413,7 +413,7 @@ public abstract class RoutineLoadJob extends AbstractTxnStateChangeCallback impl
     }
 
     public String getTableName() throws MetaNotFoundException {
-        Database database = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database database = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         return database.getTableOrMetaException(tableId).getName();
     }
 
@@ -785,14 +785,14 @@ public abstract class RoutineLoadJob extends AbstractTxnStateChangeCallback impl
     }
 
     private void initPlanner() throws UserException {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         planner = new StreamLoadPlanner(db,
             (OlapTable) db.getTableOrMetaException(this.tableId, Table.TableType.OLAP), this);
     }
 
     public TExecPlanFragmentParams plan(TUniqueId loadId, long txnId) throws UserException {
         Preconditions.checkNotNull(planner);
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         Table table = db.getTableOrMetaException(tableId, Table.TableType.OLAP);
         table.readLock();
         try {
@@ -1204,7 +1204,7 @@ public abstract class RoutineLoadJob extends AbstractTxnStateChangeCallback impl
 
     public void update() throws UserException {
         // check if db and table exist
-        Database database = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        Database database = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (database == null) {
             LOG.warn(new LogBuilder(LogKey.ROUTINE_LOAD_JOB, id)
                              .add("db_id", dbId)
@@ -1285,7 +1285,7 @@ public abstract class RoutineLoadJob extends AbstractTxnStateChangeCallback impl
     protected abstract String getLag();
 
     public List<String> getShowInfo() {
-        Optional<Database> database = Catalog.getCurrentCatalog().getDb(dbId);
+        Optional<Database> database = Catalog.getCurrentInternalCatalog().getDb(dbId);
         Optional<Table> table = database.flatMap(db -> db.getTable(tableId));
 
 
@@ -1341,7 +1341,7 @@ public abstract class RoutineLoadJob extends AbstractTxnStateChangeCallback impl
     }
 
     public String getShowCreateInfo() {
-        Optional<Database> database = Catalog.getCurrentCatalog().getDb(dbId);
+        Optional<Database> database = Catalog.getCurrentInternalCatalog().getDb(dbId);
         Optional<Table> table = database.flatMap(db -> db.getTable(tableId));
         StringBuilder sb = new StringBuilder();
         // 1.job_name
@@ -1434,7 +1434,7 @@ public abstract class RoutineLoadJob extends AbstractTxnStateChangeCallback impl
     }
 
     public List<String> getShowStatistic() {
-        Optional<Database> database = Catalog.getCurrentCatalog().getDb(dbId);
+        Optional<Database> database = Catalog.getCurrentInternalCatalog().getDb(dbId);
 
         List<String> row = Lists.newArrayList();
         row.add(name);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadManager.java b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadManager.java
index 24e1b19037..2136308e60 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/routineload/RoutineLoadManager.java
@@ -247,7 +247,7 @@ public class RoutineLoadManager implements Writable {
             throws MetaNotFoundException, DdlException, AnalysisException {
 
         List<RoutineLoadJob> result = Lists.newArrayList();
-        Database database = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database database = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
         long dbId = database.getId();
         Map<String, List<RoutineLoadJob>> jobMap = dbToNameToRoutineLoadJob.get(dbId);
         if (jobMap == null) {
@@ -510,7 +510,7 @@ public class RoutineLoadManager implements Writable {
 
     private Set<Tag> getTagsFromReplicaAllocation(long dbId, long tblId) throws LoadException {
         try {
-            Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
             OlapTable tbl = (OlapTable) db.getTableOrMetaException(tblId, Table.TableType.OLAP);
             tbl.readLock();
             try {
@@ -565,7 +565,7 @@ public class RoutineLoadManager implements Writable {
                 break RESULT;
             }
 
-            Database database = Catalog.getCurrentCatalog().getDbOrMetaException(dbFullName);
+            Database database = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbFullName);
             long dbId = database.getId();
             if (!dbToNameToRoutineLoadJob.containsKey(dbId)) {
                 result = new ArrayList<>();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/sync/SyncJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/sync/SyncJob.java
index cf0094fa5d..fb80fc37ce 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/sync/SyncJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/sync/SyncJob.java
@@ -117,7 +117,7 @@ public abstract class SyncJob implements Writable {
 
     public static SyncJob fromStmt(long jobId, CreateDataSyncJobStmt stmt) throws DdlException {
         String dbName = stmt.getDbName();
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
         SyncJob syncJob;
         try {
             switch (stmt.getDataSyncJobType()) {
@@ -207,7 +207,7 @@ public abstract class SyncJob implements Writable {
     }
 
     public void checkAndDoUpdate() throws UserException {
-        Database database = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        Database database = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (database == null) {
             if (!isCompleted()) {
                 String msg = "The database has been deleted. Change job state to cancelled";
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/sync/SyncJobManager.java b/fe/fe-core/src/main/java/org/apache/doris/load/sync/SyncJobManager.java
index d42821dfef..6575d7ed1b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/sync/SyncJobManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/sync/SyncJobManager.java
@@ -111,7 +111,7 @@ public class SyncJobManager implements Writable {
         String dbName = stmt.getDbFullName();
         String jobName = stmt.getJobName();
 
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
 
         List<SyncJob> syncJobs = Lists.newArrayList();
         readLock();
@@ -142,7 +142,7 @@ public class SyncJobManager implements Writable {
         String dbName = stmt.getDbFullName();
         String jobName = stmt.getJobName();
 
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
 
         List<SyncJob> syncJobs = Lists.newArrayList();
         readLock();
@@ -173,7 +173,7 @@ public class SyncJobManager implements Writable {
         String dbName = stmt.getDbFullName();
         String jobName = stmt.getJobName();
 
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
 
         // List of sync jobs waiting to be cancelled
         List<SyncJob> syncJobs = Lists.newArrayList();
@@ -251,7 +251,7 @@ public class SyncJobManager implements Writable {
     }
 
     public boolean isJobNameExist(String dbName, String jobName) throws DdlException {
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbName);
         boolean result = false;
         readLock();
         try {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/sync/canal/CanalSyncJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/sync/canal/CanalSyncJob.java
index 3b440f783e..c5a7b47cee 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/sync/canal/CanalSyncJob.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/sync/canal/CanalSyncJob.java
@@ -91,7 +91,7 @@ public class CanalSyncJob extends SyncJob {
         if (channels == null) {
             channels = Lists.newArrayList();
         }
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbId);
         db.writeLock();
         try {
             for (ChannelDescription channelDescription : channelDescriptions) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/update/UpdateStmtExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/load/update/UpdateStmtExecutor.java
index 400aab727b..deda7ed742 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/load/update/UpdateStmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/load/update/UpdateStmtExecutor.java
@@ -184,10 +184,8 @@ public class UpdateStmtExecutor {
         try {
             LOG.info("commit and publish transaction for update stmt, query id: {}", DebugUtil.printId(queryId));
             isPublished = globalTransactionMgr.commitAndPublishTransaction(
-                    Catalog.getCurrentCatalog().getDbOrMetaException(dbId),
-                    Lists.newArrayList(targetTable),
-                    txnId,
-                    TabletCommitInfo.fromThrift(coordinator.getCommitInfos()),
+                    Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId),
+                    Lists.newArrayList(targetTable), txnId, TabletCommitInfo.fromThrift(coordinator.getCommitInfos()),
                     analyzer.getContext().getSessionVariable().getInsertVisibleTimeoutMs());
         } catch (Throwable e) {
             // situation2.1: publish error, throw exception
@@ -226,7 +224,8 @@ public class UpdateStmtExecutor {
         updateStmtExecutor.targetTable = (OlapTable) updateStmt.getTargetTable();
         updateStmtExecutor.whereExpr = updateStmt.getWhereExpr();
         updateStmtExecutor.setExprs = updateStmt.getSetExprs();
-        Database database = Catalog.getCurrentCatalog().getDbOrAnalysisException(updateStmt.getTableName().getDb());
+        Database database = Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException(updateStmt.getTableName().getDb());
         updateStmtExecutor.dbId = database.getId();
         updateStmtExecutor.analyzer = updateStmt.getAnalyzer();
         updateStmtExecutor.queryId = updateStmtExecutor.analyzer.getContext().queryId();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/master/MasterImpl.java b/fe/fe-core/src/main/java/org/apache/doris/master/MasterImpl.java
index 1593dd737b..06cb76329e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/master/MasterImpl.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/master/MasterImpl.java
@@ -292,7 +292,7 @@ public class MasterImpl {
         long backendId = pushTask.getBackendId();
         long signature = task.getSignature();
         long transactionId = ((PushTask) task).getTransactionId();
-        Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (db == null) {
             AgentTaskQueue.removeTask(backendId, TTaskType.REALTIME_PUSH, signature);
             return;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/master/PartitionInMemoryInfoCollector.java b/fe/fe-core/src/main/java/org/apache/doris/master/PartitionInMemoryInfoCollector.java
index 78e2c7ffa6..f4e78b6277 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/master/PartitionInMemoryInfoCollector.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/master/PartitionInMemoryInfoCollector.java
@@ -49,9 +49,9 @@ public class PartitionInMemoryInfoCollector extends MasterDaemon {
         Catalog catalog = Catalog.getCurrentCatalog();
         TabletInvertedIndex tabletInvertedIndex = catalog.getTabletInvertedIndex();
         ImmutableSet.Builder builder = ImmutableSet.builder();
-        List<Long> dbIdList = catalog.getDbIds();
+        List<Long> dbIdList = catalog.getInternalDataSource().getDbIds();
         for (Long dbId : dbIdList) {
-            Database db = catalog.getDbNullable(dbId);
+            Database db = catalog.getInternalDataSource().getDbNullable(dbId);
             if (db == null) {
                 LOG.warn("Database [" + dbId + "] does not exist, skip to update database used data quota");
                 continue;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/master/ReportHandler.java b/fe/fe-core/src/main/java/org/apache/doris/master/ReportHandler.java
index 79f9d131ac..96719a2987 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/master/ReportHandler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/master/ReportHandler.java
@@ -395,7 +395,7 @@ public class ReportHandler extends Daemon {
                              long backendId, long backendReportVersion) {
         TabletInvertedIndex invertedIndex = Catalog.getCurrentInvertedIndex();
         for (Long dbId : tabletSyncMap.keySet()) {
-            Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
             if (db == null) {
                 continue;
             }
@@ -514,7 +514,7 @@ public class ReportHandler extends Daemon {
         AgentBatchTask createReplicaBatchTask = new AgentBatchTask();
         TabletInvertedIndex invertedIndex = Catalog.getCurrentInvertedIndex();
         for (Long dbId : tabletDeleteFromMeta.keySet()) {
-            Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
             if (db == null) {
                 continue;
             }
@@ -779,7 +779,7 @@ public class ReportHandler extends Daemon {
         TabletInvertedIndex invertedIndex = Catalog.getCurrentInvertedIndex();
         BackendReplicasInfo backendReplicasInfo = new BackendReplicasInfo(backendId);
         for (Long dbId : tabletRecoveryMap.keySet()) {
-            Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
             if (db == null) {
                 continue;
             }
@@ -895,7 +895,7 @@ public class ReportHandler extends Daemon {
         long dataSize = backendTabletInfo.getDataSize();
         long rowCount = backendTabletInfo.getRowCount();
 
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(dbId);
         OlapTable olapTable = (OlapTable) db.getTableOrMetaException(tableId, Table.TableType.OLAP);
         olapTable.writeLockOrMetaException();
         try {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
index ec3c170b75..88a4b38f02 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
@@ -62,7 +62,7 @@ public class BindRelation extends OneAnalysisRuleFactory {
 
     private Table getTable(List<String> qualifier, Catalog catalog) {
         String dbName = qualifier.get(0);
-        Database db = catalog.getDb(dbName)
+        Database db = catalog.getInternalDataSource().getDb(dbName)
                 .orElseThrow(() -> new RuntimeException("Database [" + dbName + "] does not exist."));
         db.readLock();
         try {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java b/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java
index 6f1995677f..0871855d20 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/persist/EditLog.java
@@ -194,7 +194,8 @@ public class EditLog {
                 }
                 case OperationType.OP_DROP_TABLE: {
                     DropInfo info = (DropInfo) journal.getData();
-                    Database db = Catalog.getCurrentCatalog().getDbOrMetaException(info.getDbId());
+                    Database db =
+                            Catalog.getCurrentInternalCatalog().getDbOrMetaException(info.getDbId());
                     LOG.info("Begin to unprotect drop table. db = "
                             + db.getFullName() + " table = " + info.getTableId());
                     catalog.replayDropTable(db, info.getTableId(), info.isForceDrop());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/policy/DropPolicyLog.java b/fe/fe-core/src/main/java/org/apache/doris/policy/DropPolicyLog.java
index 04f854fd84..7d85c812f9 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/policy/DropPolicyLog.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/policy/DropPolicyLog.java
@@ -70,7 +70,7 @@ public class DropPolicyLog implements Writable {
                 if (curDb == null) {
                     curDb = ConnectContext.get().getDatabase();
                 }
-                Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(curDb);
+                Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(curDb);
                 Table table = db.getTableOrAnalysisException(stmt.getTableName().getTbl());
                 return new DropPolicyLog(db.getId(), table.getId(), stmt.getType(),
                                          stmt.getPolicyName(), stmt.getUser());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/policy/Policy.java b/fe/fe-core/src/main/java/org/apache/doris/policy/Policy.java
index 332b9a0026..47f8dcb149 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/policy/Policy.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/policy/Policy.java
@@ -20,8 +20,8 @@ package org.apache.doris.policy;
 import org.apache.doris.analysis.CreatePolicyStmt;
 import org.apache.doris.analysis.UserIdentity;
 import org.apache.doris.catalog.Catalog;
-import org.apache.doris.catalog.Database;
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.DatabaseIf;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.io.Text;
 import org.apache.doris.common.io.Writable;
@@ -88,10 +88,10 @@ public abstract class Policy implements Writable, GsonPostProcessable {
                 if (curDb == null) {
                     curDb = ConnectContext.get().getDatabase();
                 }
-                Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(curDb);
+                DatabaseIf db = Catalog.getCurrentCatalog().getCurrentDataSource().getDbOrAnalysisException(curDb);
                 UserIdentity userIdent = stmt.getUser();
                 userIdent.analyze(ConnectContext.get().getClusterName());
-                Table table = db.getTableOrAnalysisException(stmt.getTableName().getTbl());
+                TableIf table = db.getTableOrAnalysisException(stmt.getTableName().getTbl());
                 return new RowPolicy(stmt.getType(), stmt.getPolicyName(), db.getId(), userIdent,
                     stmt.getOrigStmt().originStmt, table.getId(), stmt.getFilterType(),
                     stmt.getWherePredicate());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/policy/RowPolicy.java b/fe/fe-core/src/main/java/org/apache/doris/policy/RowPolicy.java
index b989583a4e..94c0458069 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/policy/RowPolicy.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/policy/RowPolicy.java
@@ -118,7 +118,7 @@ public class RowPolicy extends Policy {
      * Use for SHOW POLICY.
      **/
     public List<String> getShowInfo() throws AnalysisException {
-        Database database = Catalog.getCurrentCatalog().getDbOrAnalysisException(this.dbId);
+        Database database = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(this.dbId);
         Table table = database.getTableOrAnalysisException(this.tableId);
         return Lists.newArrayList(this.policyName, database.getFullName(), table.getName(), this.type.name(),
                 this.filterType.name(), this.wherePredicate.toSql(), this.user.getQualifiedUser(), this.originStmt);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
index 724278af10..33f15e0f1f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
@@ -19,7 +19,7 @@ package org.apache.doris.qe;
 
 import org.apache.doris.analysis.UserIdentity;
 import org.apache.doris.catalog.Catalog;
-import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.cluster.ClusterNamespace;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.DebugUtil;
@@ -44,6 +44,7 @@ import org.apache.logging.log4j.Logger;
 
 import java.nio.channels.SocketChannel;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 
 // When one client connect in, we create a connect context for it.
@@ -427,7 +428,8 @@ public class ConnectContext {
 
     public void setDatabase(String db) {
         currentDb = db;
-        currentDbId = Catalog.getCurrentCatalog().getDb(db).map(Database::getId).orElse(-1L);
+        Optional<DatabaseIf> dbInstance = Catalog.getCurrentCatalog().getCurrentDataSource().getDb(db);
+        currentDbId = dbInstance.isPresent() ? dbInstance.get().getId() : -1;
     }
 
     public void setExecutor(StmtExecutor executor) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
index c83f5eeb45..48400a820f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectProcessor.java
@@ -26,8 +26,8 @@ import org.apache.doris.analysis.StatementBase;
 import org.apache.doris.analysis.UserIdentity;
 import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Column;
-import org.apache.doris.catalog.Database;
-import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.DatabaseIf;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.cluster.ClusterNamespace;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.Config;
@@ -311,12 +311,12 @@ public class ConnectProcessor {
             ctx.getState().setError(ErrorCode.ERR_UNKNOWN_TABLE, "Empty tableName");
             return;
         }
-        Database db = ctx.getCatalog().getDbNullable(ctx.getDatabase());
+        DatabaseIf db = ctx.getCatalog().getCurrentDataSource().getDbNullable(ctx.getDatabase());
         if (db == null) {
             ctx.getState().setError(ErrorCode.ERR_BAD_DB_ERROR, "Unknown database(" + ctx.getDatabase() + ")");
             return;
         }
-        Table table = db.getTableNullable(tableName);
+        TableIf table = db.getTableNullable(tableName);
         if (table == null) {
             ctx.getState().setError(ErrorCode.ERR_UNKNOWN_TABLE, "Unknown table(" + tableName + ")");
             return;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
index 7b1cba596e..1ed634f087 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ShowExecutor.java
@@ -99,6 +99,7 @@ import org.apache.doris.catalog.BrokerMgr;
 import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.DynamicPartitionProperty;
 import org.apache.doris.catalog.EncryptKey;
 import org.apache.doris.catalog.Function;
@@ -113,6 +114,7 @@ import org.apache.doris.catalog.Replica;
 import org.apache.doris.catalog.ReplicaAllocation;
 import org.apache.doris.catalog.ScalarType;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.Tablet;
 import org.apache.doris.catalog.TabletInvertedIndex;
 import org.apache.doris.catalog.TabletMeta;
@@ -411,37 +413,41 @@ public class ShowExecutor {
     // Handle show functions
     private void handleShowFunctions() throws AnalysisException {
         ShowFunctionsStmt showStmt = (ShowFunctionsStmt) stmt;
-        Database db = ctx.getCatalog().getDbOrAnalysisException(showStmt.getDbName());
-        List<Function> functions = showStmt.getIsBuiltin() ? ctx.getCatalog().getBuiltinFunctions() : db.getFunctions();
+        DatabaseIf db = ctx.getCatalog().getCurrentDataSource().getDbOrAnalysisException(showStmt.getDbName());
 
-        List<List<Comparable>> rowSet = Lists.newArrayList();
-        for (Function function : functions) {
-            List<Comparable> row = function.getInfo(showStmt.getIsVerbose());
-            // like predicate
-            if (showStmt.getWild() == null || showStmt.like(function.functionName())) {
-                rowSet.add(row);
-            }
-        }
-
-        // sort function rows by first column asc
-        ListComparator<List<Comparable>> comparator = null;
-        OrderByPair orderByPair = new OrderByPair(0, false);
-        comparator = new ListComparator<>(orderByPair);
-        Collections.sort(rowSet, comparator);
         List<List<String>> resultRowSet = Lists.newArrayList();
-
-        Set<String> functionNameSet = new HashSet<>();
-        for (List<Comparable> row : rowSet) {
-            List<String> resultRow = Lists.newArrayList();
-            // if not verbose, remove duplicate function name
-            if (functionNameSet.contains(row.get(0).toString())) {
-                continue;
+        if (db instanceof Database) {
+            List<Function> functions =
+                    showStmt.getIsBuiltin() ? ctx.getCatalog().getBuiltinFunctions() : ((Database) db).getFunctions();
+
+            List<List<Comparable>> rowSet = Lists.newArrayList();
+            for (Function function : functions) {
+                List<Comparable> row = function.getInfo(showStmt.getIsVerbose());
+                // like predicate
+                if (showStmt.getWild() == null || showStmt.like(function.functionName())) {
+                    rowSet.add(row);
+                }
             }
-            for (Comparable column : row) {
-                resultRow.add(column.toString());
+
+            // sort function rows by first column asc
+            ListComparator<List<Comparable>> comparator = null;
+            OrderByPair orderByPair = new OrderByPair(0, false);
+            comparator = new ListComparator<>(orderByPair);
+            Collections.sort(rowSet, comparator);
+
+            Set<String> functionNameSet = new HashSet<>();
+            for (List<Comparable> row : rowSet) {
+                List<String> resultRow = Lists.newArrayList();
+                // if not verbose, remove duplicate function name
+                if (functionNameSet.contains(row.get(0).toString())) {
+                    continue;
+                }
+                for (Comparable column : row) {
+                    resultRow.add(column.toString());
+                }
+                resultRowSet.add(resultRow);
+                functionNameSet.add(resultRow.get(0));
             }
-            resultRowSet.add(resultRow);
-            functionNameSet.add(resultRow.get(0));
         }
 
         // Only success
@@ -454,48 +460,51 @@ public class ShowExecutor {
     // Handle show create function
     private void handleShowCreateFunction() throws AnalysisException {
         ShowCreateFunctionStmt showCreateFunctionStmt = (ShowCreateFunctionStmt) stmt;
-        Database db = ctx.getCatalog().getDbOrAnalysisException(showCreateFunctionStmt.getDbName());
-
-        Function function = db.getFunction(showCreateFunctionStmt.getFunction());
+        DatabaseIf db =
+                ctx.getCatalog().getCurrentDataSource().getDbOrAnalysisException(showCreateFunctionStmt.getDbName());
         List<List<String>> resultRowSet = Lists.newArrayList();
-        List<String> resultRow = Lists.newArrayList();
-        resultRow.add(function.signatureString());
-        resultRow.add(function.toSql(false));
-        resultRowSet.add(resultRow);
+        if (db instanceof Database) {
+            Function function = ((Database) db).getFunction(showCreateFunctionStmt.getFunction());
+            List<String> resultRow = Lists.newArrayList();
+            resultRow.add(function.signatureString());
+            resultRow.add(function.toSql(false));
+            resultRowSet.add(resultRow);
+        }
         resultSet = new ShowResultSet(showCreateFunctionStmt.getMetaData(), resultRowSet);
     }
 
     // Handle show encryptkeys
     private void handleShowEncryptKeys() throws AnalysisException {
         ShowEncryptKeysStmt showStmt = (ShowEncryptKeysStmt) stmt;
-        Database db = ctx.getCatalog().getDbOrAnalysisException(showStmt.getDbName());
-        List<EncryptKey> encryptKeys = db.getEncryptKeys();
+        DatabaseIf db = ctx.getCatalog().getCurrentDataSource().getDbOrAnalysisException(showStmt.getDbName());
+        List<List<String>> resultRowSet = Lists.newArrayList();
+        if (db instanceof Database) {
+            List<EncryptKey> encryptKeys = ((Database) db).getEncryptKeys();
+            List<List<Comparable>> rowSet = Lists.newArrayList();
+            for (EncryptKey encryptKey : encryptKeys) {
+                List<Comparable> row = encryptKey.getInfo();
+                // like predicate
+                if (showStmt.getWild() == null || showStmt.like(encryptKey.getEncryptKeyName().getKeyName())) {
+                    rowSet.add(row);
+                }
 
-        List<List<Comparable>> rowSet = Lists.newArrayList();
-        for (EncryptKey encryptKey : encryptKeys) {
-            List<Comparable> row = encryptKey.getInfo();
-            // like predicate
-            if (showStmt.getWild() == null || showStmt.like(encryptKey.getEncryptKeyName().getKeyName())) {
-                rowSet.add(row);
             }
 
-        }
-
-        // sort function rows by first column asc
-        ListComparator<List<Comparable>> comparator = null;
-        OrderByPair orderByPair = new OrderByPair(0, false);
-        comparator = new ListComparator<>(orderByPair);
-        Collections.sort(rowSet, comparator);
-        List<List<String>> resultRowSet = Lists.newArrayList();
-
-        Set<String> encryptKeyNameSet = new HashSet<>();
-        for (List<Comparable> row : rowSet) {
-            List<String> resultRow = Lists.newArrayList();
-            for (Comparable column : row) {
-                resultRow.add(column.toString());
+            // sort function rows by first column asc
+            ListComparator<List<Comparable>> comparator = null;
+            OrderByPair orderByPair = new OrderByPair(0, false);
+            comparator = new ListComparator<>(orderByPair);
+            Collections.sort(rowSet, comparator);
+
+            Set<String> encryptKeyNameSet = new HashSet<>();
+            for (List<Comparable> row : rowSet) {
+                List<String> resultRow = Lists.newArrayList();
+                for (Comparable column : row) {
+                    resultRow.add(column.toString());
+                }
+                resultRowSet.add(resultRow);
+                encryptKeyNameSet.add(resultRow.get(0));
             }
-            resultRowSet.add(resultRow);
-            encryptKeyNameSet.add(resultRow.get(0));
         }
 
         ShowResultSetMetaData showMetaData = showStmt.getMetaData();
@@ -563,7 +572,7 @@ public class ShowExecutor {
         long dbId = showStmt.getDbId();
         List<List<String>> rows = Lists.newArrayList();
         Catalog catalog = ctx.getCatalog();
-        Database database = catalog.getDbNullable(dbId);
+        DatabaseIf database = catalog.getCurrentDataSource().getDbNullable(dbId);
         if (database != null) {
             List<String> row = new ArrayList<>();
             row.add(database.getFullName());
@@ -577,14 +586,14 @@ public class ShowExecutor {
         long tableId = showStmt.getTableId();
         List<List<String>> rows = Lists.newArrayList();
         Catalog catalog = ctx.getCatalog();
-        List<Long> dbIds = catalog.getDbIds();
+        List<Long> dbIds = catalog.getInternalDataSource().getDbIds();
         // TODO should use inverted index
         for (long dbId : dbIds) {
-            Database database = catalog.getDbNullable(dbId);
+            Database database = catalog.getInternalDataSource().getDbNullable(dbId);
             if (database == null) {
                 continue;
             }
-            Table table = database.getTableNullable(tableId);
+            TableIf table = database.getTableNullable(tableId);
             if (table != null) {
                 List<String> row = new ArrayList<>();
                 row.add(database.getFullName());
@@ -602,10 +611,10 @@ public class ShowExecutor {
         long partitionId = showStmt.getPartitionId();
         List<List<String>> rows = Lists.newArrayList();
         Catalog catalog = ctx.getCatalog();
-        List<Long> dbIds = catalog.getDbIds();
+        List<Long> dbIds = catalog.getInternalDataSource().getDbIds();
         // TODO should use inverted index
         for (long dbId : dbIds) {
-            Database database = catalog.getDbNullable(dbId);
+            Database database = catalog.getInternalDataSource().getDbNullable(dbId);
             if (database == null) {
                 continue;
             }
@@ -638,7 +647,7 @@ public class ShowExecutor {
     private void handleShowDb() throws AnalysisException {
         ShowDbStmt showDbStmt = (ShowDbStmt) stmt;
         List<List<String>> rows = Lists.newArrayList();
-        List<String> dbNames = ctx.getCatalog().getClusterDbNames(ctx.getClusterName());
+        List<String> dbNames = ctx.getCatalog().getInternalDataSource().getClusterDbNames(ctx.getClusterName());
         PatternMatcher matcher = null;
         if (showDbStmt.getPattern() != null) {
             matcher = PatternMatcher.createMysqlPattern(showDbStmt.getPattern(),
@@ -671,20 +680,20 @@ public class ShowExecutor {
     private void handleShowTable() throws AnalysisException {
         ShowTableStmt showTableStmt = (ShowTableStmt) stmt;
         List<List<String>> rows = Lists.newArrayList();
-        Database db = ctx.getCatalog().getDbOrAnalysisException(showTableStmt.getDb());
+        DatabaseIf<TableIf> db =
+                ctx.getCatalog().getCurrentDataSource().getDbOrAnalysisException(showTableStmt.getDb());
         PatternMatcher matcher = null;
         if (showTableStmt.getPattern() != null) {
             matcher = PatternMatcher.createMysqlPattern(showTableStmt.getPattern(),
                     CaseSensibility.TABLE.getCaseSensibility());
         }
-        for (Table tbl : db.getTables()) {
+        for (TableIf tbl : db.getTables()) {
             if (matcher != null && !matcher.match(tbl.getName())) {
                 continue;
             }
             // check tbl privs
-            if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(),
-                    db.getFullName(), tbl.getName(),
-                    PrivPredicate.SHOW)) {
+            if (!Catalog.getCurrentCatalog().getAuth()
+                    .checkTblPriv(ConnectContext.get(), db.getFullName(), tbl.getName(), PrivPredicate.SHOW)) {
                 continue;
             }
             if (showTableStmt.isVerbose()) {
@@ -704,22 +713,21 @@ public class ShowExecutor {
     private void handleShowTableStatus() throws AnalysisException {
         ShowTableStatusStmt showStmt = (ShowTableStatusStmt) stmt;
         List<List<String>> rows = Lists.newArrayList();
-        Database db = ctx.getCatalog().getDbNullable(showStmt.getDb());
+        DatabaseIf<TableIf> db = ctx.getCatalog().getCurrentDataSource().getDbNullable(showStmt.getDb());
         if (db != null) {
             PatternMatcher matcher = null;
             if (showStmt.getPattern() != null) {
                 matcher = PatternMatcher.createMysqlPattern(showStmt.getPattern(),
                         CaseSensibility.TABLE.getCaseSensibility());
             }
-            for (Table table : db.getTables()) {
+            for (TableIf table : db.getTables()) {
                 if (matcher != null && !matcher.match(table.getName())) {
                     continue;
                 }
 
                 // check tbl privs
-                if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(),
-                        db.getFullName(), table.getName(),
-                        PrivPredicate.SHOW)) {
+                if (!Catalog.getCurrentCatalog().getAuth()
+                        .checkTblPriv(ConnectContext.get(), db.getFullName(), table.getName(), PrivPredicate.SHOW)) {
                     continue;
                 }
                 List<String> row = Lists.newArrayList();
@@ -789,7 +797,7 @@ public class ShowExecutor {
     private void handleShowCreateDb() throws AnalysisException {
         ShowCreateDbStmt showStmt = (ShowCreateDbStmt) stmt;
         List<List<String>> rows = Lists.newArrayList();
-        Database db = ctx.getCatalog().getDbOrAnalysisException(showStmt.getDb());
+        DatabaseIf db = ctx.getCatalog().getCurrentDataSource().getDbOrAnalysisException(showStmt.getDb());
         StringBuilder sb = new StringBuilder();
         sb.append("CREATE DATABASE `").append(ClusterNamespace.getNameFromFullName(showStmt.getDb())).append("`");
         if (db.getDbProperties().getProperties().size() > 0) {
@@ -805,8 +813,8 @@ public class ShowExecutor {
     // Show create table
     private void handleShowCreateTable() throws AnalysisException {
         ShowCreateTableStmt showStmt = (ShowCreateTableStmt) stmt;
-        Database db = ctx.getCatalog().getDbOrAnalysisException(showStmt.getDb());
-        Table table = db.getTableOrAnalysisException(showStmt.getTable());
+        DatabaseIf db = ctx.getCatalog().getCurrentDataSource().getDbOrAnalysisException(showStmt.getDb());
+        TableIf table = db.getTableOrAnalysisException(showStmt.getTable());
         List<List<String>> rows = Lists.newArrayList();
 
         table.readLock();
@@ -844,8 +852,8 @@ public class ShowExecutor {
     private void handleShowColumn() throws AnalysisException {
         ShowColumnStmt showStmt = (ShowColumnStmt) stmt;
         List<List<String>> rows = Lists.newArrayList();
-        Database db = ctx.getCatalog().getDbOrAnalysisException(showStmt.getDb());
-        Table table = db.getTableOrAnalysisException(showStmt.getTable());
+        DatabaseIf db = ctx.getCatalog().getCurrentDataSource().getDbOrAnalysisException(showStmt.getDb());
+        TableIf table = db.getTableOrAnalysisException(showStmt.getTable());
         PatternMatcher matcher = null;
         if (showStmt.getPattern() != null) {
             matcher = PatternMatcher.createMysqlPattern(showStmt.getPattern(),
@@ -896,7 +904,7 @@ public class ShowExecutor {
     private void handleShowIndex() throws AnalysisException {
         ShowIndexStmt showStmt = (ShowIndexStmt) stmt;
         List<List<String>> rows = Lists.newArrayList();
-        Database db = ctx.getCatalog().getDbOrAnalysisException(showStmt.getDbName());
+        DatabaseIf db = ctx.getCatalog().getCurrentDataSource().getDbOrAnalysisException(showStmt.getDbName());
 
         OlapTable table = db.getOlapTableOrAnalysisException(showStmt.getTableName().getTbl());
         table.readLock();
@@ -996,7 +1004,7 @@ public class ShowExecutor {
         ShowLoadStmt showStmt = (ShowLoadStmt) stmt;
 
         Catalog catalog = Catalog.getCurrentCatalog();
-        Database db = catalog.getDbOrAnalysisException(showStmt.getDbName());
+        DatabaseIf db = catalog.getCurrentDataSource().getDbOrAnalysisException(showStmt.getDbName());
         long dbId = db.getId();
 
         // combine the List<LoadInfo> of load(v1) and loadManager(v2)
@@ -1060,7 +1068,7 @@ public class ShowExecutor {
         ShowStreamLoadStmt showStmt = (ShowStreamLoadStmt) stmt;
 
         Catalog catalog = Catalog.getCurrentCatalog();
-        Database db = catalog.getDbOrAnalysisException(showStmt.getDbName());
+        Database db = catalog.getInternalDataSource().getDbOrAnalysisException(showStmt.getDbName());
         long dbId = db.getId();
 
         List<List<Comparable>> streamLoadRecords = catalog.getStreamLoadRecordMgr().getStreamLoadRecordByDb(
@@ -1115,7 +1123,7 @@ public class ShowExecutor {
         }
 
         Catalog catalog = Catalog.getCurrentCatalog();
-        Database db = catalog.getDbOrAnalysisException(showWarningsStmt.getDbName());
+        Database db = catalog.getInternalDataSource().getDbOrAnalysisException(showWarningsStmt.getDbName());
 
         long dbId = db.getId();
         Load load = catalog.getLoadInstance();
@@ -1341,7 +1349,7 @@ public class ShowExecutor {
         ShowDeleteStmt showStmt = (ShowDeleteStmt) stmt;
 
         Catalog catalog = Catalog.getCurrentCatalog();
-        Database db = catalog.getDbOrAnalysisException(showStmt.getDbName());
+        Database db = catalog.getInternalDataSource().getDbOrAnalysisException(showStmt.getDbName());
         long dbId = db.getId();
 
         DeleteHandler deleteHandler = catalog.getDeleteHandler();
@@ -1429,7 +1437,7 @@ public class ShowExecutor {
             int tabletIdx = -1;
             // check real meta
             do {
-                Database db = catalog.getDbNullable(dbId);
+                Database db = catalog.getInternalDataSource().getDbNullable(dbId);
                 if (db == null) {
                     isSync = false;
                     break;
@@ -1493,7 +1501,7 @@ public class ShowExecutor {
                     partitionId.toString(), indexId.toString(),
                     isSync.toString(), String.valueOf(tabletIdx), detailCmd));
         } else {
-            Database db = catalog.getDbOrAnalysisException(showStmt.getDbName());
+            Database db = catalog.getInternalDataSource().getDbOrAnalysisException(showStmt.getDbName());
             OlapTable olapTable = db.getOlapTableOrAnalysisException(showStmt.getTableName());
 
             olapTable.readLock();
@@ -1642,7 +1650,7 @@ public class ShowExecutor {
     private void handleShowExport() throws AnalysisException {
         ShowExportStmt showExportStmt = (ShowExportStmt) stmt;
         Catalog catalog = Catalog.getCurrentCatalog();
-        Database db = catalog.getDbOrAnalysisException(showExportStmt.getDbName());
+        Database db = catalog.getInternalDataSource().getDbOrAnalysisException(showExportStmt.getDbName());
         long dbId = db.getId();
 
         ExportMgr exportMgr = catalog.getExportMgr();
@@ -1701,7 +1709,7 @@ public class ShowExecutor {
 
     private void handleShowBackup() throws AnalysisException {
         ShowBackupStmt showStmt = (ShowBackupStmt) stmt;
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(showStmt.getDbName());
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(showStmt.getDbName());
 
         List<AbstractJob> jobs = Catalog.getCurrentCatalog().getBackupHandler()
                 .getJobs(db.getId(), showStmt.getLabelPredicate());
@@ -1716,7 +1724,7 @@ public class ShowExecutor {
 
     private void handleShowRestore() throws AnalysisException {
         ShowRestoreStmt showStmt = (ShowRestoreStmt) stmt;
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(showStmt.getDbName());
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(showStmt.getDbName());
 
         List<AbstractJob> jobs = Catalog.getCurrentCatalog().getBackupHandler()
                 .getJobs(db.getId(), showStmt.getLabelPredicate());
@@ -1732,7 +1740,7 @@ public class ShowExecutor {
     private void handleShowSyncJobs() throws AnalysisException {
         ShowSyncJobStmt showStmt = (ShowSyncJobStmt) stmt;
         Catalog catalog = Catalog.getCurrentCatalog();
-        Database db = catalog.getDbOrAnalysisException(showStmt.getDbName());
+        DatabaseIf db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(showStmt.getDbName());
 
         List<List<Comparable>> syncInfos = catalog.getSyncJobManager().getSyncJobsInfoByDbId(db.getId());
         Collections.sort(syncInfos, new ListComparator<List<Comparable>>(0));
@@ -1826,16 +1834,16 @@ public class ShowExecutor {
     private void handleShowDynamicPartition() {
         ShowDynamicPartitionStmt showDynamicPartitionStmt = (ShowDynamicPartitionStmt) stmt;
         List<List<String>> rows = Lists.newArrayList();
-        Database db = ctx.getCatalog().getDbNullable(showDynamicPartitionStmt.getDb());
-        if (db != null) {
+        DatabaseIf db = ctx.getCatalog().getInternalDataSource().getDbNullable(showDynamicPartitionStmt.getDb());
+        if (db != null && (db instanceof Database)) {
             List<Table> tableList = db.getTables();
             for (Table tbl : tableList) {
                 if (!(tbl instanceof OlapTable)) {
                     continue;
                 }
 
-                DynamicPartitionScheduler dynamicPartitionScheduler
-                        = Catalog.getCurrentCatalog().getDynamicPartitionScheduler();
+                DynamicPartitionScheduler dynamicPartitionScheduler =
+                        Catalog.getCurrentCatalog().getDynamicPartitionScheduler();
                 OlapTable olapTable = (OlapTable) tbl;
                 olapTable.readLock();
                 try {
@@ -1887,15 +1895,14 @@ public class ShowExecutor {
                     olapTable.readUnlock();
                 }
             }
-
-            resultSet = new ShowResultSet(showDynamicPartitionStmt.getMetaData(), rows);
         }
+        resultSet = new ShowResultSet(showDynamicPartitionStmt.getMetaData(), rows);
     }
 
     // Show transaction statement.
     private void handleShowTransaction() throws AnalysisException {
         ShowTransactionStmt showStmt = (ShowTransactionStmt) stmt;
-        Database db = ctx.getCatalog().getDbOrAnalysisException(showStmt.getDbName());
+        DatabaseIf db = ctx.getCatalog().getInternalDataSource().getDbOrAnalysisException(showStmt.getDbName());
 
         TransactionStatus status = showStmt.getStatus();
         GlobalTransactionMgr transactionMgr = Catalog.getCurrentGlobalTransactionMgr();
@@ -2116,7 +2123,7 @@ public class ShowExecutor {
     private void handleShowTableCreation() throws AnalysisException {
         ShowTableCreationStmt showStmt = (ShowTableCreationStmt) stmt;
         String dbName = showStmt.getDbName();
-        Database db = ctx.getCatalog().getDbOrAnalysisException(dbName);
+        DatabaseIf db = ctx.getCatalog().getCurrentDataSource().getDbOrAnalysisException(dbName);
 
         List<IcebergTableCreationRecord> records =
                 ctx.getCatalog().getIcebergTableCreationRecordMgr().getTableCreationRecordByDbId(db.getId());
@@ -2211,7 +2218,7 @@ public class ShowExecutor {
     private void handleShowCreateMaterializedView() throws AnalysisException {
         List<List<String>> resultRowSet = new ArrayList<>();
         ShowCreateMaterializedViewStmt showStmt = (ShowCreateMaterializedViewStmt) stmt;
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(showStmt.getTableName().getDb());
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(showStmt.getTableName().getDb());
         Table table = db.getTableOrAnalysisException(showStmt.getTableName().getTbl());
         if (table instanceof OlapTable) {
             OlapTable baseTable = ((OlapTable) table);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index edbc629be0..3ed8f26156 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -58,6 +58,7 @@ import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.catalog.ScalarType;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.TableIf.TableType;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
@@ -571,7 +572,7 @@ public class StmtExecutor implements ProfileWriter {
         if (parsedStmt instanceof QueryStmt
                 || parsedStmt instanceof InsertStmt
                 || parsedStmt instanceof CreateTableAsSelectStmt) {
-            Map<Long, Table> tableMap = Maps.newTreeMap();
+            Map<Long, TableIf> tableMap = Maps.newTreeMap();
             QueryStmt queryStmt;
             Set<String> parentViewNameSet = Sets.newHashSet();
             if (parsedStmt instanceof QueryStmt) {
@@ -586,7 +587,7 @@ public class StmtExecutor implements ProfileWriter {
                 insertStmt.getTables(analyzer, tableMap, parentViewNameSet);
             }
             // table id in tableList is in ascending order because that table map is a sorted map
-            List<Table> tables = Lists.newArrayList(tableMap.values());
+            List<TableIf> tables = Lists.newArrayList(tableMap.values());
             int analyzeTimes = 2;
             for (int i = 1; i <= analyzeTimes; i++) {
                 MetaLockUtils.readLockTables(tables);
@@ -1187,8 +1188,8 @@ public class StmtExecutor implements ProfileWriter {
         TTxnParams txnConf = txnEntry.getTxnConf();
         long timeoutSecond = ConnectContext.get().getSessionVariable().getQueryTimeoutS();
         TransactionState.LoadJobSourceType sourceType = TransactionState.LoadJobSourceType.INSERT_STREAMING;
-        Database dbObj = Catalog.getCurrentCatalog().getDbOrException(
-                dbName, s -> new TException("database is invalid for dbName: " + s));
+        Database dbObj = Catalog.getCurrentInternalCatalog()
+                .getDbOrException(dbName, s -> new TException("database is invalid for dbName: " + s));
         Table tblObj = dbObj.getTableOrException(tblName, s -> new TException("table is invalid: " + s));
         txnConf.setDbId(dbObj.getId()).setTbl(tblName).setDb(dbName);
         txnEntry.setTable(tblObj);
diff --git a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
index b8419215a7..fc2bc0785c 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java
@@ -42,6 +42,7 @@ import org.apache.doris.common.ThriftServerEventProcessor;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.Version;
 import org.apache.doris.datasource.DataSourceIf;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.EtlStatus;
 import org.apache.doris.load.LoadJob;
 import org.apache.doris.load.MiniEtlTaskInfo;
@@ -214,14 +215,13 @@ public class FrontendServiceImpl implements FrontendService.Iface {
         }
 
         // database privs should be checked in analysis phrase
-
         UserIdentity currentUser;
         if (params.isSetCurrentUserIdent()) {
             currentUser = UserIdentity.fromThrift(params.current_user_ident);
         } else {
             currentUser = UserIdentity.createAnalyzedUserIdentWithIp(params.user, params.user_ip);
         }
-        Database db = Catalog.getCurrentCatalog().getDbNullable(params.db);
+        DatabaseIf<TableIf> db = Catalog.getCurrentCatalog().getCurrentDataSource().getDbNullable(params.db);
         if (db != null) {
             for (String tableName : db.getTableNamesWithLock()) {
                 LOG.debug("get table: {}, wait to check", tableName);
@@ -262,7 +262,12 @@ public class FrontendServiceImpl implements FrontendService.Iface {
         } else {
             currentUser = UserIdentity.createAnalyzedUserIdentWithIp(params.user, params.user_ip);
         }
-        DataSourceIf ds = Catalog.getCurrentCatalog().getDataSourceMgr().getCatalog(params.catalog);
+
+        String catalogName = InternalDataSource.INTERNAL_DS_NAME;
+        if (params.isSetCatalog()) {
+            catalogName = params.catalog;
+        }
+        DataSourceIf ds = Catalog.getCurrentCatalog().getDataSourceMgr().getCatalog(catalogName);
         if (ds != null) {
             DatabaseIf db = ds.getDbNullable(params.db);
             if (db != null) {
@@ -400,9 +405,9 @@ public class FrontendServiceImpl implements FrontendService.Iface {
             return result;
         }
 
-        Database db = Catalog.getCurrentCatalog().getDbNullable(params.db);
+        DatabaseIf<TableIf> db = Catalog.getCurrentCatalog().getCurrentDataSource().getDbNullable(params.db);
         if (db != null) {
-            Table table = db.getTableNullable(params.getTableName());
+            TableIf table = db.getTableNullable(params.getTableName());
             if (table != null) {
                 table.readLock();
                 try {
@@ -687,10 +692,9 @@ public class FrontendServiceImpl implements FrontendService.Iface {
         return result;
     }
 
-
     private void checkAuthCodeUuid(String dbName, long txnId, String authCodeUuid) throws AuthenticationException {
-        Database db = Catalog.getCurrentCatalog().getDbOrException(
-                dbName, s -> new AuthenticationException("invalid db name: " + s));
+        DatabaseIf db = Catalog.getCurrentInternalCatalog()
+                .getDbOrException(dbName, s -> new AuthenticationException("invalid db name: " + s));
         TransactionState transactionState = Catalog.getCurrentGlobalTransactionMgr()
                 .getTransactionState(db.getId(), txnId);
         if (transactionState == null) {
@@ -799,7 +803,7 @@ public class FrontendServiceImpl implements FrontendService.Iface {
         // check database
         Catalog catalog = Catalog.getCurrentCatalog();
         String fullDbName = ClusterNamespace.getFullName(cluster, request.getDb());
-        Database db = catalog.getDbNullable(fullDbName);
+        Database db = catalog.getInternalDataSource().getDbNullable(fullDbName);
         if (db == null) {
             String dbName = fullDbName;
             if (Strings.isNullOrEmpty(request.getCluster())) {
@@ -808,7 +812,7 @@ public class FrontendServiceImpl implements FrontendService.Iface {
             throw new UserException("unknown database, database=" + dbName);
         }
 
-        Table table = db.getTableOrMetaException(request.tbl, TableType.OLAP);
+        OlapTable table = (OlapTable) db.getTableOrMetaException(request.tbl, TableType.OLAP);
         // begin
         long timeoutSecond = request.isSetTimeout() ? request.getTimeout() : Config.stream_load_default_timeout_second;
         MetricRepo.COUNTER_LOAD_ADD.increase(1L);
@@ -868,9 +872,9 @@ public class FrontendServiceImpl implements FrontendService.Iface {
         String fullDbName = ClusterNamespace.getFullName(cluster, request.getDb());
         Database db;
         if (request.isSetDbId() && request.getDbId() > 0) {
-            db = catalog.getDbNullable(request.getDbId());
+            db = catalog.getInternalDataSource().getDbNullable(request.getDbId());
         } else {
-            db = catalog.getDbNullable(fullDbName);
+            db = catalog.getInternalDataSource().getDbNullable(fullDbName);
         }
         if (db == null) {
             String dbName = fullDbName;
@@ -881,11 +885,11 @@ public class FrontendServiceImpl implements FrontendService.Iface {
         }
 
         long timeoutMs = request.isSetThriftRpcTimeoutMs() ? request.getThriftRpcTimeoutMs() / 2 : 5000;
-        Table table = db.getTableOrMetaException(request.getTbl(), TableType.OLAP);
-        Catalog.getCurrentGlobalTransactionMgr().preCommitTransaction2PC(
-                db, Lists.newArrayList(table), request.getTxnId(),
-                TabletCommitInfo.fromThrift(request.getCommitInfos()),
-                timeoutMs, TxnCommitAttachment.fromThrift(request.txnCommitAttachment));
+        OlapTable table = (OlapTable) db.getTableOrMetaException(request.getTbl(), TableType.OLAP);
+        Catalog.getCurrentGlobalTransactionMgr()
+                .preCommitTransaction2PC(db, Lists.newArrayList(table), request.getTxnId(),
+                        TabletCommitInfo.fromThrift(request.getCommitInfos()), timeoutMs,
+                        TxnCommitAttachment.fromThrift(request.txnCommitAttachment));
     }
 
     @Override
@@ -926,7 +930,7 @@ public class FrontendServiceImpl implements FrontendService.Iface {
 
         // get database
         Catalog catalog = Catalog.getCurrentCatalog();
-        Database database = catalog.getDbNullable(fullDbName);
+        Database database = catalog.getInternalDataSource().getDbNullable(fullDbName);
         if (database == null) {
             throw new UserException("unknown database, database=" + fullDbName);
         }
@@ -1004,9 +1008,9 @@ public class FrontendServiceImpl implements FrontendService.Iface {
         String fullDbName = ClusterNamespace.getFullName(cluster, request.getDb());
         Database db;
         if (request.isSetDbId() && request.getDbId() > 0) {
-            db = catalog.getDbNullable(request.getDbId());
+            db = catalog.getInternalDataSource().getDbNullable(request.getDbId());
         } else {
-            db = catalog.getDbNullable(fullDbName);
+            db = catalog.getInternalDataSource().getDbNullable(fullDbName);
         }
         if (db == null) {
             String dbName = fullDbName;
@@ -1018,10 +1022,10 @@ public class FrontendServiceImpl implements FrontendService.Iface {
 
         long timeoutMs = request.isSetThriftRpcTimeoutMs() ? request.getThriftRpcTimeoutMs() / 2 : 5000;
         Table table = db.getTableOrMetaException(request.getTbl(), TableType.OLAP);
-        boolean ret = Catalog.getCurrentGlobalTransactionMgr().commitAndPublishTransaction(
-                db, Lists.newArrayList(table), request.getTxnId(),
-                TabletCommitInfo.fromThrift(request.getCommitInfos()),
-                timeoutMs, TxnCommitAttachment.fromThrift(request.txnCommitAttachment));
+        boolean ret = Catalog.getCurrentGlobalTransactionMgr()
+                .commitAndPublishTransaction((Database) db, Lists.newArrayList(table), request.getTxnId(),
+                        TabletCommitInfo.fromThrift(request.getCommitInfos()), timeoutMs,
+                        TxnCommitAttachment.fromThrift(request.txnCommitAttachment));
         if (ret) {
             // if commit and publish is success, load can be regarded as success
             MetricRepo.COUNTER_LOAD_FINISHED.increase(1L);
@@ -1069,9 +1073,9 @@ public class FrontendServiceImpl implements FrontendService.Iface {
         String dbName = ClusterNamespace.getFullName(cluster, request.getDb());
         Database db;
         if (request.isSetDbId() && request.getDbId() > 0) {
-            db = Catalog.getCurrentCatalog().getDbNullable(request.getDbId());
+            db = Catalog.getCurrentInternalCatalog().getDbNullable(request.getDbId());
         } else {
-            db = Catalog.getCurrentCatalog().getDbNullable(dbName);
+            db = Catalog.getCurrentInternalCatalog().getDbNullable(dbName);
         }
         if (db == null) {
             throw new MetaNotFoundException("db " + request.getDb() + " does not exist");
@@ -1113,7 +1117,7 @@ public class FrontendServiceImpl implements FrontendService.Iface {
 
         Catalog catalog = Catalog.getCurrentCatalog();
         String fullDbName = ClusterNamespace.getFullName(cluster, request.getDb());
-        Database db = catalog.getDbNullable(fullDbName);
+        Database db = catalog.getInternalDataSource().getDbNullable(fullDbName);
         if (db == null) {
             String dbName = fullDbName;
             if (Strings.isNullOrEmpty(request.getCluster())) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsJobManager.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsJobManager.java
index 95d12cd48a..194006cae1 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsJobManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsJobManager.java
@@ -101,7 +101,7 @@ public class StatisticsJobManager {
      * - Rule3: The job for external table is not supported
      */
     private void checkRestrict(long dbId, Set<Long> tableIds) throws AnalysisException {
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbId);
         db.readLock();
         try {
             // check table type
diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsJobScheduler.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsJobScheduler.java
index 65862c0e6e..23b90df198 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsJobScheduler.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsJobScheduler.java
@@ -131,7 +131,7 @@ public class StatisticsJobScheduler extends MasterDaemon {
     private void divide(StatisticsJob statisticsJob) throws DdlException {
         long jobId = statisticsJob.getId();
         long dbId = statisticsJob.getDbId();
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException(dbId);
         Set<Long> tblIds = statisticsJob.getTblIds();
         Map<Long, List<String>> tableIdToColumnName = statisticsJob.getTableIdToColumnName();
         List<StatisticsTask> tasks = statisticsJob.getTasks();
diff --git a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsManager.java b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsManager.java
index 3c67f9e9a0..ec5514af81 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsManager.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/statistics/StatisticsManager.java
@@ -23,7 +23,9 @@ import org.apache.doris.analysis.TableName;
 import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.Database;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.Type;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.ErrorCode;
@@ -50,12 +52,12 @@ public class StatisticsManager {
 
     public void alterTableStatistics(AlterTableStatsStmt stmt)
             throws AnalysisException {
-        Table table = validateTableName(stmt.getTableName());
+        TableIf table = validateTableName(stmt.getTableName());
         statistics.updateTableStats(table.getId(), stmt.getStatsTypeToValue());
     }
 
     public void alterColumnStatistics(AlterColumnStatsStmt stmt) throws AnalysisException {
-        Table table = validateTableName(stmt.getTableName());
+        TableIf table = validateTableName(stmt.getTableName());
         String columnName = stmt.getColumnName();
         Column column = table.getColumn(columnName);
         if (column == null) {
@@ -67,10 +69,10 @@ public class StatisticsManager {
 
     public List<List<String>> showTableStatsList(String dbName, String tableName)
             throws AnalysisException {
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbName);
+        DatabaseIf<TableIf> db = Catalog.getCurrentCatalog().getCurrentDataSource().getDbOrAnalysisException(dbName);
         List<List<String>> result = Lists.newArrayList();
         if (tableName != null) {
-            Table table = db.getTableOrAnalysisException(tableName);
+            TableIf table = db.getTableOrAnalysisException(tableName);
             // check priv
             if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), dbName, tableName,
                     PrivPredicate.SHOW)) {
@@ -82,9 +84,9 @@ public class StatisticsManager {
             // get stats
             result.add(showTableStats(table));
         } else {
-            for (Table table : db.getTables()) {
-                if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), dbName, table.getName(),
-                        PrivPredicate.SHOW)) {
+            for (TableIf table : db.getTables()) {
+                if (!Catalog.getCurrentCatalog().getAuth()
+                        .checkTblPriv(ConnectContext.get(), dbName, table.getName(), PrivPredicate.SHOW)) {
                     continue;
                 }
                 try {
@@ -99,7 +101,7 @@ public class StatisticsManager {
 
     public List<List<String>> showColumnStatsList(TableName tableName) throws AnalysisException {
         // check meta
-        Table table = validateTableName(tableName);
+        TableIf table = validateTableName(tableName);
         // check priv
         if (!Catalog.getCurrentCatalog().getAuth().checkTblPriv(ConnectContext.get(), tableName.getDb(),
                 tableName.getTbl(), PrivPredicate.SHOW)) {
@@ -123,7 +125,7 @@ public class StatisticsManager {
         return result;
     }
 
-    private List<String> showTableStats(Table table) throws AnalysisException {
+    private List<String> showTableStats(TableIf table) throws AnalysisException {
         TableStats tableStats = statistics.getTableStats(table.getId());
         if (tableStats == null) {
             throw new AnalysisException("There is no statistics in this table:" + table.getName());
@@ -147,7 +149,7 @@ public class StatisticsManager {
         validateTableAndColumn(categoryDesc);
         long dbId = categoryDesc.getDbId();
         long tblId = categoryDesc.getTableId();
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbId);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbId);
         Table table = db.getTableOrAnalysisException(tblId);
         String columnName = categoryDesc.getColumnName();
         Type columnType = table.getColumn(columnName).getType();
@@ -155,11 +157,11 @@ public class StatisticsManager {
         statistics.updateColumnStats(tblId, columnName, columnType, statsTypeToValue);
     }
 
-    private Table validateTableName(TableName dbTableName) throws AnalysisException {
+    private TableIf validateTableName(TableName dbTableName) throws AnalysisException {
         String dbName = dbTableName.getDb();
         String tableName = dbTableName.getTbl();
 
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbName);
+        DatabaseIf db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbName);
         return db.getTableOrAnalysisException(tableName);
     }
 
@@ -168,8 +170,8 @@ public class StatisticsManager {
         long tblId = categoryDesc.getTableId();
         String columnName = categoryDesc.getColumnName();
 
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbId);
-        Table table = db.getTableOrAnalysisException(tblId);
+        DatabaseIf db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbId);
+        TableIf table = db.getTableOrAnalysisException(tblId);
         if (!Strings.isNullOrEmpty(columnName)) {
             Column column = table.getColumn(columnName);
             if (column == null) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/system/Diagnoser.java b/fe/fe-core/src/main/java/org/apache/doris/system/Diagnoser.java
index 083b476558..a818673241 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/system/Diagnoser.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/system/Diagnoser.java
@@ -60,7 +60,7 @@ public class Diagnoser {
         results.add(Lists.newArrayList("TabletExist", "Yes", ""));
         results.add(Lists.newArrayList("TabletId", String.valueOf(tabletId), ""));
         // database
-        Database db = Catalog.getCurrentCatalog().getDbNullable(tabletMeta.getDbId());
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable(tabletMeta.getDbId());
         if (db == null) {
             results.add(Lists.newArrayList("Database", "Not exist", ""));
             return results;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/system/SystemInfoService.java b/fe/fe-core/src/main/java/org/apache/doris/system/SystemInfoService.java
index 65368abc9b..5c51163719 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/system/SystemInfoService.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/system/SystemInfoService.java
@@ -860,7 +860,7 @@ public class SystemInfoService {
     public void updateBackendReportVersion(long backendId, long newReportVersion, long dbId, long tableId) {
         AtomicLong atomicLong;
         if ((atomicLong = idToReportVersionRef.get(backendId)) != null) {
-            Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+            Database db = (Database) Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
             if (db == null) {
                 LOG.warn("failed to update backend report version, db {} does not exist", dbId);
                 return;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/task/ExportPendingTask.java b/fe/fe-core/src/main/java/org/apache/doris/task/ExportPendingTask.java
index 8f0bee66a5..f55d459ff7 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/task/ExportPendingTask.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/task/ExportPendingTask.java
@@ -58,7 +58,7 @@ public class ExportPendingTask extends MasterTask {
         }
 
         long dbId = job.getDbId();
-        db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (db == null) {
             job.cancel(ExportFailMsg.CancelType.RUN_FAIL, "database does not exist");
             return;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/task/LoadEtlTask.java b/fe/fe-core/src/main/java/org/apache/doris/task/LoadEtlTask.java
index c7bfbdb19e..8e56d71f37 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/task/LoadEtlTask.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/task/LoadEtlTask.java
@@ -83,7 +83,7 @@ public abstract class LoadEtlTask extends MasterTask {
 
         // check db
         long dbId = job.getDbId();
-        db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (db == null) {
             load.cancelLoadJob(job, CancelType.ETL_RUN_FAIL, "db does not exist. id: " + dbId);
             return;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/task/LoadPendingTask.java b/fe/fe-core/src/main/java/org/apache/doris/task/LoadPendingTask.java
index b39f2ddaca..21b018b778 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/task/LoadPendingTask.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/task/LoadPendingTask.java
@@ -68,7 +68,7 @@ public abstract class LoadPendingTask extends MasterTask {
 
         // get db
         long dbId = job.getDbId();
-        db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+        db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
         if (db == null) {
             load.cancelLoadJob(job, CancelType.ETL_SUBMIT_FAIL, "db does not exist. id: " + dbId);
             return;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java b/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java
index f65189cf1c..dad603539e 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/transaction/DatabaseTransactionMgr.java
@@ -25,6 +25,7 @@ import org.apache.doris.catalog.Partition;
 import org.apache.doris.catalog.PartitionInfo;
 import org.apache.doris.catalog.Replica;
 import org.apache.doris.catalog.Table;
+import org.apache.doris.catalog.TableIf;
 import org.apache.doris.catalog.Tablet;
 import org.apache.doris.catalog.TabletInvertedIndex;
 import org.apache.doris.catalog.TabletMeta;
@@ -349,7 +350,7 @@ public class DatabaseTransactionMgr {
     }
 
     private void checkDatabaseDataQuota() throws MetaNotFoundException, QuotaExceedException {
-        Database db = catalog.getDbOrMetaException(dbId);
+        Database db = catalog.getInternalDataSource().getDbOrMetaException(dbId);
 
         if (usedQuotaDataBytes == -1) {
             usedQuotaDataBytes = db.getUsedDataQuotaWithLock();
@@ -370,7 +371,7 @@ public class DatabaseTransactionMgr {
             throws UserException {
         // check status
         // the caller method already own db lock, we do not obtain db lock here
-        Database db = catalog.getDbOrMetaException(dbId);
+        Database db = catalog.getInternalDataSource().getDbOrMetaException(dbId);
         TransactionState transactionState;
         readLock();
         try {
@@ -415,7 +416,7 @@ public class DatabaseTransactionMgr {
                                    List<TabletCommitInfo> tabletCommitInfos, TxnCommitAttachment txnCommitAttachment,
                                    Set<Long> errorReplicaIds, Map<Long, Set<Long>> tableToPartition,
                                     Set<Long> totalInvolvedBackends) throws UserException {
-        Database db = catalog.getDbOrMetaException(dbId);
+        Database db = catalog.getInternalDataSource().getDbOrMetaException(dbId);
 
         // update transaction state extra if exists
         if (txnCommitAttachment != null) {
@@ -577,7 +578,7 @@ public class DatabaseTransactionMgr {
             throws UserException {
         // check status
         // the caller method already own tables' write lock
-        Database db = catalog.getDbOrMetaException(dbId);
+        Database db = catalog.getInternalDataSource().getDbOrMetaException(dbId);
         TransactionState transactionState;
         readLock();
         try {
@@ -813,9 +814,9 @@ public class DatabaseTransactionMgr {
         // the transaction with empty commit info only three cases mentioned above may happen, because user cannot
         // drop table without force while there are committed transactions on table and writeLockTablesIfExist is
         // a blocking function, the returned result would be the existed table list which hold write lock
-        Database db = catalog.getDbOrMetaException(transactionState.getDbId());
+        Database db = catalog.getInternalDataSource().getDbOrMetaException(transactionState.getDbId());
         List<Long> tableIdList = transactionState.getTableIdList();
-        List<Table> tableList = db.getTablesOnIdOrderIfExist(tableIdList);
+        List<? extends TableIf> tableList = db.getTablesOnIdOrderIfExist(tableIdList);
         tableList = MetaLockUtils.writeLockTablesIfExist(tableList);
         try {
             boolean hasError = false;
@@ -1431,7 +1432,7 @@ public class DatabaseTransactionMgr {
         List<List<String>> infos = new ArrayList<List<String>>();
         readLock();
         try {
-            Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbId);
             TransactionState txnState = unprotectedGetTransactionState(txnId);
             if (txnState == null) {
                 throw new AnalysisException("transaction with id " + txnId + " does not exist");
@@ -1668,9 +1669,9 @@ public class DatabaseTransactionMgr {
         boolean shouldAddTableListLock  = transactionState.getTransactionStatus() == TransactionStatus.COMMITTED
                 || transactionState.getTransactionStatus() == TransactionStatus.VISIBLE;
         Database db = null;
-        List<Table> tableList = null;
+        List<? extends TableIf> tableList = null;
         if (shouldAddTableListLock) {
-            db = catalog.getDbOrMetaException(transactionState.getDbId());
+            db = catalog.getInternalDataSource().getDbOrMetaException(transactionState.getDbId());
             tableList = db.getTablesOnIdOrderIfExist(transactionState.getTableIdList());
             tableList = MetaLockUtils.writeLockTablesIfExist(tableList);
         }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/transaction/DbUsedDataQuotaInfoCollector.java b/fe/fe-core/src/main/java/org/apache/doris/transaction/DbUsedDataQuotaInfoCollector.java
index 5086068803..fb79211127 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/transaction/DbUsedDataQuotaInfoCollector.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/transaction/DbUsedDataQuotaInfoCollector.java
@@ -42,10 +42,10 @@ public class DbUsedDataQuotaInfoCollector extends MasterDaemon {
 
     private void updateAllDatabaseUsedDataQuota() {
         Catalog catalog = Catalog.getCurrentCatalog();
-        List<Long> dbIdList = catalog.getDbIds();
+        List<Long> dbIdList = catalog.getInternalDataSource().getDbIds();
         GlobalTransactionMgr globalTransactionMgr = catalog.getGlobalTransactionMgr();
         for (Long dbId : dbIdList) {
-            Database db = catalog.getDbNullable(dbId);
+            Database db = catalog.getInternalDataSource().getDbNullable(dbId);
             if (db == null) {
                 LOG.warn("Database [" + dbId + "] does not exist, skip to update database used data quota");
                 continue;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/transaction/GlobalTransactionMgr.java b/fe/fe-core/src/main/java/org/apache/doris/transaction/GlobalTransactionMgr.java
index 03513c4833..142f1e00ef 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/transaction/GlobalTransactionMgr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/transaction/GlobalTransactionMgr.java
@@ -443,7 +443,7 @@ public class GlobalTransactionMgr implements Writable {
         for (long dbId : dbIds) {
             List<Comparable> info = new ArrayList<Comparable>();
             info.add(dbId);
-            Database db = Catalog.getCurrentCatalog().getDbNullable(dbId);
+            Database db = Catalog.getCurrentInternalCatalog().getDbNullable(dbId);
             if (db == null) {
                 continue;
             }
@@ -602,7 +602,7 @@ public class GlobalTransactionMgr implements Writable {
         long dbId = request.getDbId();
         int commitTimeoutSec = Config.commit_timeout_second;
         for (int i = 0; i < commitTimeoutSec; ++i) {
-            Catalog.getCurrentCatalog().getDbOrAnalysisException(dbId);
+            Catalog.getCurrentInternalCatalog().getDbOrAnalysisException(dbId);
             TWaitingTxnStatusResult statusResult = new TWaitingTxnStatusResult();
             statusResult.status = new TStatus();
             TransactionStatus txnStatus = null;
diff --git a/fe/fe-core/src/main/java/org/apache/doris/transaction/PublishVersionDaemon.java b/fe/fe-core/src/main/java/org/apache/doris/transaction/PublishVersionDaemon.java
index 87edcf6885..f8dacb96da 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/transaction/PublishVersionDaemon.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/transaction/PublishVersionDaemon.java
@@ -190,7 +190,8 @@ public class PublishVersionDaemon extends MasterDaemon {
                             continue;
                         }
 
-                        Database db = Catalog.getCurrentCatalog().getDbNullable(transactionState.getDbId());
+                        Database db = Catalog.getCurrentInternalCatalog()
+                                .getDbNullable(transactionState.getDbId());
                         if (db == null) {
                             LOG.warn("Database [{}] has been dropped.", transactionState.getDbId());
                             continue;
diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterJobV2Test.java b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterJobV2Test.java
index 3eb7f1abf7..2ab9f212f3 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterJobV2Test.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterJobV2Test.java
@@ -113,7 +113,8 @@ public class AlterJobV2Test {
             System.out.println("alter job " + alterJobV2.getDbId() + " is done. state: " + alterJobV2.getJobState());
             Assert.assertEquals(AlterJobV2.JobState.FINISHED, alterJobV2.getJobState());
 
-            Database db = Catalog.getCurrentCatalog().getDbOrMetaException(alterJobV2.getDbId());
+            Database db =
+                    Catalog.getCurrentInternalCatalog().getDbOrMetaException(alterJobV2.getDbId());
             OlapTable tbl = (OlapTable) db.getTableOrMetaException(alterJobV2.getTableId(), Table.TableType.OLAP);
             while (tbl.getState() != OlapTable.OlapTableState.NORMAL) {
                 Thread.sleep(1000);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java
index b1684cb75a..62dd02d6dc 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/alter/AlterTest.java
@@ -291,7 +291,7 @@ public class AlterTest {
 
     @Test
     public void alterTableModifyComment() throws Exception {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         Table tbl = db.getTableOrMetaException("tbl5");
 
         // table comment
@@ -371,7 +371,7 @@ public class AlterTest {
                 + "'dynamic_partition.buckets' = '3'\n"
                 + " );";
         alterTable(stmt, false);
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable tbl = (OlapTable) db.getTableOrMetaException("tbl1");
         Assert.assertTrue(tbl.getTableProperty().getDynamicPartitionProperty().getEnable());
         Assert.assertEquals(4, tbl.getIndexIdToSchema().size());
@@ -428,7 +428,7 @@ public class AlterTest {
     // test batch update range partitions' properties
     @Test
     public void testBatchUpdatePartitionProperties() throws Exception {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable tbl4 = (OlapTable) db.getTableOrMetaException("tbl4");
         Partition p1 = tbl4.getPartition("p1");
         Partition p2 = tbl4.getPartition("p2");
@@ -502,7 +502,7 @@ public class AlterTest {
 
     @Test
     public void testAlterRemoteStorageTableDataProperties() throws Exception {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable tblRemote = (OlapTable) db.getTableOrMetaException("tbl_remote");
         Partition p1 = tblRemote.getPartition("p1");
         Partition p2 = tblRemote.getPartition("p2");
@@ -570,7 +570,7 @@ public class AlterTest {
         alterTable(stmt, false);
         Thread.sleep(5000); // sleep to wait dynamic partition scheduler run
 
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable tbl = (OlapTable) db.getTableOrMetaException("tbl3");
         Assert.assertEquals(4, tbl.getPartitionNames().size());
         Assert.assertNull(tbl.getPartition("p1"));
@@ -589,7 +589,8 @@ public class AlterTest {
             }
             System.out.println(alterJobV2.getType() + " alter job " + alterJobV2.getJobId() + " is done. state: " + alterJobV2.getJobState());
             Assert.assertEquals(AlterJobV2.JobState.FINISHED, alterJobV2.getJobState());
-            Database db = Catalog.getCurrentCatalog().getDbOrMetaException(alterJobV2.getDbId());
+            Database db =
+                    Catalog.getCurrentInternalCatalog().getDbOrMetaException(alterJobV2.getDbId());
             OlapTable tbl = (OlapTable) db.getTableOrMetaException(alterJobV2.getTableId());
             while (tbl.getState() != OlapTable.OlapTableState.NORMAL) {
                 Thread.sleep(1000);
@@ -729,7 +730,7 @@ public class AlterTest {
         createTable(stmt2);
         createTable(stmt3);
         createTable(stmt4);
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
 
         // table name -> tabletIds
         Map<String, List<Long>> tblNameToTabletIds = Maps.newHashMap();
@@ -841,7 +842,7 @@ public class AlterTest {
                 + "PROPERTIES(\"replication_num\" = \"1\");";
 
         createTable(stmt);
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
 
         String modifyBucketNumStmt = "ALTER TABLE test.bucket MODIFY DISTRIBUTION DISTRIBUTED BY HASH(k1) BUCKETS 1;";
         alterTable(modifyBucketNumStmt, false);
@@ -938,7 +939,7 @@ public class AlterTest {
         // external table support add column
         stmt = "alter table test.odbc_table add column k6 INT KEY after k1, add column k7 TINYINT KEY after k6";
         alterTable(stmt, false);
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         Table odbcTable = db.getTableOrMetaException("odbc_table");
         Assert.assertEquals(odbcTable.getBaseSchema().size(), 7);
         Assert.assertEquals(odbcTable.getBaseSchema().get(1).getDataType(), PrimitiveType.INT);
@@ -947,20 +948,20 @@ public class AlterTest {
         // external table support drop column
         stmt = "alter table test.odbc_table drop column k7";
         alterTable(stmt, false);
-        db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         odbcTable = db.getTableOrMetaException("odbc_table");
         Assert.assertEquals(odbcTable.getBaseSchema().size(), 6);
 
         // external table support modify column
         stmt = "alter table test.odbc_table modify column k6 bigint after k5";
         alterTable(stmt, false);
-        db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         odbcTable = db.getTableOrMetaException("odbc_table");
         Assert.assertEquals(odbcTable.getBaseSchema().size(), 6);
         Assert.assertEquals(odbcTable.getBaseSchema().get(5).getDataType(), PrimitiveType.BIGINT);
 
         // external table support reorder column
-        db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         odbcTable = db.getTableOrMetaException("odbc_table");
         Assert.assertTrue(odbcTable.getBaseSchema().stream()
                 .map(column -> column.getName())
@@ -991,7 +992,7 @@ public class AlterTest {
         // external table support rename operation
         stmt = "alter table test.odbc_table rename oracle_table";
         alterTable(stmt, false);
-        db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         odbcTable = db.getTableNullable("oracle_table");
         Assert.assertNotNull(odbcTable);
         odbcTable = db.getTableNullable("odbc_table");
@@ -1017,7 +1018,7 @@ public class AlterTest {
                 + ");";
         createTable(createOlapTblStmt);
 
-        Database db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test");
         MysqlTable mysqlTable = (MysqlTable) db.getTableOrMetaException("mysql_table", Table.TableType.MYSQL);
 
         String alterEngineStmt = "alter table test.mysql_table modify engine to odbc";
diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/BatchRollupJobTest.java b/fe/fe-core/src/test/java/org/apache/doris/alter/BatchRollupJobTest.java
index 08d09c076c..7ced1aabb8 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/alter/BatchRollupJobTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/alter/BatchRollupJobTest.java
@@ -61,7 +61,7 @@ public class BatchRollupJobTest {
         String createDbStmtStr = "create database if not exists db1;";
         CreateDbStmt createDbStmt = (CreateDbStmt) UtFrameUtils.parseAndAnalyzeStmt(createDbStmtStr, ctx);
         Catalog.getCurrentCatalog().createDb(createDbStmt);
-        System.out.println(Catalog.getCurrentCatalog().getDbNames());
+        System.out.println(Catalog.getCurrentInternalCatalog().getDbNames());
     }
 
     @Test
@@ -79,7 +79,7 @@ public class BatchRollupJobTest {
         Map<Long, AlterJobV2> alterJobs = Catalog.getCurrentCatalog().getMaterializedViewHandler().getAlterJobsV2();
         Assert.assertEquals(3, alterJobs.size());
 
-        Database db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:db1");
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:db1");
         Assert.assertNotNull(db);
         OlapTable tbl = (OlapTable) db.getTableNullable("tbl1");
         Assert.assertNotNull(tbl);
@@ -130,7 +130,7 @@ public class BatchRollupJobTest {
         Assert.assertEquals(3, alterJobs.size());
         List<Long> jobIds = Lists.newArrayList(alterJobs.keySet());
 
-        Database db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:db1");
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:db1");
         Assert.assertNotNull(db);
         OlapTable tbl = (OlapTable) db.getTableNullable("tbl2");
         Assert.assertNotNull(tbl);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/RollupJobV2Test.java b/fe/fe-core/src/test/java/org/apache/doris/alter/RollupJobV2Test.java
index 257ea1b695..bb83a15d34 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/alter/RollupJobV2Test.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/alter/RollupJobV2Test.java
@@ -149,7 +149,7 @@ public class RollupJobV2Test {
         ArrayList<AlterClause> alterClauses = new ArrayList<>();
         alterClauses.add(clause);
         alterClauses.add(clause2);
-        Database db = masterCatalog.getDbOrDdlException(CatalogTestUtil.testDbId1);
+        Database db = masterCatalog.getInternalDataSource().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         materializedViewHandler.process(alterClauses, db.getClusterName(), db, olapTable);
         Map<Long, AlterJobV2> alterJobsV2 = materializedViewHandler.getAlterJobsV2();
@@ -169,7 +169,7 @@ public class RollupJobV2Test {
         MaterializedViewHandler materializedViewHandler = Catalog.getCurrentCatalog().getMaterializedViewHandler();
         ArrayList<AlterClause> alterClauses = new ArrayList<>();
         alterClauses.add(clause);
-        Database db = masterCatalog.getDbOrDdlException(CatalogTestUtil.testDbId1);
+        Database db = masterCatalog.getInternalDataSource().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         materializedViewHandler.process(alterClauses, db.getClusterName(), db, olapTable);
         Map<Long, AlterJobV2> alterJobsV2 = materializedViewHandler.getAlterJobsV2();
@@ -188,7 +188,7 @@ public class RollupJobV2Test {
         // add a rollup job
         ArrayList<AlterClause> alterClauses = new ArrayList<>();
         alterClauses.add(clause);
-        Database db = masterCatalog.getDbOrDdlException(CatalogTestUtil.testDbId1);
+        Database db = masterCatalog.getInternalDataSource().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         Partition testPartition = olapTable.getPartition(CatalogTestUtil.testPartitionId1);
         materializedViewHandler.process(alterClauses, db.getClusterName(), db, olapTable);
@@ -240,7 +240,7 @@ public class RollupJobV2Test {
         // add a rollup job
         ArrayList<AlterClause> alterClauses = new ArrayList<>();
         alterClauses.add(clause);
-        Database db = masterCatalog.getDbOrDdlException(CatalogTestUtil.testDbId1);
+        Database db = masterCatalog.getInternalDataSource().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         Partition testPartition = olapTable.getPartition(CatalogTestUtil.testPartitionId1);
         materializedViewHandler.process(alterClauses, db.getClusterName(), db, olapTable);
@@ -373,7 +373,7 @@ public class RollupJobV2Test {
         fakeEditLog = new FakeEditLog();
         FakeCatalog.setCatalog(masterCatalog);
         MaterializedViewHandler materializedViewHandler = Catalog.getCurrentCatalog().getMaterializedViewHandler();
-        Database db = masterCatalog.getDbOrDdlException(CatalogTestUtil.testDbId1);
+        Database db = masterCatalog.getInternalDataSource().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId2);
 
         AddRollupClause addRollupClause = new AddRollupClause("r1", Lists.newArrayList("k1", "v1", "v2"), null, CatalogTestUtil.testIndex2, null);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/alter/SchemaChangeJobV2Test.java b/fe/fe-core/src/test/java/org/apache/doris/alter/SchemaChangeJobV2Test.java
index 62a6187064..02771d213e 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/alter/SchemaChangeJobV2Test.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/alter/SchemaChangeJobV2Test.java
@@ -129,7 +129,7 @@ public class SchemaChangeJobV2Test {
         SchemaChangeHandler schemaChangeHandler = Catalog.getCurrentCatalog().getSchemaChangeHandler();
         ArrayList<AlterClause> alterClauses = new ArrayList<>();
         alterClauses.add(addColumnClause);
-        Database db = masterCatalog.getDbOrDdlException(CatalogTestUtil.testDbId1);
+        Database db = masterCatalog.getInternalDataSource().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         schemaChangeHandler.process(alterClauses, "default_cluster", db, olapTable);
         Map<Long, AlterJobV2> alterJobsV2 = schemaChangeHandler.getAlterJobsV2();
@@ -148,7 +148,7 @@ public class SchemaChangeJobV2Test {
         // add a schema change job
         ArrayList<AlterClause> alterClauses = new ArrayList<>();
         alterClauses.add(addColumnClause);
-        Database db = masterCatalog.getDbOrDdlException(CatalogTestUtil.testDbId1);
+        Database db = masterCatalog.getInternalDataSource().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         Partition testPartition = olapTable.getPartition(CatalogTestUtil.testPartitionId1);
         schemaChangeHandler.process(alterClauses, "default_cluster", db, olapTable);
@@ -224,7 +224,7 @@ public class SchemaChangeJobV2Test {
         // add a schema change job
         ArrayList<AlterClause> alterClauses = new ArrayList<>();
         alterClauses.add(addColumnClause);
-        Database db = masterCatalog.getDbOrDdlException(CatalogTestUtil.testDbId1);
+        Database db = masterCatalog.getInternalDataSource().getDbOrDdlException(CatalogTestUtil.testDbId1);
         OlapTable olapTable = (OlapTable) db.getTableOrDdlException(CatalogTestUtil.testTableId1);
         Partition testPartition = olapTable.getPartition(CatalogTestUtil.testPartitionId1);
         schemaChangeHandler.process(alterClauses, "default_cluster", db, olapTable);
@@ -426,7 +426,7 @@ public class SchemaChangeJobV2Test {
         fakeCatalog = new FakeCatalog();
         fakeEditLog = new FakeEditLog();
         FakeCatalog.setCatalog(masterCatalog);
-        Database db = masterCatalog.getDb(CatalogTestUtil.testDbId1).get();
+        Database db = masterCatalog.getInternalDataSource().getDb(CatalogTestUtil.testDbId1).get();
         OlapTable olapTable = (OlapTable) db.getTable(CatalogTestUtil.testTableId1).get();
         Catalog.getCurrentCatalog().convertDistributionType(db, olapTable);
         Assert.assertTrue(olapTable.getDefaultDistributionInfo().getType() == DistributionInfo.DistributionInfoType.RANDOM);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/AccessTestUtil.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/AccessTestUtil.java
index 19043643af..69c18a5c06 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/AccessTestUtil.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/AccessTestUtil.java
@@ -101,39 +101,56 @@ public class AccessTestUtil {
             List<Column> baseSchema = new LinkedList<Column>();
             Column column = new Column();
             baseSchema.add(column);
-            OlapTable table = new OlapTable(30000, "testTbl", baseSchema,
-                    KeysType.AGG_KEYS, new SinglePartitionInfo(), distributionInfo);
-            table.setIndexMeta(baseIndex.getId(), "testTbl", baseSchema, 0, 1, (short) 1,
-                    TStorageType.COLUMN, KeysType.AGG_KEYS);
+            OlapTable table = new OlapTable(30000, "testTbl", baseSchema, KeysType.AGG_KEYS, new SinglePartitionInfo(),
+                    distributionInfo);
+            table.setIndexMeta(baseIndex.getId(), "testTbl", baseSchema, 0, 1, (short) 1, TStorageType.COLUMN,
+                    KeysType.AGG_KEYS);
             table.addPartition(partition);
             table.setBaseIndexId(baseIndex.getId());
             db.createTable(table);
 
-            new Expectations(catalog) {
+            InternalDataSource ds = Deencapsulation.newInstance(InternalDataSource.class);
+            new Expectations(ds) {
                 {
-                    catalog.getAuth();
-                    minTimes = 0;
-                    result = paloAuth;
-
-                    catalog.getDbNullable(50000L);
+                    ds.getDbNullable(50000L);
                     minTimes = 0;
                     result = db;
 
-                    catalog.getDbNullable("testCluster:testDb");
+                    ds.getDbNullable("testCluster:testDb");
                     minTimes = 0;
                     result = db;
 
-                    catalog.getDbNullable("testCluster:emptyDb");
+                    ds.getDbNullable("testCluster:emptyDb");
                     minTimes = 0;
                     result = null;
 
-                    catalog.getDbNullable(anyString);
+                    ds.getDbNullable(anyString);
                     minTimes = 0;
                     result = new Database();
 
-                    catalog.getDbNames();
+                    ds.getDbNames();
+                    minTimes = 0;
+                    result = Lists.newArrayList("testCluster:testDb");
+
+                    ds.getClusterDbNames("testCluster");
                     minTimes = 0;
                     result = Lists.newArrayList("testCluster:testDb");
+                }
+            };
+
+            new Expectations(catalog, ds) {
+                {
+                    catalog.getAuth();
+                    minTimes = 0;
+                    result = paloAuth;
+
+                    catalog.getCurrentDataSource();
+                    minTimes = 0;
+                    result = ds;
+
+                    catalog.getInternalDataSource();
+                    minTimes = 0;
+                    result = ds;
 
                     catalog.getEditLog();
                     minTimes = 0;
@@ -143,7 +160,7 @@ public class AccessTestUtil {
                     minTimes = 0;
                     result = new Load();
 
-                    catalog.getClusterDbNames("testCluster");
+                    ds.getClusterDbNames("testCluster");
                     minTimes = 0;
                     result = Lists.newArrayList("testCluster:testDb");
 
@@ -190,6 +207,10 @@ public class AccessTestUtil {
     public static OlapTable mockTable(String name) {
         Column column1 = new Column("col1", PrimitiveType.BIGINT);
         Column column2 = new Column("col2", PrimitiveType.DOUBLE);
+        Column column3 = new Column("k1", PrimitiveType.VARCHAR);
+        Column column4 = new Column("k2", PrimitiveType.VARCHAR);
+        Column column5 = new Column("k3", PrimitiveType.VARCHAR);
+        Column column6 = new Column("k4", PrimitiveType.BIGINT);
 
         MaterializedIndex index = new MaterializedIndex();
         new Expectations(index) {
@@ -223,6 +244,22 @@ public class AccessTestUtil {
                 table.getPartition(40000L);
                 minTimes = 0;
                 result = partition;
+
+                table.getColumn("k1");
+                minTimes = 0;
+                result = column3;
+
+                table.getColumn("k2");
+                minTimes = 0;
+                result = column4;
+
+                table.getColumn("k3");
+                minTimes = 0;
+                result = column5;
+
+                table.getColumn("k4");
+                minTimes = 0;
+                result = column6;
             }
         };
         return table;
@@ -238,6 +275,10 @@ public class AccessTestUtil {
                 minTimes = 0;
                 result = olapTable;
 
+                db.getTableNullable("t");
+                minTimes = 0;
+                result = olapTable;
+
                 db.getTableNullable("emptyTable");
                 minTimes = 0;
                 result = null;
@@ -271,41 +312,62 @@ public class AccessTestUtil {
             PaloAuth paloAuth = fetchBlockAccess();
             Database db = mockDb("testCluster:testDb");
 
-            new Expectations(catalog) {
+            InternalDataSource ds = Deencapsulation.newInstance(InternalDataSource.class);
+            new Expectations(ds) {
                 {
-                    catalog.getAuth();
+                    ds.getDbNullable("testCluster:testDb");
                     minTimes = 0;
-                    result = paloAuth;
+                    result = db;
 
-                    catalog.changeDb((ConnectContext) any, anyString);
+                    ds.getDbNullable("testCluster:testdb");
                     minTimes = 0;
-                    result = new DdlException("failed");
+                    result = db;
 
-                    catalog.getDbNullable("testCluster:testDb");
+                    ds.getDbOrAnalysisException("testdb");
                     minTimes = 0;
                     result = db;
 
-                    catalog.getDbNullable("testCluster:emptyDb");
+                    ds.getDbNullable("testCluster:emptyDb");
                     minTimes = 0;
                     result = null;
 
-                    catalog.getDbNullable(anyString);
+                    ds.getDbNullable(anyString);
                     minTimes = 0;
                     result = new Database();
 
-                    catalog.getDbNames();
+                    ds.getDbNames();
                     minTimes = 0;
                     result = Lists.newArrayList("testCluster:testDb");
 
-                    catalog.getClusterDbNames("testCluster");
+                    ds.getClusterDbNames("testCluster");
                     minTimes = 0;
                     result = Lists.newArrayList("testCluster:testDb");
 
-                    catalog.getDbNullable("emptyCluster");
+                    ds.getDbNullable("emptyCluster");
                     minTimes = 0;
                     result = null;
                 }
             };
+
+            new Expectations(catalog) {
+                {
+                    catalog.getAuth();
+                    minTimes = 0;
+                    result = paloAuth;
+
+                    catalog.changeDb((ConnectContext) any, anyString);
+                    minTimes = 0;
+                    result = new DdlException("failed");
+
+                    catalog.getInternalDataSource();
+                    minTimes = 0;
+                    result = ds;
+
+                    catalog.getCurrentDataSource();
+                    minTimes = 0;
+                    result = ds;
+                }
+            };
             return catalog;
         } catch (DdlException e) {
             return null;
@@ -488,6 +550,7 @@ public class AccessTestUtil {
                 result = "testDb";
             }
         };
+
         Catalog catalog = fetchBlockCatalog();
         Analyzer analyzer = new Analyzer(catalog, new ConnectContext(null));
         new Expectations(analyzer) {
@@ -500,10 +563,6 @@ public class AccessTestUtil {
                 minTimes = 0;
                 result = "testDb";
 
-                analyzer.getTableOrAnalysisException((TableName) any);
-                minTimes = 0;
-                result = table;
-
                 analyzer.getQualifiedUser();
                 minTimes = 0;
                 result = "testUser";
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/AdminShowReplicaTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/AdminShowReplicaTest.java
index 6401689302..7eab559cd4 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/AdminShowReplicaTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/AdminShowReplicaTest.java
@@ -67,7 +67,7 @@ public class AdminShowReplicaTest extends TestWithFeService {
         Assert.assertEquals(4, resultSet.getResultRows().get(0).size());
 
         // update tablets' data size and row count
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrAnalysisException("default_cluster:test");
         OlapTable olapTable = db.getOlapTableOrAnalysisException("tbl1");
         for (Partition partition : olapTable.getPartitions()) {
             for (MaterializedIndex index : partition.getMaterializedIndices(MaterializedIndex.IndexExtState.VISIBLE)) {
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateDataSyncJobStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateDataSyncJobStmtTest.java
index 7b78058d3f..00aa2d59b8 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateDataSyncJobStmtTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateDataSyncJobStmtTest.java
@@ -22,6 +22,7 @@ import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.KeysType;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.common.UserException;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.sync.DataSyncJobType;
 import org.apache.doris.mysql.privilege.PaloAuth;
 import org.apache.doris.mysql.privilege.PrivPredicate;
@@ -52,6 +53,8 @@ public class CreateDataSyncJobStmtTest {
     @Mocked
     Catalog catalog;
     @Mocked
+    InternalDataSource ds;
+    @Mocked
     Analyzer analyzer;
     @Mocked
     PaloAuth auth;
@@ -65,7 +68,11 @@ public class CreateDataSyncJobStmtTest {
         properties = Maps.newHashMap();
         new Expectations() {
             {
-                catalog.getDbNullable("testCluster:testDb");
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNullable("testCluster:testDb");
                 minTimes = 0;
                 result = database;
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateRoutineLoadStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateRoutineLoadStmtTest.java
index bbc27b8576..7c0e0e06b7 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateRoutineLoadStmtTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/CreateRoutineLoadStmtTest.java
@@ -22,6 +22,7 @@ import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.loadv2.LoadTask;
 import org.apache.doris.load.routineload.LoadDataSourceType;
 import org.apache.doris.qe.ConnectContext;
@@ -52,6 +53,8 @@ public class CreateRoutineLoadStmtTest {
 
     @Mocked
     private Catalog catalog;
+    @Mocked
+    private InternalDataSource ds;
 
     @Mocked
     private ConnectContext ctx;
@@ -69,7 +72,11 @@ public class CreateRoutineLoadStmtTest {
         };
         new Expectations() {
             {
-                catalog.getDbNullable(anyString);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNullable(anyString);
                 minTimes = 0;
                 result = database;
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/DataDescriptionTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/DataDescriptionTest.java
index 247b838646..239a4d6444 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/DataDescriptionTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/DataDescriptionTest.java
@@ -23,6 +23,7 @@ import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.loadv2.LoadTask;
 import org.apache.doris.mysql.privilege.MockedAuth;
 import org.apache.doris.mysql.privilege.PaloAuth;
@@ -55,6 +56,8 @@ public class DataDescriptionTest {
     private Analyzer analyzer;
     @Mocked
     private Catalog catalog;
+    @Mocked
+    private InternalDataSource ds;
 
     @Before
     public void setUp() throws AnalysisException {
@@ -78,7 +81,11 @@ public class DataDescriptionTest {
                 minTimes = 0;
                 result = catalog;
 
-                catalog.getDbNullable(anyString);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNullable(anyString);
                 minTimes = 0;
                 result = db;
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/DescribeStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/DescribeStmtTest.java
deleted file mode 100644
index 25f3e75daf..0000000000
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/DescribeStmtTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-// 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.
-
-package org.apache.doris.analysis;
-
-import org.apache.doris.catalog.Catalog;
-import org.apache.doris.common.UserException;
-import org.apache.doris.qe.ConnectContext;
-
-import mockit.Mock;
-import mockit.MockUp;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-
-public class DescribeStmtTest {
-    private Analyzer analyzer;
-    private Catalog catalog;
-    private ConnectContext ctx;
-
-    @Before
-    public void setUp() {
-        ctx = new ConnectContext(null);
-        ctx.setQualifiedUser("root");
-        ctx.setRemoteIP("192.168.1.1");
-
-        analyzer = AccessTestUtil.fetchAdminAnalyzer(true);
-        catalog = AccessTestUtil.fetchAdminCatalog();
-
-        new MockUp<ConnectContext>() {
-            @Mock
-            public ConnectContext get() {
-                return ctx;
-            }
-        };
-
-        new MockUp<Catalog>() {
-            @Mock
-            Catalog getCurrentCatalog() {
-                return catalog;
-            }
-        };
-    }
-
-    @Ignore
-    @Test
-    public void testNormal() throws UserException {
-        DescribeStmt stmt = new DescribeStmt(new TableName("", "testTbl"), false);
-        stmt.analyze(analyzer);
-        Assert.assertEquals("DESCRIBE `testCluster:testDb.testTbl`", stmt.toString());
-        Assert.assertEquals(6, stmt.getMetaData().getColumnCount());
-        Assert.assertEquals("testCluster:testDb", stmt.getDb());
-        Assert.assertEquals("testTbl", stmt.getTableName());
-    }
-
-    @Test
-    public void testAllNormal() throws UserException {
-        DescribeStmt stmt = new DescribeStmt(new TableName("", "testTbl"), true);
-        stmt.analyze(analyzer);
-        Assert.assertEquals("DESCRIBE `testCluster:testDb.testTbl` ALL", stmt.toString());
-        Assert.assertEquals(9, stmt.getMetaData().getColumnCount());
-        Assert.assertEquals("IndexKeysType", stmt.getMetaData().getColumn(1).getName());
-        Assert.assertEquals("testCluster:testDb", stmt.getDb());
-        Assert.assertEquals("testTbl", stmt.getTableName());
-    }
-}
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/GroupByClauseTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/GroupByClauseTest.java
index 01039f62c1..87aefa413f 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/GroupByClauseTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/GroupByClauseTest.java
@@ -242,6 +242,7 @@ public class GroupByClauseTest {
         try {
             groupByClause.analyze(analyzer);
         } catch (AnalysisException exception) {
+            exception.printStackTrace();
             Assert.assertTrue(false);
         }
     }
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/LoadStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/LoadStmtTest.java
index f5da3d1232..13988352d0 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/LoadStmtTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/LoadStmtTest.java
@@ -91,6 +91,9 @@ public class LoadStmtTest {
                 desc.toSql();
                 minTimes = 0;
                 result = "XXX";
+                desc.getTableName();
+                minTimes = 0;
+                result = "testTbl";
                 catalog.getResourceMgr();
                 result = resourceMgr;
                 resourceMgr.getResource(resourceName);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowDataStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowDataStmtTest.java
index 840c569005..ba78968e50 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowDataStmtTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/ShowDataStmtTest.java
@@ -23,6 +23,8 @@ import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.TabletInvertedIndex;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.UserException;
+import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.mysql.privilege.PaloAuth;
 import org.apache.doris.mysql.privilege.PrivPredicate;
 import org.apache.doris.qe.ConnectContext;
@@ -45,6 +47,8 @@ public class ShowDataStmtTest {
     @Mocked
     private Catalog catalog;
     @Mocked
+    private InternalDataSource ds;
+    @Mocked
     private ConnectContext ctx;
     @Mocked
     private TabletInvertedIndex invertedIndex;
@@ -54,9 +58,6 @@ public class ShowDataStmtTest {
     @Before
     public void setUp() throws UserException {
         auth = new PaloAuth();
-
-
-
         new Expectations() {
             {
                 Catalog.getCurrentInvertedIndex();
@@ -66,6 +67,7 @@ public class ShowDataStmtTest {
         };
 
         db = CatalogMocker.mockDb();
+        ds = Deencapsulation.newInstance(InternalDataSource.class);
 
         new Expectations() {
             {
@@ -93,7 +95,11 @@ public class ShowDataStmtTest {
                 minTimes = 0;
                 result = auth;
 
-                catalog.getDbOrAnalysisException(anyString);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbOrAnalysisException(anyString);
                 minTimes = 0;
                 result = db;
 
@@ -111,7 +117,6 @@ public class ShowDataStmtTest {
             }
         };
 
-
         new Expectations() {
             {
                 auth.checkGlobalPriv((ConnectContext) any, (PrivPredicate) any);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/TableNameComparedLowercaseTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/TableNameComparedLowercaseTest.java
index 0a9cfcc63e..ecf8e09dea 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/TableNameComparedLowercaseTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/TableNameComparedLowercaseTest.java
@@ -81,9 +81,9 @@ public class TableNameComparedLowercaseTest {
     }
 
     @Test
-    public void testTableNameLowerCase() {
-        Set<String> tableNames = Catalog.getCurrentCatalog()
-                .getDbNullable("default_cluster:db1").getTableNamesWithLock();
+    public void testTableNameLowerCasTe() {
+        Set<String> tableNames = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:db1")
+                .getTableNamesWithLock();
         Assert.assertEquals(2, tableNames.size());
         Assert.assertTrue(tableNames.contains("TABLE1"));
         Assert.assertTrue(tableNames.contains("TABLE2"));
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/TableNameStoredLowercaseTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/TableNameStoredLowercaseTest.java
index 89de4fc847..ee9fa65c70 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/TableNameStoredLowercaseTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/TableNameStoredLowercaseTest.java
@@ -81,8 +81,8 @@ public class TableNameStoredLowercaseTest {
 
     @Test
     public void testTableNameLowerCase() {
-        Set<String> tableNames = Catalog.getCurrentCatalog()
-                .getDbNullable("default_cluster:db1").getTableNamesWithLock();
+        Set<String> tableNames = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:db1")
+                .getTableNamesWithLock();
         Assert.assertEquals(2, tableNames.size());
         Assert.assertTrue(tableNames.contains("table1"));
         Assert.assertTrue(tableNames.contains("table2"));
diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/VirtualSlotRefTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/VirtualSlotRefTest.java
index f7e3abc3a7..843473d9a3 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/analysis/VirtualSlotRefTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/VirtualSlotRefTest.java
@@ -102,8 +102,6 @@ public class VirtualSlotRefTest {
         Assert.assertTrue(v instanceof VirtualSlotRef);
         Assert.assertTrue(((VirtualSlotRef) v).getRealSlots().get(0).equals(virtualSlot.getRealSlots().get(0)));
         Assert.assertFalse(((VirtualSlotRef) v).getRealSlots().get(0) == virtualSlot.getRealSlots().get(0));
-
-
     }
 
     @Test
diff --git a/fe/fe-core/src/test/java/org/apache/doris/backup/BackupHandlerTest.java b/fe/fe-core/src/test/java/org/apache/doris/backup/BackupHandlerTest.java
index ae1ec2bc0e..4b7ead4069 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/backup/BackupHandlerTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/backup/BackupHandlerTest.java
@@ -40,6 +40,8 @@ import org.apache.doris.catalog.Tablet;
 import org.apache.doris.catalog.TabletInvertedIndex;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.FeConstants;
+import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.persist.EditLog;
 import org.apache.doris.task.DirMoveTask;
 import org.apache.doris.task.DownloadTask;
@@ -82,6 +84,8 @@ public class BackupHandlerTest {
     @Mocked
     private Catalog catalog;
     @Mocked
+    private InternalDataSource ds;
+    @Mocked
     private BrokerMgr brokerMgr;
     @Mocked
     private EditLog editLog;
@@ -131,10 +135,15 @@ public class BackupHandlerTest {
         };
 
         db = CatalogMocker.mockDb();
+        ds = Deencapsulation.newInstance(InternalDataSource.class);
 
         new Expectations() {
             {
-                catalog.getDbOrDdlException(anyString);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbOrDdlException(anyString);
                 minTimes = 0;
                 result = db;
             }
diff --git a/fe/fe-core/src/test/java/org/apache/doris/backup/BackupJobTest.java b/fe/fe-core/src/test/java/org/apache/doris/backup/BackupJobTest.java
index 2d7ab5e26d..368d64a678 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/backup/BackupJobTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/backup/BackupJobTest.java
@@ -30,6 +30,7 @@ import org.apache.doris.common.Config;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.jmockit.Deencapsulation;
 import org.apache.doris.common.util.UnitTestUtil;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.persist.EditLog;
 import org.apache.doris.task.AgentBatchTask;
 import org.apache.doris.task.AgentTask;
@@ -84,6 +85,8 @@ public class BackupJobTest {
 
     @Mocked
     private Catalog catalog;
+    @Mocked
+    private InternalDataSource ds;
 
     private MockBackupHandler backupHandler;
 
@@ -146,10 +149,14 @@ public class BackupJobTest {
         Deencapsulation.setField(catalog, "backupHandler", backupHandler);
 
         db = UnitTestUtil.createDb(dbId, tblId, partId, idxId, tabletId, backendId, version);
-
+        ds = Deencapsulation.newInstance(InternalDataSource.class);
         new Expectations(catalog) {
             {
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = db;
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/backup/CatalogMocker.java b/fe/fe-core/src/test/java/org/apache/doris/backup/CatalogMocker.java
index 4bf24e1315..94e6f7cbe9 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/backup/CatalogMocker.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/backup/CatalogMocker.java
@@ -50,6 +50,7 @@ import org.apache.doris.common.DdlException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.jmockit.Deencapsulation;
 import org.apache.doris.common.util.Util;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.Load;
 import org.apache.doris.mysql.privilege.PaloAuth;
 import org.apache.doris.mysql.privilege.PrivPredicate;
@@ -395,33 +396,42 @@ public class CatalogMocker {
             FakeEditLog fakeEditLog = new FakeEditLog(); // CHECKSTYLE IGNORE THIS LINE
 
             Catalog catalog = Deencapsulation.newInstance(Catalog.class);
+            InternalDataSource ds = Deencapsulation.newInstance(InternalDataSource.class);
 
             Database db = new Database();
             PaloAuth paloAuth = fetchAdminAccess();
 
-            new Expectations(catalog) {
+            new Expectations(catalog, ds) {
                 {
                     catalog.getAuth();
                     minTimes = 0;
                     result = paloAuth;
 
-                    catalog.getDbNullable(TEST_DB_NAME);
+                    catalog.getInternalDataSource();
+                    minTimes = 0;
+                    result = ds;
+
+                    catalog.getCurrentDataSource();
+                    minTimes = 0;
+                    result = ds;
+
+                    ds.getDbNullable(TEST_DB_NAME);
                     minTimes = 0;
                     result = db;
 
-                    catalog.getDbNullable(WRONG_DB);
+                    ds.getDbNullable(WRONG_DB);
                     minTimes = 0;
                     result = null;
 
-                    catalog.getDbNullable(TEST_DB_ID);
+                    ds.getDbNullable(TEST_DB_ID);
                     minTimes = 0;
                     result = db;
 
-                    catalog.getDbNullable(anyString);
+                    ds.getDbNullable(anyString);
                     minTimes = 0;
                     result = new Database();
 
-                    catalog.getDbNames();
+                    ds.getDbNames();
                     minTimes = 0;
                     result = Lists.newArrayList(TEST_DB_NAME);
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/backup/RestoreJobTest.java b/fe/fe-core/src/test/java/org/apache/doris/backup/RestoreJobTest.java
index 4e483e3817..10d76f4ff1 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/backup/RestoreJobTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/backup/RestoreJobTest.java
@@ -36,6 +36,7 @@ import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.MarkedCountDownLatch;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.persist.EditLog;
 import org.apache.doris.system.SystemInfoService;
 import org.apache.doris.thrift.TStorageMedium;
@@ -71,6 +72,8 @@ public class RestoreJobTest {
 
     @Mocked
     private Catalog catalog;
+    @Mocked
+    private InternalDataSource ds;
 
     private MockBackupHandler backupHandler;
 
@@ -121,7 +124,11 @@ public class RestoreJobTest {
 
         new Expectations() {
             {
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = db;
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/AdminStmtTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/AdminStmtTest.java
index d3b4bbdc39..ecafe005c7 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/AdminStmtTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/AdminStmtTest.java
@@ -54,7 +54,7 @@ public class AdminStmtTest extends TestWithFeService {
 
     @Test
     public void testAdminSetReplicaStatus() throws Exception {
-        Database db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test");
         Assert.assertNotNull(db);
         OlapTable tbl = (OlapTable) db.getTableNullable("tbl1");
         Assert.assertNotNull(tbl);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/CatalogOperationTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/CatalogOperationTest.java
index 6d33953d9d..5b28f065f2 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/CatalogOperationTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/CatalogOperationTest.java
@@ -110,7 +110,7 @@ public class CatalogOperationTest {
         String renameTblStmt = "alter table test.renameTest rename newNewTest";
         AlterTableStmt alterTableStmt = (AlterTableStmt) UtFrameUtils.parseAndAnalyzeStmt(renameTblStmt, connectContext);
 
-        Database db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test");
         Assert.assertNotNull(db);
         Assert.assertNotNull(db.getTableNullable("renameTest"));
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/CatalogTestUtil.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/CatalogTestUtil.java
index ab6880332a..7d81d30df4 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/CatalogTestUtil.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/CatalogTestUtil.java
@@ -120,8 +120,8 @@ public class CatalogTestUtil {
 
     public static boolean compareCatalog(Catalog masterCatalog, Catalog slaveCatalog) {
         try {
-            Database masterDb = masterCatalog.getDbOrMetaException(testDb1);
-            Database slaveDb = slaveCatalog.getDbOrMetaException(testDb1);
+            Database masterDb = masterCatalog.getInternalDataSource().getDbOrMetaException(testDb1);
+            Database slaveDb = slaveCatalog.getInternalDataSource().getDbOrMetaException(testDb1);
             List<Table> tables = masterDb.getTables();
             for (Table table : tables) {
                 Table slaveTable = slaveDb.getTableOrMetaException(table.getId());
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/ColocateTableTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/ColocateTableTest.java
index 5338e8aa40..a6b65ac1c7 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/ColocateTableTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/ColocateTableTest.java
@@ -110,7 +110,7 @@ public class ColocateTableTest {
                 + ");");
 
         ColocateTableIndex index = Catalog.getCurrentColocateIndex();
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
         long tableId = db.getTableOrMetaException(tableName1).getId();
 
         Assert.assertEquals(1, Deencapsulation.<Multimap<GroupId, Long>>getField(index, "group2Tables").size());
@@ -165,7 +165,7 @@ public class ColocateTableTest {
                 + ");");
 
         ColocateTableIndex index = Catalog.getCurrentColocateIndex();
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
         long firstTblId = db.getTableOrMetaException(tableName1).getId();
         long secondTblId = db.getTableOrMetaException(tableName2).getId();
 
@@ -340,7 +340,7 @@ public class ColocateTableTest {
                 + ");");
 
         ColocateTableIndex index = Catalog.getCurrentColocateIndex();
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException(fullDbName);
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException(fullDbName);
         long tableId = db.getTableOrMetaException(tableName1).getId();
         GroupId groupId1 = index.getGroup(tableId);
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateEncryptKeyTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateEncryptKeyTest.java
index ed4c055e42..76ca40c4aa 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateEncryptKeyTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateEncryptKeyTest.java
@@ -63,9 +63,9 @@ public class CreateEncryptKeyTest {
         String createDbStmtStr = "create database db1;";
         CreateDbStmt createDbStmt = (CreateDbStmt) UtFrameUtils.parseAndAnalyzeStmt(createDbStmtStr, ctx);
         Catalog.getCurrentCatalog().createDb(createDbStmt);
-        System.out.println(Catalog.getCurrentCatalog().getDbNames());
+        System.out.println(Catalog.getCurrentInternalCatalog().getDbNames());
 
-        Database db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:db1");
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:db1");
         Assert.assertNotNull(db);
 
         String createFuncStr = "create encryptkey db1.my_key as \"beijing\";";
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateFunctionTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateFunctionTest.java
index 05f25c937b..d449ab28b1 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateFunctionTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateFunctionTest.java
@@ -76,7 +76,7 @@ public class CreateFunctionTest {
         String createDbStmtStr = "create database db1;";
         CreateDbStmt createDbStmt = (CreateDbStmt) UtFrameUtils.parseAndAnalyzeStmt(createDbStmtStr, ctx);
         Catalog.getCurrentCatalog().createDb(createDbStmt);
-        System.out.println(Catalog.getCurrentCatalog().getDbNames());
+        System.out.println(Catalog.getCurrentInternalCatalog().getDbNames());
 
         String createTblStmtStr = "create table db1.tbl1(k1 int, k2 bigint, k3 varchar(10), k4 char(5)) duplicate key(k1) "
                 + "distributed by hash(k2) buckets 1 properties('replication_num' = '1');";
@@ -86,7 +86,7 @@ public class CreateFunctionTest {
         dorisAssert = new DorisAssert();
         dorisAssert.useDatabase("db1");
 
-        Database db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:db1");
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:db1");
         Assert.assertNotNull(db);
 
         String createFuncStr = "create function db1.my_add(VARCHAR(1024)) RETURNS BOOLEAN properties\n"
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateTableLikeTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateTableLikeTest.java
index 8eb1359fef..fa72df0f37 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateTableLikeTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateTableLikeTest.java
@@ -112,8 +112,10 @@ public class CreateTableLikeTest {
             String existedDbName, String newTblName, String existedTblName, int rollupSize) throws Exception {
         createTable(createTableSql);
         createTableLike(createTableLikeSql);
-        Database newDb = Catalog.getCurrentCatalog().getDbOrDdlException("default_cluster:" + newDbName);
-        Database existedDb = Catalog.getCurrentCatalog().getDbOrDdlException("default_cluster:" + existedDbName);
+        Database newDb =
+                Catalog.getCurrentInternalCatalog().getDbOrDdlException("default_cluster:" + newDbName);
+        Database existedDb = Catalog.getCurrentInternalCatalog()
+                .getDbOrDdlException("default_cluster:" + existedDbName);
         OlapTable newTbl = (OlapTable) newDb.getTableOrDdlException(newTblName);
         OlapTable existedTbl = (OlapTable) existedDb.getTableOrDdlException(existedTblName);
         checkTableEqual(newTbl, existedTbl, rollupSize);
@@ -124,8 +126,10 @@ public class CreateTableLikeTest {
 
         createTable(createTableSql);
         createTableLike(createTableLikeSql);
-        Database newDb = Catalog.getCurrentCatalog().getDbOrDdlException("default_cluster:" + newDbName);
-        Database existedDb = Catalog.getCurrentCatalog().getDbOrDdlException("default_cluster:" + existedDbName);
+        Database newDb =
+                Catalog.getCurrentInternalCatalog().getDbOrDdlException("default_cluster:" + newDbName);
+        Database existedDb = Catalog.getCurrentInternalCatalog()
+                .getDbOrDdlException("default_cluster:" + existedDbName);
         MysqlTable newTbl = (MysqlTable) newDb.getTableOrDdlException(newTblName);
         MysqlTable existedTbl = (MysqlTable) existedDb.getTableOrDdlException(existedTblName);
         checkTableEqual(newTbl, existedTbl, 0);
@@ -141,7 +145,7 @@ public class CreateTableLikeTest {
                 + "    partition p2 VALUES  [(\"20211201\"),(\"20220101\"))\n" + ")\n"
                 + "DISTRIBUTED BY HASH(`id1`) BUCKETS 1\n" + "PROPERTIES (\n" + "\"replication_num\" = \"1\"\n" + ");";
         createTable(createTableSql);
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable table = (OlapTable) db.getTableOrDdlException("bucket_distribution_test");
         DistributionInfo defaultInfo = table.getDefaultDistributionInfo();
         DistributionInfo previous = null;
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateTableTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateTableTest.java
index 17ddd906c0..f481c679c3 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateTableTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateTableTest.java
@@ -208,7 +208,7 @@ public class CreateTableTest {
                         + "distributed by hash(k2) buckets 1\n"
                         + "properties('replication_num' = '1');"));
 
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException("default_cluster:test");
         OlapTable tbl6 = (OlapTable) db.getTableOrDdlException("tbl6");
         Assert.assertTrue(tbl6.getColumn("k1").isKey());
         Assert.assertTrue(tbl6.getColumn("k2").isKey());
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateViewTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateViewTest.java
index 3a895b0627..6b71365c09 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateViewTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/CreateViewTest.java
@@ -87,7 +87,7 @@ public class CreateViewTest {
                 () -> createView("create view test.view5 as select * from test.tbl1 where hour(now()) > 3"
                         + " and curdate() > '2021-06-26';"));
 
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException("default_cluster:test");
 
         View view1 = (View) db.getTableOrDdlException("view1");
         Assert.assertEquals(4, view1.getFullSchema().size());
@@ -136,7 +136,7 @@ public class CreateViewTest {
         String originStmt = "select k1 as kc1, sum(k2) as kc2 from test.tbl1 group by kc1";
         ExceptionChecker.expectThrowsNoException(
                 () -> createView("create view test.alter1 as " + originStmt));
-        Database db = Catalog.getCurrentCatalog().getDbOrDdlException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrDdlException("default_cluster:test");
         View alter1 = (View) db.getTableOrDdlException("alter1");
         Assert.assertEquals("SELECT `k1` AS `kc1`, sum(`k2`) AS `kc2` FROM `default_cluster:test`.`tbl1` GROUP BY `kc1`", alter1.getInlineViewDef());
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/DropDbTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/DropDbTest.java
index ca2f1cb953..c742719e60 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/DropDbTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/DropDbTest.java
@@ -84,20 +84,20 @@ public class DropDbTest {
 
     @Test
     public void testNormalDropDb() throws Exception {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test1");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test1");
         OlapTable table = (OlapTable) db.getTableOrMetaException("tbl1");
         Partition partition = table.getAllPartitions().iterator().next();
         long tabletId = partition.getBaseIndex().getTablets().get(0).getId();
         String dropDbSql = "drop database test1";
         dropDb(dropDbSql);
-        db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test1");
+        db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test1");
         Assert.assertNull(db);
         List<Replica> replicaList = Catalog.getCurrentCatalog().getTabletInvertedIndex().getReplicasByTabletId(tabletId);
         Assert.assertEquals(1, replicaList.size());
         String recoverDbSql = "recover database test1";
         RecoverDbStmt recoverDbStmt = (RecoverDbStmt) UtFrameUtils.parseAndAnalyzeStmt(recoverDbSql, connectContext);
         Catalog.getCurrentCatalog().recoverDatabase(recoverDbStmt);
-        db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test1");
+        db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test1");
         Assert.assertNotNull(db);
         Assert.assertEquals("default_cluster:test1", db.getFullName());
         table = (OlapTable) db.getTableOrMetaException("tbl1");
@@ -106,27 +106,27 @@ public class DropDbTest {
 
         dropDbSql = "drop schema test1";
         dropDb(dropDbSql);
-        db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test1");
+        db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test1");
         Assert.assertNull(db);
         Catalog.getCurrentCatalog().recoverDatabase(recoverDbStmt);
-        db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test1");
+        db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test1");
         Assert.assertNotNull(db);
 
         dropDbSql = "drop schema if exists test1";
         dropDb(dropDbSql);
-        db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test1");
+        db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test1");
         Assert.assertNull(db);
     }
 
     @Test
     public void testForceDropDb() throws Exception {
         String dropDbSql = "drop database test2 force";
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test2");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test2");
         OlapTable table = (OlapTable) db.getTableOrMetaException("tbl1");
         Partition partition = table.getAllPartitions().iterator().next();
         long tabletId = partition.getBaseIndex().getTablets().get(0).getId();
         dropDb(dropDbSql);
-        db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test2");
+        db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test2");
         List<Replica> replicaList = Catalog.getCurrentCatalog().getTabletInvertedIndex().getReplicasByTabletId(tabletId);
         Assert.assertNull(db);
         Assert.assertTrue(replicaList.isEmpty());
@@ -137,10 +137,10 @@ public class DropDbTest {
                 () -> Catalog.getCurrentCatalog().recoverDatabase(recoverDbStmt));
 
         dropDbSql = "drop schema test3 force";
-        db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test3");
+        db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test3");
         Assert.assertNotNull(db);
         dropDb(dropDbSql);
-        db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test3");
+        db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test3");
         Assert.assertNull(db);
         recoverDbSql = "recover database test3";
         RecoverDbStmt recoverDbStmt2 = (RecoverDbStmt) UtFrameUtils.parseAndAnalyzeStmt(recoverDbSql, connectContext);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/DropPartitionTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/DropPartitionTest.java
index 144ee765cc..7bd4f54cc3 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/DropPartitionTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/DropPartitionTest.java
@@ -80,7 +80,7 @@ public class DropPartitionTest {
 
     @Test
     public void testNormalDropPartition() throws Exception {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable table = (OlapTable) db.getTableOrMetaException("tbl1", Table.TableType.OLAP);
         Partition partition = table.getPartition("p20210201");
         long tabletId = partition.getBaseIndex().getTablets().get(0).getId();
@@ -100,7 +100,7 @@ public class DropPartitionTest {
 
     @Test
     public void testForceDropPartition() throws Exception {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable table = (OlapTable) db.getTableOrMetaException("tbl1", Table.TableType.OLAP);
         Partition partition = table.getPartition("p20210202");
         long tabletId = partition.getBaseIndex().getTablets().get(0).getId();
@@ -119,7 +119,7 @@ public class DropPartitionTest {
 
     @Test
     public void testDropPartitionAndReserveTablets() throws Exception {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable table = (OlapTable) db.getTableOrMetaException("tbl1", Table.TableType.OLAP);
         Partition partition = table.getPartition("p20210203");
         long tabletId = partition.getBaseIndex().getTablets().get(0).getId();
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/DropTableTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/DropTableTest.java
index f96c60cc37..12975074a7 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/DropTableTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/DropTableTest.java
@@ -80,7 +80,7 @@ public class DropTableTest {
 
     @Test
     public void testNormalDropTable() throws Exception {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable table = (OlapTable) db.getTableOrMetaException("tbl1");
         Partition partition = table.getAllPartitions().iterator().next();
         long tabletId = partition.getBaseIndex().getTablets().get(0).getId();
@@ -98,7 +98,7 @@ public class DropTableTest {
 
     @Test
     public void testForceDropTable() throws Exception {
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable table = (OlapTable) db.getTableOrMetaException("tbl2");
         Partition partition = table.getAllPartitions().iterator().next();
         long tabletId = partition.getBaseIndex().getTablets().get(0).getId();
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java
index c2a6098b11..9f12eb7f10 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/DynamicPartitionTableTest.java
@@ -94,29 +94,18 @@ public class DynamicPartitionTableTest {
                 + "  `k1` date NULL COMMENT \"\",\n"
                 + "  `k2` int NULL COMMENT \"\",\n"
                 + "  `k3` smallint NULL COMMENT \"\",\n"
-                + "  `v1` varchar(2048) NULL COMMENT \"\",\n"
-                + "  `v2` datetime NULL COMMENT \"\"\n"
-                + ") ENGINE=OLAP\n"
-                + "DUPLICATE KEY(`k1`, `k2`, `k3`)\n"
-                + "COMMENT \"OLAP\"\n"
-                + "PARTITION BY RANGE (k1)\n"
-                + "(\n"
-                + "PARTITION p1 VALUES LESS THAN (\"2014-01-01\"),\n"
+                + "  `v1` varchar(2048) NULL COMMENT \"\",\n" + "  `v2` datetime NULL COMMENT \"\"\n"
+                + ") ENGINE=OLAP\n" + "DUPLICATE KEY(`k1`, `k2`, `k3`)\n" + "COMMENT \"OLAP\"\n"
+                + "PARTITION BY RANGE (k1)\n" + "(\n" + "PARTITION p1 VALUES LESS THAN (\"2014-01-01\"),\n"
                 + "PARTITION p2 VALUES LESS THAN (\"2014-06-01\"),\n"
-                + "PARTITION p3 VALUES LESS THAN (\"2014-12-01\")\n"
-                + ")\n"
-                + "DISTRIBUTED BY HASH(`k1`) BUCKETS 32\n"
-                + "PROPERTIES (\n"
-                + "\"replication_num\" = \"1\",\n"
-                + "\"dynamic_partition.enable\" = \"true\",\n"
-                + "\"dynamic_partition.start\" = \"-3\",\n"
-                + "\"dynamic_partition.end\" = \"3\",\n"
-                + "\"dynamic_partition.time_unit\" = \"day\",\n"
-                + "\"dynamic_partition.prefix\" = \"p\",\n"
-                + "\"dynamic_partition.buckets\" = \"1\"\n"
-                + ");";
+                + "PARTITION p3 VALUES LESS THAN (\"2014-12-01\")\n" + ")\n" + "DISTRIBUTED BY HASH(`k1`) BUCKETS 32\n"
+                + "PROPERTIES (\n" + "\"replication_num\" = \"1\",\n" + "\"dynamic_partition.enable\" = \"true\",\n"
+                + "\"dynamic_partition.start\" = \"-3\",\n" + "\"dynamic_partition.end\" = \"3\",\n"
+                + "\"dynamic_partition.time_unit\" = \"day\",\n" + "\"dynamic_partition.prefix\" = \"p\",\n"
+                + "\"dynamic_partition.buckets\" = \"1\"\n" + ");";
         createTable(createOlapTblStmt);
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test");
+        Database db =
+                Catalog.getCurrentInternalCatalog().getDbOrAnalysisException("default_cluster:test");
         OlapTable table = (OlapTable) db.getTableOrAnalysisException("dynamic_partition_normal");
         Assert.assertTrue(table.getTableProperty().getDynamicPartitionProperty().getReplicaAllocation().isNotSet());
     }
@@ -434,39 +423,33 @@ public class DynamicPartitionTableTest {
                 + "  `k2` int NULL COMMENT \"\",\n"
                 + "  `k3` smallint NULL COMMENT \"\",\n"
                 + "  `v1` varchar(2048) NULL COMMENT \"\",\n"
-                + "  `v2` datetime NULL COMMENT \"\"\n"
-                + ") ENGINE=OLAP\n"
-                + "DUPLICATE KEY(`k1`, `k2`, `k3`)\n"
-                + "COMMENT \"OLAP\"\n"
-                + "PARTITION BY RANGE (k1)\n"
-                + "(\n"
+                + "  `v2` datetime NULL COMMENT \"\"\n" + ") ENGINE=OLAP\n" + "DUPLICATE KEY(`k1`, `k2`, `k3`)\n"
+                + "COMMENT \"OLAP\"\n" + "PARTITION BY RANGE (k1)\n" + "(\n"
                 + "PARTITION p1 VALUES LESS THAN (\"2014-01-01\"),\n"
                 + "PARTITION p2 VALUES LESS THAN (\"2014-06-01\"),\n"
-                + "PARTITION p3 VALUES LESS THAN (\"2014-12-01\")\n"
-                + ")\n"
-                + "DISTRIBUTED BY HASH(`k1`) BUCKETS 32\n"
-                + "PROPERTIES (\n"
-                + "\"replication_num\" = \"1\",\n"
-                + "\"dynamic_partition.enable\" = \"true\",\n"
-                + "\"dynamic_partition.start\" = \"-3\",\n"
-                + "\"dynamic_partition.end\" = \"3\",\n"
-                + "\"dynamic_partition.time_unit\" = \"day\",\n"
-                + "\"dynamic_partition.prefix\" = \"p\",\n"
-                + "\"dynamic_partition.buckets\" = \"1\",\n"
-                + "\"dynamic_partition.replication_num\" = \"2\"\n"
-                + ");";
+                + "PARTITION p3 VALUES LESS THAN (\"2014-12-01\")\n" + ")\n" + "DISTRIBUTED BY HASH(`k1`) BUCKETS 32\n"
+                + "PROPERTIES (\n" + "\"replication_num\" = \"1\",\n" + "\"dynamic_partition.enable\" = \"true\",\n"
+                + "\"dynamic_partition.start\" = \"-3\",\n" + "\"dynamic_partition.end\" = \"3\",\n"
+                + "\"dynamic_partition.time_unit\" = \"day\",\n" + "\"dynamic_partition.prefix\" = \"p\",\n"
+                + "\"dynamic_partition.buckets\" = \"1\",\n" + "\"dynamic_partition.replication_num\" = \"2\"\n" + ");";
         createTable(createOlapTblStmt);
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test");
+        Database db =
+                Catalog.getCurrentInternalCatalog().getDbOrAnalysisException("default_cluster:test");
         OlapTable table = (OlapTable) db.getTableOrAnalysisException(tableName);
-        Assert.assertEquals(2, table.getTableProperty().getDynamicPartitionProperty().getReplicaAllocation().getTotalReplicaNum());
+        Assert.assertEquals(2,
+                table.getTableProperty().getDynamicPartitionProperty().getReplicaAllocation().getTotalReplicaNum());
 
-        String alter1 = "alter table test.dynamic_partition_replication_num set ('dynamic_partition.replication_num' = '1')";
+        String alter1 =
+                "alter table test.dynamic_partition_replication_num set ('dynamic_partition.replication_num' = '1')";
         ExceptionChecker.expectThrowsNoException(() -> alterTable(alter1));
-        Assert.assertEquals(1, table.getTableProperty().getDynamicPartitionProperty().getReplicaAllocation().getTotalReplicaNum());
+        Assert.assertEquals(1,
+                table.getTableProperty().getDynamicPartitionProperty().getReplicaAllocation().getTotalReplicaNum());
 
-        String alter2 = "alter table test.dynamic_partition_replication_num set ('dynamic_partition.replication_num' = '0')";
+        String alter2 =
+                "alter table test.dynamic_partition_replication_num set ('dynamic_partition.replication_num' = '0')";
         ExceptionChecker.expectThrows(AnalysisException.class, () -> alterTable(alter2));
-        Assert.assertEquals(1, table.getTableProperty().getDynamicPartitionProperty().getReplicaAllocation().getTotalReplicaNum());
+        Assert.assertEquals(1,
+                table.getTableProperty().getDynamicPartitionProperty().getReplicaAllocation().getTotalReplicaNum());
     }
 
     @Test
@@ -493,7 +476,9 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.buckets\" = \"1\"\n"
                 + ");";
         createTable(createOlapTblStmt);
-        OlapTable emptyDynamicTable = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("empty_dynamic_partition");
+        OlapTable emptyDynamicTable = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test")
+                .getTableOrAnalysisException("empty_dynamic_partition");
         Assert.assertTrue(emptyDynamicTable.getAllPartitions().size() == 4);
 
         Iterator<Partition> partitionIterator = emptyDynamicTable.getAllPartitions().iterator();
@@ -547,7 +532,9 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.buckets\" = \"1\"\n"
                 + ");";
         createTable(createOlapTblStmt);
-        OlapTable emptyDynamicTable = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("histo_dynamic_partition");
+        OlapTable emptyDynamicTable = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test")
+                .getTableOrAnalysisException("histo_dynamic_partition");
         Assert.assertEquals(7, emptyDynamicTable.getAllPartitions().size());
 
         Iterator<Partition> partitionIterator = emptyDynamicTable.getAllPartitions().iterator();
@@ -665,37 +652,33 @@ public class DynamicPartitionTableTest {
         // start is set but too small,history_partition_num is not set, can not create history partition
         ExceptionChecker.expectThrowsWithMsg(DdlException.class, "Too many dynamic partitions", () -> createTable(createOlapTblStmt3));
 
-        String createOlapTblStmt4 = "CREATE TABLE test.`dynamic_partition3` (\n"
-                + "  `k1` date NULL COMMENT \"\"\n"
-                + ")\n"
-                + "PARTITION BY RANGE (k1)\n"
-                + "()\n"
-                + "DISTRIBUTED BY HASH(`k1`) BUCKETS 1\n"
-                + "PROPERTIES (\n"
-                + "\"replication_num\" = \"1\",\n"
-                + "\"dynamic_partition.enable\" = \"true\",\n"
-                + "\"dynamic_partition.end\" = \"3\",\n"
-                + "\"dynamic_partition.time_unit\" = \"day\",\n"
-                + "\"dynamic_partition.prefix\" = \"p\",\n"
-                + "\"dynamic_partition.buckets\" = \"1\",\n"
-                + "\"dynamic_partition.start\" = \"-10\",\n"
-                + "\"dynamic_partition.history_partition_num\" = \"5\",\n"
-                + "\"dynamic_partition.create_history_partition\" = \"true\"\n"
-                + ");";
+        String createOlapTblStmt4 =
+                "CREATE TABLE test.`dynamic_partition3` (\n" + "  `k1` date NULL COMMENT \"\"\n" + ")\n"
+                        + "PARTITION BY RANGE (k1)\n" + "()\n" + "DISTRIBUTED BY HASH(`k1`) BUCKETS 1\n"
+                        + "PROPERTIES (\n" + "\"replication_num\" = \"1\",\n"
+                        + "\"dynamic_partition.enable\" = \"true\",\n" + "\"dynamic_partition.end\" = \"3\",\n"
+                        + "\"dynamic_partition.time_unit\" = \"day\",\n" + "\"dynamic_partition.prefix\" = \"p\",\n"
+                        + "\"dynamic_partition.buckets\" = \"1\",\n" + "\"dynamic_partition.start\" = \"-10\",\n"
+                        + "\"dynamic_partition.history_partition_num\" = \"5\",\n"
+                        + "\"dynamic_partition.create_history_partition\" = \"true\"\n" + ");";
         // start and history_partition_num are set, create ok
         ExceptionChecker.expectThrowsNoException(() -> createTable(createOlapTblStmt4));
-        Database db = Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test");
+        Database db =
+                Catalog.getCurrentInternalCatalog().getDbOrAnalysisException("default_cluster:test");
         OlapTable tbl = (OlapTable) db.getTableOrAnalysisException("dynamic_partition3");
         Assert.assertEquals(9, tbl.getPartitionNames().size());
 
         // alter dynamic partition property of table dynamic_partition3
         // start too small
-        String alter1 = "alter table test.dynamic_partition3 set ('dynamic_partition.start' = '-1000', 'dynamic_partition.history_partition_num' = '1000')";
-        ExceptionChecker.expectThrowsWithMsg(DdlException.class, "Too many dynamic partitions", () -> alterTable(alter1));
+        String alter1 =
+                "alter table test.dynamic_partition3 set ('dynamic_partition.start' = '-1000', 'dynamic_partition.history_partition_num' = '1000')";
+        ExceptionChecker.expectThrowsWithMsg(DdlException.class, "Too many dynamic partitions",
+                () -> alterTable(alter1));
 
         // end too large
         String alter2 = "alter table test.dynamic_partition3 set ('dynamic_partition.end' = '1000')";
-        ExceptionChecker.expectThrowsWithMsg(DdlException.class, "Too many dynamic partitions", () -> alterTable(alter2));
+        ExceptionChecker.expectThrowsWithMsg(DdlException.class, "Too many dynamic partitions",
+                () -> alterTable(alter2));
 
         // history_partition_num too large, but because start is -10, so modify ok
         String alter3 = "alter table test.dynamic_partition3 set ('dynamic_partition.history_partition_num' = '1000')";
@@ -728,7 +711,9 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.buckets\" = \"1\"\n"
                 + ");";
         createTable(createOlapTblStmt);
-        OlapTable emptyDynamicTable = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("history_dynamic_partition_day");
+        OlapTable emptyDynamicTable = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test")
+                .getTableOrAnalysisException("history_dynamic_partition_day");
         Map<String, String> tableProperties = emptyDynamicTable.getTableProperty().getProperties();
         Assert.assertEquals(14, emptyDynamicTable.getAllPartitions().size());
         // never delete the old partitions
@@ -755,7 +740,8 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.buckets\" = \"1\"\n"
                 + ");";
         createTable(createOlapTblStmt);
-        OlapTable emptyDynamicTable = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("hour_dynamic_partition");
+        OlapTable emptyDynamicTable = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("hour_dynamic_partition");
         Assert.assertEquals(7, emptyDynamicTable.getAllPartitions().size());
 
         Iterator<Partition> partitionIterator = emptyDynamicTable.getAllPartitions().iterator();
@@ -782,7 +768,8 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.buckets\" = \"1\"\n"
                 + ");";
         createTable(createOlapTblStmt);
-        emptyDynamicTable = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("week_dynamic_partition");
+        emptyDynamicTable = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("week_dynamic_partition");
         Assert.assertEquals(7, emptyDynamicTable.getAllPartitions().size());
 
         partitionIterator = emptyDynamicTable.getAllPartitions().iterator();
@@ -809,7 +796,9 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.buckets\" = \"1\"\n"
                 + ");";
         createTable(createOlapTblStmt);
-        emptyDynamicTable = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("month_dynamic_partition");
+        emptyDynamicTable = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test")
+                .getTableOrAnalysisException("month_dynamic_partition");
         Assert.assertEquals(7, emptyDynamicTable.getAllPartitions().size());
 
         partitionIterator = emptyDynamicTable.getAllPartitions().iterator();
@@ -836,7 +825,9 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.buckets\" = \"1\"\n"
                 + ");";
         createTable(createOlapTblStmt);
-        emptyDynamicTable = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("int_dynamic_partition_day");
+        emptyDynamicTable = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test")
+                .getTableOrAnalysisException("int_dynamic_partition_day");
         Assert.assertEquals(7, emptyDynamicTable.getAllPartitions().size());
 
         partitionIterator = emptyDynamicTable.getAllPartitions().iterator();
@@ -863,7 +854,9 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.buckets\" = \"1\"\n"
                 + ");";
         createTable(createOlapTblStmt);
-        emptyDynamicTable = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("int_dynamic_partition_week");
+        emptyDynamicTable = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test")
+                .getTableOrAnalysisException("int_dynamic_partition_week");
         Assert.assertEquals(7, emptyDynamicTable.getAllPartitions().size());
 
         partitionIterator = emptyDynamicTable.getAllPartitions().iterator();
@@ -890,7 +883,9 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.buckets\" = \"1\"\n"
                 + ");";
         createTable(createOlapTblStmt);
-        emptyDynamicTable = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("int_dynamic_partition_month");
+        emptyDynamicTable = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test")
+                .getTableOrAnalysisException("int_dynamic_partition_month");
         Assert.assertEquals(7, emptyDynamicTable.getAllPartitions().size());
 
         partitionIterator = emptyDynamicTable.getAllPartitions().iterator();
@@ -924,7 +919,8 @@ public class DynamicPartitionTableTest {
 
     @Test
     public void testHotPartitionNum() throws Exception {
-        Database testDb = Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test");
+        Database testDb =
+                Catalog.getCurrentInternalCatalog().getDbOrAnalysisException("default_cluster:test");
         // 1. hour
         String createOlapTblStmt = "CREATE TABLE test.`hot_partition_hour_tbl1` (\n"
                 + "  `k1` datetime NULL COMMENT \"\",\n"
@@ -1215,7 +1211,9 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.prefix\" = \"p\"\n"
                 + ");";
         createTable(createOlapTblStmt);
-        OlapTable table = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("dynamic_partition_miss_reserved_history_periods");
+        OlapTable table = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test")
+                .getTableOrAnalysisException("dynamic_partition_miss_reserved_history_periods");
         Assert.assertEquals("NULL", table.getTableProperty().getDynamicPartitionProperty().getReservedHistoryPeriods());
     }
 
@@ -1256,7 +1254,9 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.reserved_history_periods\" = \"[2020-06-01,2020-06-20],[2020-10-25,2020-11-15],[2021-06-01,2021-06-20]\"\n"
                 + ");";
         createTable(createOlapTblStmt);
-        OlapTable table = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("dynamic_partition_normal_reserved_history_periods");
+        OlapTable table = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test")
+                .getTableOrAnalysisException("dynamic_partition_normal_reserved_history_periods");
         Assert.assertEquals("[2020-06-01,2020-06-20],[2020-10-25,2020-11-15],[2021-06-01,2021-06-20]", table.getTableProperty().getDynamicPartitionProperty().getReservedHistoryPeriods());
         Assert.assertEquals(table.getAllPartitions().size(), 9);
 
@@ -1289,7 +1289,9 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.reserved_history_periods\" = \"[2014-01-01 00:00:00,2014-01-01 03:00:00]\"\n"
                 + ");";
         createTable(createOlapTblStmt2);
-        OlapTable table2 = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("dynamic_partition_normal_reserved_history_periods2");
+        OlapTable table2 = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test")
+                .getTableOrAnalysisException("dynamic_partition_normal_reserved_history_periods2");
         Assert.assertEquals("[2014-01-01 00:00:00,2014-01-01 03:00:00]", table2.getTableProperty().getDynamicPartitionProperty().getReservedHistoryPeriods());
         Assert.assertEquals(table2.getAllPartitions().size(), 6);
 
@@ -1318,7 +1320,9 @@ public class DynamicPartitionTableTest {
                 + "\"dynamic_partition.reserved_history_periods\" = \"[2020-06-01,2020-06-30]\"\n"
                 + ");";
         createTable(createOlapTblStmt3);
-        OlapTable table3 = (OlapTable) Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:test").getTableOrAnalysisException("dynamic_partition_normal_reserved_history_periods3");
+        OlapTable table3 = (OlapTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrAnalysisException("default_cluster:test")
+                .getTableOrAnalysisException("dynamic_partition_normal_reserved_history_periods3");
         Assert.assertEquals("[2020-06-01,2020-06-30]", table3.getTableProperty().getDynamicPartitionProperty().getReservedHistoryPeriods());
         Assert.assertEquals(table3.getAllPartitions().size(), 5);
     }
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/MetadataViewerTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/MetadataViewerTest.java
index 04eedec79d..dde1b17db3 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/MetadataViewerTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/MetadataViewerTest.java
@@ -21,6 +21,7 @@ import org.apache.doris.analysis.BinaryPredicate.Operator;
 import org.apache.doris.analysis.PartitionNames;
 import org.apache.doris.backup.CatalogMocker;
 import org.apache.doris.catalog.Replica.ReplicaStatus;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.system.SystemInfoService;
 
 import com.google.common.collect.Lists;
@@ -43,6 +44,9 @@ public class MetadataViewerTest {
     @Mocked
     private Catalog catalog;
 
+    @Mocked
+    private InternalDataSource internalDataSource;
+
     @Mocked
     private SystemInfoService infoService;
 
@@ -50,7 +54,7 @@ public class MetadataViewerTest {
 
     @BeforeClass
     public static void setUp() throws Exception {
-        Class[] argTypes = new Class[] { String.class, String.class, List.class, ReplicaStatus.class, Operator.class };
+        Class[] argTypes = new Class[] {String.class, String.class, List.class, ReplicaStatus.class, Operator.class};
         getTabletStatusMethod = MetadataViewer.class.getDeclaredMethod("getTabletStatus", argTypes);
         getTabletStatusMethod.setAccessible(true);
 
@@ -64,15 +68,23 @@ public class MetadataViewerTest {
     @Before
     public void before() throws Exception {
 
+        new Expectations() {
+            {
+                internalDataSource.getDbOrDdlException(anyString);
+                minTimes = 0;
+                result = db;
+            }
+        };
+
         new Expectations() {
             {
                 Catalog.getCurrentCatalog();
                 minTimes = 0;
                 result = catalog;
 
-                catalog.getDbOrDdlException(anyString);
+                catalog.getInternalDataSource();
                 minTimes = 0;
-                result = db;
+                result = internalDataSource;
             }
         };
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/ModifyBackendTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/ModifyBackendTest.java
index 62f7e487a2..e768357a0b 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/ModifyBackendTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/ModifyBackendTest.java
@@ -116,7 +116,7 @@ public class ModifyBackendTest {
         // although there is no exception throw, but partition create failed, because there is no BE
         // with "default" tag
         ExceptionChecker.expectThrowsNoException(() -> DdlExecutor.execute(Catalog.getCurrentCatalog(), createStmt3));
-        Database db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test");
         Table tbl3 = db.getTableNullable("tbl3");
         String err = Catalog.getCurrentCatalog().getDynamicPartitionScheduler().getRuntimeInfo(tbl3.getId(), DynamicPartitionScheduler.CREATE_PARTITION_MSG);
         Assert.assertTrue(err.contains("Failed to find 1 backends for policy:"));
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/RecoverTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/RecoverTest.java
index cafc823615..15d6d3854e 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/RecoverTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/RecoverTest.java
@@ -102,17 +102,18 @@ public class RecoverTest {
     }
 
     private static boolean checkDbExist(String dbName) {
-        return Catalog.getCurrentCatalog().getDb(ClusterNamespace.getFullName(SystemInfoService.DEFAULT_CLUSTER, dbName)).isPresent();
+        return Catalog.getCurrentInternalCatalog()
+                .getDb(ClusterNamespace.getFullName(SystemInfoService.DEFAULT_CLUSTER, dbName)).isPresent();
     }
 
     private static boolean checkTableExist(String dbName, String tblName) {
-        return Catalog.getCurrentCatalog()
+        return Catalog.getCurrentInternalCatalog()
                 .getDb(ClusterNamespace.getFullName(SystemInfoService.DEFAULT_CLUSTER, dbName))
                 .flatMap(db -> db.getTable(tblName)).isPresent();
     }
 
     private static boolean checkPartitionExist(String dbName, String tblName, String partName) {
-        return Catalog.getCurrentCatalog()
+        return Catalog.getCurrentInternalCatalog()
                 .getDb(ClusterNamespace.getFullName(SystemInfoService.DEFAULT_CLUSTER, dbName))
                 .flatMap(db -> db.getTable(tblName)).map(table -> table.getPartition(partName)).isPresent();
     }
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/TempPartitionTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/TempPartitionTest.java
index 9921dd9f39..33baf228f2 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/TempPartitionTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/TempPartitionTest.java
@@ -182,7 +182,7 @@ public class TempPartitionTest {
         String createDbStmtStr = "create database db1;";
         CreateDbStmt createDbStmt = (CreateDbStmt) UtFrameUtils.parseAndAnalyzeStmt(createDbStmtStr, ctx);
         Catalog.getCurrentCatalog().createDb(createDbStmt);
-        System.out.println(Catalog.getCurrentCatalog().getDbNames());
+        System.out.println(Catalog.getCurrentInternalCatalog().getDbNames());
         // create table tbl1
         String createTblStmtStr1 = "create table db1.tbl1(k1 int) distributed by hash(k1)"
                 + " buckets 3 properties('replication_num' = '1');";
@@ -207,7 +207,7 @@ public class TempPartitionTest {
         String createDbStmtStr = "create database db2;";
         CreateDbStmt createDbStmt = (CreateDbStmt) UtFrameUtils.parseAndAnalyzeStmt(createDbStmtStr, ctx);
         Catalog.getCurrentCatalog().createDb(createDbStmt);
-        System.out.println(Catalog.getCurrentCatalog().getDbNames());
+        System.out.println(Catalog.getCurrentInternalCatalog().getDbNames());
 
         // create table tbl2
         String createTblStmtStr1 = "create table db2.tbl2 (k1 int, k2 int)\n"
@@ -222,7 +222,8 @@ public class TempPartitionTest {
         CreateTableStmt createTableStmt = (CreateTableStmt) UtFrameUtils.parseAndAnalyzeStmt(createTblStmtStr1, ctx);
         Catalog.getCurrentCatalog().createTable(createTableStmt);
 
-        Database db2 = Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:db2");
+        Database db2 =
+                Catalog.getCurrentInternalCatalog().getDbOrAnalysisException("default_cluster:db2");
         OlapTable tbl2 = (OlapTable) db2.getTableOrAnalysisException("tbl2");
 
         testSerializeOlapTable(tbl2);
@@ -505,7 +506,7 @@ public class TempPartitionTest {
         String createDbStmtStr = "create database db3;";
         CreateDbStmt createDbStmt = (CreateDbStmt) UtFrameUtils.parseAndAnalyzeStmt(createDbStmtStr, ctx);
         Catalog.getCurrentCatalog().createDb(createDbStmt);
-        System.out.println(Catalog.getCurrentCatalog().getDbNames());
+        System.out.println(Catalog.getCurrentInternalCatalog().getDbNames());
 
         // create table tbl3
         String createTblStmtStr1 = "create table db3.tbl3 (k1 int, k2 int)\n"
@@ -520,7 +521,7 @@ public class TempPartitionTest {
         CreateTableStmt createTableStmt = (CreateTableStmt) UtFrameUtils.parseAndAnalyzeStmt(createTblStmtStr1, ctx);
         Catalog.getCurrentCatalog().createTable(createTableStmt);
 
-        Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:db3");
+        Catalog.getCurrentInternalCatalog().getDbOrAnalysisException("default_cluster:db3");
 
         // base range is [min, 10), [10, 20), [20, 30)
 
@@ -582,7 +583,7 @@ public class TempPartitionTest {
         String createDbStmtStr = "create database db4;";
         CreateDbStmt createDbStmt = (CreateDbStmt) UtFrameUtils.parseAndAnalyzeStmt(createDbStmtStr, ctx);
         Catalog.getCurrentCatalog().createDb(createDbStmt);
-        System.out.println(Catalog.getCurrentCatalog().getDbNames());
+        System.out.println(Catalog.getCurrentInternalCatalog().getDbNames());
 
         // create table tbl4
         String createTblStmtStr1 = "create table db4.tbl4 (k1 int not null, k2 int)\n"
@@ -597,7 +598,8 @@ public class TempPartitionTest {
         CreateTableStmt createTableStmt = (CreateTableStmt) UtFrameUtils.parseAndAnalyzeStmt(createTblStmtStr1, ctx);
         Catalog.getCurrentCatalog().createTable(createTableStmt);
 
-        Database db4 = Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:db4");
+        Database db4 =
+                Catalog.getCurrentInternalCatalog().getDbOrAnalysisException("default_cluster:db4");
         OlapTable tbl4 = (OlapTable) db4.getTableOrAnalysisException("tbl4");
 
         testSerializeOlapTable(tbl4);
@@ -932,7 +934,7 @@ public class TempPartitionTest {
         String createDbStmtStr = "create database db5;";
         CreateDbStmt createDbStmt = (CreateDbStmt) UtFrameUtils.parseAndAnalyzeStmt(createDbStmtStr, ctx);
         Catalog.getCurrentCatalog().createDb(createDbStmt);
-        System.out.println(Catalog.getCurrentCatalog().getDbNames());
+        System.out.println(Catalog.getCurrentInternalCatalog().getDbNames());
 
         // create table tbl5
         String createTblStmtStr1 = "create table db5.tbl5 (k1 int not null, k2 varchar not null)\n"
@@ -947,7 +949,8 @@ public class TempPartitionTest {
         CreateTableStmt createTableStmt = (CreateTableStmt) UtFrameUtils.parseAndAnalyzeStmt(createTblStmtStr1, ctx);
         Catalog.getCurrentCatalog().createTable(createTableStmt);
 
-        Database db5 = Catalog.getCurrentCatalog().getDbOrAnalysisException("default_cluster:db5");
+        Database db5 =
+                Catalog.getCurrentInternalCatalog().getDbOrAnalysisException("default_cluster:db5");
         OlapTable tbl5 = (OlapTable) db5.getTableOrAnalysisException("tbl5");
 
         testSerializeOlapTable(tbl5);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/catalog/TruncateTableTest.java b/fe/fe-core/src/test/java/org/apache/doris/catalog/TruncateTableTest.java
index 9fe66df7fd..41fb8e405f 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/catalog/TruncateTableTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/catalog/TruncateTableTest.java
@@ -84,7 +84,7 @@ public class TruncateTableTest {
 
     @Test
     public void testTruncateWithCaseInsensitivePartitionName() throws Exception {
-        Database db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test");
         OlapTable tbl = db.getOlapTableOrDdlException("case_sensitive_table");
         long p20211006Id = tbl.getPartition("P20211006").getId();
         long p20211007Id = tbl.getPartition("P20211007").getId();
diff --git a/fe/fe-core/src/test/java/org/apache/doris/clone/DiskRebalanceTest.java b/fe/fe-core/src/test/java/org/apache/doris/clone/DiskRebalanceTest.java
index b4bc9ce249..8046c14fcd 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/clone/DiskRebalanceTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/clone/DiskRebalanceTest.java
@@ -34,6 +34,7 @@ import org.apache.doris.catalog.TabletInvertedIndex;
 import org.apache.doris.clone.TabletScheduler.PathSlot;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.FeConstants;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.resource.Tag;
 import org.apache.doris.system.Backend;
 import org.apache.doris.system.SystemInfoService;
@@ -69,6 +70,8 @@ public class DiskRebalanceTest {
 
     @Mocked
     private Catalog catalog;
+    @Mocked
+    private InternalDataSource ds;
 
     private long id = 10086;
 
@@ -85,15 +88,19 @@ public class DiskRebalanceTest {
         db.setClusterName(SystemInfoService.DEFAULT_CLUSTER);
         new Expectations() {
             {
-                catalog.getDbIds();
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbIds();
                 minTimes = 0;
                 result = db.getId();
 
-                catalog.getDbNullable(anyLong);
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = db;
 
-                catalog.getDbOrException(anyLong, (Function<Long, SchedException>) any);
+                ds.getDbOrException(anyLong, (Function<Long, SchedException>) any);
                 minTimes = 0;
                 result = db;
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/clone/RebalanceTest.java b/fe/fe-core/src/test/java/org/apache/doris/clone/RebalanceTest.java
index 9d762752e3..826c9dbdbd 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/clone/RebalanceTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/clone/RebalanceTest.java
@@ -35,6 +35,7 @@ import org.apache.doris.common.Config;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.Pair;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.resource.Tag;
 import org.apache.doris.system.Backend;
 import org.apache.doris.system.SystemInfoService;
@@ -75,6 +76,8 @@ public class RebalanceTest {
 
     @Mocked
     private Catalog catalog;
+    @Mocked
+    private InternalDataSource ds;
 
     private long id = 10086;
 
@@ -91,18 +94,26 @@ public class RebalanceTest {
         db.setClusterName(SystemInfoService.DEFAULT_CLUSTER);
         new Expectations() {
             {
-                catalog.getDbIds();
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbIds();
                 minTimes = 0;
                 result = db.getId();
 
-                catalog.getDbNullable(anyLong);
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = db;
 
-                catalog.getDbOrException(anyLong, (Function<Long, SchedException>) any);
+                ds.getDbOrException(anyLong, (Function<Long, SchedException>) any);
                 minTimes = 0;
                 result = db;
 
+                Catalog.getCurrentCatalog();
+                minTimes = 0;
+                result = catalog;
+
                 Catalog.getCurrentCatalogJournalVersion();
                 minTimes = 0;
                 result = FeConstants.meta_version;
diff --git a/fe/fe-core/src/test/java/org/apache/doris/clone/TabletRepairAndBalanceTest.java b/fe/fe-core/src/test/java/org/apache/doris/clone/TabletRepairAndBalanceTest.java
index 73385ab046..718857a0aa 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/clone/TabletRepairAndBalanceTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/clone/TabletRepairAndBalanceTest.java
@@ -260,7 +260,7 @@ public class TabletRepairAndBalanceTest {
                 + "    \"replication_allocation\" = \"tag.location.zone1: 2, tag.location.zone2: 1\"\n"
                 + ")";
         ExceptionChecker.expectThrowsNoException(() -> createTable(createStr3));
-        Database db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test");
         OlapTable tbl = (OlapTable) db.getTableNullable("tbl1");
 
         // alter table's replica allocation failed, tag not enough
diff --git a/fe/fe-core/src/test/java/org/apache/doris/cluster/SystemInfoServiceTest.java b/fe/fe-core/src/test/java/org/apache/doris/cluster/SystemInfoServiceTest.java
index c1904fc3f6..50583fdd17 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/cluster/SystemInfoServiceTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/cluster/SystemInfoServiceTest.java
@@ -29,6 +29,7 @@ import org.apache.doris.common.DdlException;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.io.CountingDataOutputStream;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.persist.EditLog;
 import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.system.Backend;
@@ -54,6 +55,8 @@ public class SystemInfoServiceTest {
     private EditLog editLog;
     @Mocked
     private Catalog catalog;
+    @Mocked
+    private InternalDataSource ds;
     private SystemInfoService systemInfoService;
     private TabletInvertedIndex invertedIndex;
     @Mocked
@@ -94,7 +97,11 @@ public class SystemInfoServiceTest {
                 minTimes = 0;
                 result = editLog;
 
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = db;
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/common/proc/DbsProcDirTest.java b/fe/fe-core/src/test/java/org/apache/doris/common/proc/DbsProcDirTest.java
index f2ede84398..2f98c552dc 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/common/proc/DbsProcDirTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/common/proc/DbsProcDirTest.java
@@ -21,6 +21,7 @@ import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Database;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.FeConstants;
+import org.apache.doris.datasource.InternalDataSource;
 
 import com.google.common.collect.Lists;
 import mockit.Expectations;
@@ -38,6 +39,8 @@ public class DbsProcDirTest {
     private Database db2;
     @Mocked
     private Catalog catalog;
+    @Mocked
+    private InternalDataSource ds;
 
     // construct test case
     //  catalog
@@ -65,29 +68,33 @@ public class DbsProcDirTest {
 
     @Test(expected = AnalysisException.class)
     public void testLookupNormal() throws AnalysisException {
-        new Expectations(catalog) {
+        new Expectations(catalog, ds) {
             {
-                catalog.getDbNullable("db1");
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNullable("db1");
                 minTimes = 0;
                 result = db1;
 
-                catalog.getDbNullable("db2");
+                ds.getDbNullable("db2");
                 minTimes = 0;
                 result = db2;
 
-                catalog.getDbNullable("db3");
+                ds.getDbNullable("db3");
                 minTimes = 0;
                 result = null;
 
-                catalog.getDbNullable(db1.getId());
+                ds.getDbNullable(db1.getId());
                 minTimes = 0;
                 result = db1;
 
-                catalog.getDbNullable(db2.getId());
+                ds.getDbNullable(db2.getId());
                 minTimes = 0;
                 result = db2;
 
-                catalog.getDbNullable(anyLong);
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = null;
             }
@@ -105,7 +112,6 @@ public class DbsProcDirTest {
             Assert.fail();
         }
 
-
         dir = new DbsProcDir(catalog);
         try {
             node = dir.lookup(String.valueOf(db2.getId()));
@@ -142,33 +148,37 @@ public class DbsProcDirTest {
 
     @Test
     public void testFetchResultNormal() throws AnalysisException {
-        new Expectations(catalog) {
+        new Expectations(catalog, ds) {
             {
-                catalog.getDbNames();
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNames();
                 minTimes = 0;
                 result = Lists.newArrayList("db1", "db2");
 
-                catalog.getDbNullable("db1");
+                ds.getDbNullable("db1");
                 minTimes = 0;
                 result = db1;
 
-                catalog.getDbNullable("db2");
+                ds.getDbNullable("db2");
                 minTimes = 0;
                 result = db2;
 
-                catalog.getDbNullable("db3");
+                ds.getDbNullable("db3");
                 minTimes = 0;
                 result = null;
 
-                catalog.getDbNullable(db1.getId());
+                ds.getDbNullable(db1.getId());
                 minTimes = 0;
                 result = db1;
 
-                catalog.getDbNullable(db2.getId());
+                ds.getDbNullable(db2.getId());
                 minTimes = 0;
                 result = db2;
 
-                catalog.getDbNullable(anyLong);
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = null;
             }
@@ -192,9 +202,13 @@ public class DbsProcDirTest {
 
     @Test
     public void testFetchResultInvalid() throws AnalysisException {
-        new Expectations(catalog) {
+        new Expectations(catalog, ds) {
             {
-                catalog.getDbNames();
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNames();
                 minTimes = 0;
                 result = null;
             }
diff --git a/fe/fe-core/src/test/java/org/apache/doris/common/util/SmallFileMgrTest.java b/fe/fe-core/src/test/java/org/apache/doris/common/util/SmallFileMgrTest.java
index dbd902f172..e6f9bff4ee 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/common/util/SmallFileMgrTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/common/util/SmallFileMgrTest.java
@@ -24,6 +24,7 @@ import org.apache.doris.common.Config;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.jmockit.Deencapsulation;
 import org.apache.doris.common.util.SmallFileMgr.SmallFile;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.persist.EditLog;
 
 import mockit.Expectations;
@@ -38,6 +39,8 @@ public class SmallFileMgrTest {
     @Mocked
     Catalog catalog;
     @Mocked
+    InternalDataSource ds;
+    @Mocked
     EditLog editLog;
     @Mocked
     Database db;
@@ -50,7 +53,10 @@ public class SmallFileMgrTest {
                 db.getId();
                 minTimes = 0;
                 result = 1L;
-                catalog.getDbNullable(anyString);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyString);
                 minTimes = 0;
                 result = db;
                 stmt1.getDbName();
diff --git a/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsShardPartitionsTest.java b/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsShardPartitionsTest.java
index 9766a096e2..667bf16658 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsShardPartitionsTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/EsShardPartitionsTest.java
@@ -28,11 +28,10 @@ public class EsShardPartitionsTest extends EsTestCase {
 
     @Test
     public void testPartition() throws Exception {
-        EsTable esTable = (EsTable) Catalog.getCurrentCatalog()
-                .getDbOrMetaException(CatalogTestUtil.testDb1)
-                .getTableOrMetaException(CatalogTestUtil.testEsTableId1);
-        EsShardPartitions esShardPartitions = EsShardPartitions.findShardPartitions("doe",
-                loadJsonFromFile("data/es/test_search_shards.json"));
+        EsTable esTable = (EsTable) Catalog.getCurrentInternalCatalog()
+                .getDbOrMetaException(CatalogTestUtil.testDb1).getTableOrMetaException(CatalogTestUtil.testEsTableId1);
+        EsShardPartitions esShardPartitions =
+                EsShardPartitions.findShardPartitions("doe", loadJsonFromFile("data/es/test_search_shards.json"));
         EsTablePartitions esTablePartitions = EsTablePartitions.fromShardPartitions(esTable, esShardPartitions);
         Assert.assertNotNull(esTablePartitions);
         Assert.assertEquals(1, esTablePartitions.getUnPartitionedIndexStates().size());
diff --git a/fe/fe-core/src/test/java/org/apache/doris/http/DorisHttpTestCase.java b/fe/fe-core/src/test/java/org/apache/doris/http/DorisHttpTestCase.java
index eab29c860d..e2e9c5a906 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/http/DorisHttpTestCase.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/http/DorisHttpTestCase.java
@@ -42,6 +42,7 @@ import org.apache.doris.common.DdlException;
 import org.apache.doris.common.ExceptionChecker.ThrowingRunnable;
 import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.httpv2.HttpServer;
 import org.apache.doris.httpv2.IllegalArgException;
 import org.apache.doris.load.Load;
@@ -214,36 +215,46 @@ public abstract class DorisHttpTestCase {
             db.createTable(table1);
             EsTable esTable = newEsTable("es_table");
             db.createTable(esTable);
-            new Expectations(catalog) {
-                {
-                    catalog.getAuth();
-                    minTimes = 0;
-                    result = paloAuth;
 
-                    catalog.getDbNullable(db.getId());
+            InternalDataSource internalDataSource = Deencapsulation.newInstance(InternalDataSource.class);
+            new Expectations(internalDataSource) {
+                {
+                    internalDataSource.getDbNullable(db.getId());
                     minTimes = 0;
                     result = db;
 
-                    catalog.getDbNullable("default_cluster:" + DB_NAME);
+                    internalDataSource.getDbNullable("default_cluster:" + DB_NAME);
                     minTimes = 0;
                     result = db;
 
-                    catalog.isMaster();
-                    minTimes = 0;
-                    result = true;
-
-                    catalog.getDbNullable("default_cluster:emptyDb");
+                    internalDataSource.getDbNullable("default_cluster:emptyDb");
                     minTimes = 0;
                     result = null;
 
-                    catalog.getDbNullable(anyString);
+                    internalDataSource.getDbNullable(anyString);
                     minTimes = 0;
                     result = new Database();
 
-                    catalog.getDbNames();
+                    internalDataSource.getDbNames();
                     minTimes = 0;
                     result = Lists.newArrayList("default_cluster:testDb");
 
+                    internalDataSource.getClusterDbNames("default_cluster");
+                    minTimes = 0;
+                    result = Lists.newArrayList("default_cluster:testDb");
+                }
+            };
+
+            new Expectations(catalog) {
+                {
+                    catalog.getAuth();
+                    minTimes = 0;
+                    result = paloAuth;
+
+                    catalog.isMaster();
+                    minTimes = 0;
+                    result = true;
+
                     catalog.getLoadInstance();
                     minTimes = 0;
                     result = new Load();
@@ -252,9 +263,13 @@ public abstract class DorisHttpTestCase {
                     minTimes = 0;
                     result = editLog;
 
-                    catalog.getClusterDbNames("default_cluster");
+                    catalog.getInternalDataSource();
                     minTimes = 0;
-                    result = Lists.newArrayList("default_cluster:testDb");
+                    result = internalDataSource;
+
+                    catalog.getCurrentDataSource();
+                    minTimes = 0;
+                    result = internalDataSource;
 
                     catalog.changeDb((ConnectContext) any, "blockDb");
                     minTimes = 0;
@@ -266,8 +281,6 @@ public abstract class DorisHttpTestCase {
                     minTimes = 0;
                 }
             };
-
-
             return catalog;
         } catch (DdlException e) {
             return null;
diff --git a/fe/fe-core/src/test/java/org/apache/doris/load/DeleteHandlerTest.java b/fe/fe-core/src/test/java/org/apache/doris/load/DeleteHandlerTest.java
index e9c80d8260..4d165cad02 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/load/DeleteHandlerTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/load/DeleteHandlerTest.java
@@ -37,6 +37,7 @@ import org.apache.doris.common.FeConstants;
 import org.apache.doris.common.MarkedCountDownLatch;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.DeleteJob.DeleteState;
 import org.apache.doris.mysql.privilege.PaloAuth;
 import org.apache.doris.persist.EditLog;
@@ -127,13 +128,22 @@ public class DeleteHandlerTest {
             }
         };
 
+        InternalDataSource ds = Deencapsulation.newInstance(InternalDataSource.class);
         new Expectations() {
             {
-                catalog.getDbNullable(anyString);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                catalog.getCurrentDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNullable(anyString);
                 minTimes = 0;
                 result = db;
 
-                catalog.getDbNullable(anyLong);
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = db;
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/load/LoadCheckerTest.java b/fe/fe-core/src/test/java/org/apache/doris/load/LoadCheckerTest.java
index e2654b9fc4..7e35704247 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/load/LoadCheckerTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/load/LoadCheckerTest.java
@@ -27,6 +27,7 @@ import org.apache.doris.catalog.Replica;
 import org.apache.doris.catalog.Tablet;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.util.UnitTestUtil;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.FailMsg.CancelType;
 import org.apache.doris.load.LoadJob.JobState;
 import org.apache.doris.persist.EditLog;
@@ -62,6 +63,8 @@ public class LoadCheckerTest {
     @Mocked
     private Catalog catalog;
     @Mocked
+    private InternalDataSource ds;
+    @Mocked
     private EditLog editLog;
     @Mocked
     private Load load;
@@ -82,11 +85,15 @@ public class LoadCheckerTest {
         db = UnitTestUtil.createDb(dbId, tableId, partitionId, indexId, tabletId, backendId, 1L);
         new Expectations() {
             {
-                catalog.getDbNullable(dbId);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNullable(dbId);
                 minTimes = 0;
                 result = db;
 
-                catalog.getDbNullable(db.getFullName());
+                ds.getDbNullable(db.getFullName());
                 minTimes = 0;
                 result = db;
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/BrokerLoadJobTest.java b/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/BrokerLoadJobTest.java
index 4baf3fe09b..ed20ee0435 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/BrokerLoadJobTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/BrokerLoadJobTest.java
@@ -34,6 +34,7 @@ import org.apache.doris.common.DdlException;
 import org.apache.doris.common.MetaNotFoundException;
 import org.apache.doris.common.jmockit.Deencapsulation;
 import org.apache.doris.common.util.RuntimeProfile;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.BrokerFileGroup;
 import org.apache.doris.load.BrokerFileGroupAggInfo;
 import org.apache.doris.load.BrokerFileGroupAggInfo.FileGroupAggKey;
@@ -77,11 +78,9 @@ public class BrokerLoadJobTest {
     }
 
     @Test
-    public void testFromLoadStmt(@Injectable LoadStmt loadStmt,
-                                 @Injectable LabelName labelName,
-                                 @Injectable DataDescription dataDescription,
-                                 @Mocked Catalog catalog,
-                                 @Injectable Database database) {
+    public void testFromLoadStmt(@Injectable LoadStmt loadStmt, @Injectable LabelName labelName,
+            @Injectable DataDescription dataDescription, @Mocked Catalog catalog, @Mocked InternalDataSource ds,
+            @Injectable Database database) {
         List<DataDescription> dataDescriptionList = Lists.newArrayList();
         dataDescriptionList.add(dataDescription);
 
@@ -95,7 +94,10 @@ public class BrokerLoadJobTest {
                 labelName.getDbName();
                 minTimes = 0;
                 result = databaseName;
-                catalog.getDbNullable(databaseName);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(databaseName);
                 minTimes = 0;
                 result = database;
                 loadStmt.getDataDescriptions();
@@ -120,12 +122,9 @@ public class BrokerLoadJobTest {
     }
 
     @Test
-    public void testFromLoadStmt2(@Injectable LoadStmt loadStmt,
-                                 @Injectable DataDescription dataDescription,
-                                 @Injectable LabelName labelName,
-                                 @Injectable Database database,
-                                 @Injectable OlapTable olapTable,
-                                 @Mocked Catalog catalog) {
+    public void testFromLoadStmt2(@Injectable LoadStmt loadStmt, @Injectable DataDescription dataDescription,
+            @Injectable LabelName labelName, @Injectable Database database, @Injectable OlapTable olapTable,
+            @Mocked Catalog catalog, @Mocked InternalDataSource ds) {
 
         String label = "label";
         long dbId = 1;
@@ -146,7 +145,10 @@ public class BrokerLoadJobTest {
                 labelName.getLabelName();
                 minTimes = 0;
                 result = label;
-                catalog.getDbNullable(databaseName);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(databaseName);
                 minTimes = 0;
                 result = database;
                 loadStmt.getDataDescriptions();
@@ -195,10 +197,8 @@ public class BrokerLoadJobTest {
 
     @Test
     public void testGetTableNames(@Injectable BrokerFileGroupAggInfo fileGroupAggInfo,
-                                  @Injectable BrokerFileGroup brokerFileGroup,
-                                  @Mocked Catalog catalog,
-                                  @Injectable Database database,
-                                  @Injectable Table table) throws MetaNotFoundException {
+            @Injectable BrokerFileGroup brokerFileGroup, @Mocked Catalog catalog, @Mocked InternalDataSource ds,
+            @Injectable Database database, @Injectable Table table) throws MetaNotFoundException {
         List<BrokerFileGroup> brokerFileGroups = Lists.newArrayList();
         brokerFileGroups.add(brokerFileGroup);
         Map<FileGroupAggKey, List<BrokerFileGroup>> aggKeyToFileGroups = Maps.newHashMap();
@@ -215,7 +215,10 @@ public class BrokerLoadJobTest {
                 fileGroupAggInfo.getAllTableIds();
                 minTimes = 0;
                 result = Sets.newHashSet(1L);
-                catalog.getDb(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDb(anyLong);
                 minTimes = 0;
                 result = Optional.of(database);
                 database.getTable(1L);
@@ -272,16 +275,12 @@ public class BrokerLoadJobTest {
     }
 
     @Test
-    public void testPendingTaskOnFinished(@Injectable BrokerPendingTaskAttachment attachment,
-                                          @Mocked Catalog catalog,
-                                          @Injectable Database database,
-                                          @Injectable BrokerFileGroupAggInfo fileGroupAggInfo,
-                                          @Injectable BrokerFileGroup brokerFileGroup1,
-                                          @Injectable BrokerFileGroup brokerFileGroup2,
-                                          @Injectable BrokerFileGroup brokerFileGroup3,
-                                          @Mocked MasterTaskExecutor masterTaskExecutor,
-                                          @Injectable OlapTable olapTable,
-                                          @Mocked LoadingTaskPlanner loadingTaskPlanner) {
+    public void testPendingTaskOnFinished(@Injectable BrokerPendingTaskAttachment attachment, @Mocked Catalog catalog,
+            @Mocked InternalDataSource ds, @Injectable Database database,
+            @Injectable BrokerFileGroupAggInfo fileGroupAggInfo, @Injectable BrokerFileGroup brokerFileGroup1,
+            @Injectable BrokerFileGroup brokerFileGroup2, @Injectable BrokerFileGroup brokerFileGroup3,
+            @Mocked MasterTaskExecutor masterTaskExecutor, @Injectable OlapTable olapTable,
+            @Mocked LoadingTaskPlanner loadingTaskPlanner) {
         BrokerLoadJob brokerLoadJob = new BrokerLoadJob();
         Deencapsulation.setField(brokerLoadJob, "state", JobState.LOADING);
         long taskId = 1L;
@@ -308,7 +307,10 @@ public class BrokerLoadJobTest {
                 attachment.getTaskId();
                 minTimes = 0;
                 result = taskId;
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = database;
                 fileGroupAggInfo.getAggKeyToFileGroups();
@@ -460,9 +462,8 @@ public class BrokerLoadJobTest {
 
     @Test
     public void testLoadingTaskOnFinished(@Injectable BrokerLoadingTaskAttachment attachment1,
-                                          @Injectable LoadTask loadTask1,
-                                          @Mocked Catalog catalog,
-                                          @Injectable Database database) {
+            @Injectable LoadTask loadTask1, @Mocked Catalog catalog, @Mocked InternalDataSource ds,
+            @Injectable Database database) {
         BrokerLoadJob brokerLoadJob = new BrokerLoadJob();
         Deencapsulation.setField(brokerLoadJob, "state", JobState.LOADING);
         Map<Long, LoadTask> idToTasks = Maps.newHashMap();
@@ -479,7 +480,10 @@ public class BrokerLoadJobTest {
                 attachment1.getTaskId();
                 minTimes = 0;
                 result = 1L;
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = database;
             }
diff --git a/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/InsertLoadJobTest.java b/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/InsertLoadJobTest.java
index 69d844f6d7..93ab75c39e 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/InsertLoadJobTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/InsertLoadJobTest.java
@@ -22,6 +22,7 @@ import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.Table;
 import org.apache.doris.common.MetaNotFoundException;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 
 import mockit.Expectations;
 import mockit.Injectable;
@@ -35,14 +36,16 @@ import java.util.Set;
 public class InsertLoadJobTest {
 
     @Test
-    public void testGetTableNames(@Mocked Catalog catalog,
-                                  @Injectable Database database,
-                                  @Injectable Table table) throws MetaNotFoundException {
+    public void testGetTableNames(@Mocked Catalog catalog, @Mocked InternalDataSource ds, @Injectable Database database,
+            @Injectable Table table) throws MetaNotFoundException {
         InsertLoadJob insertLoadJob = new InsertLoadJob("label", 1L, 1L, 1L, 1000, "", "");
         String tableName = "table1";
         new Expectations() {
             {
-                catalog.getDb(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDb(anyLong);
                 result = Optional.of(database);
                 database.getTable(anyLong);
                 result = Optional.of(table);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/LoadManagerTest.java b/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/LoadManagerTest.java
index 6a28a33c50..5996620ea0 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/LoadManagerTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/LoadManagerTest.java
@@ -27,6 +27,7 @@ import org.apache.doris.common.DdlException;
 import org.apache.doris.common.FeMetaVersion;
 import org.apache.doris.common.LabelAlreadyUsedException;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.EtlJobType;
 import org.apache.doris.meta.MetaContext;
 
@@ -66,11 +67,8 @@ public class LoadManagerTest {
     }
 
     @Test
-    public void testCreateHadoopJob(@Injectable LoadStmt stmt,
-                                    @Injectable LabelName labelName,
-                                    @Mocked Catalog catalog,
-                                    @Injectable Database database,
-                                    @Injectable BrokerLoadJob brokerLoadJob) {
+    public void testCreateHadoopJob(@Injectable LoadStmt stmt, @Injectable LabelName labelName, @Mocked Catalog catalog,
+            @Mocked InternalDataSource ds, @Injectable Database database, @Injectable BrokerLoadJob brokerLoadJob) {
         Map<Long, Map<String, List<LoadJob>>> dbIdToLabelToLoadJobs = Maps.newHashMap();
         Map<String, List<LoadJob>> labelToLoadJobs = Maps.newHashMap();
         String label1 = "label1";
@@ -89,7 +87,10 @@ public class LoadManagerTest {
                 labelName.getLabelName();
                 minTimes = 0;
                 result = "label1";
-                catalog.getDbNullable(anyString);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyString);
                 minTimes = 0;
                 result = database;
                 database.getId();
@@ -110,12 +111,14 @@ public class LoadManagerTest {
     }
 
     @Test
-    public void testSerializationNormal(@Mocked Catalog catalog,
-                                        @Injectable Database database,
-                                        @Injectable Table table) throws Exception {
+    public void testSerializationNormal(@Mocked Catalog catalog, @Mocked InternalDataSource ds,
+            @Injectable Database database, @Injectable Table table) throws Exception {
         new Expectations() {
             {
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = database;
                 database.getTableNullable(anyLong);
@@ -144,13 +147,14 @@ public class LoadManagerTest {
     }
 
     @Test
-    public void testSerializationWithJobRemoved(@Mocked MetaContext metaContext,
-                                                @Mocked Catalog catalog,
-                                                @Injectable Database database,
-                                                @Injectable Table table) throws Exception {
+    public void testSerializationWithJobRemoved(@Mocked MetaContext metaContext, @Mocked Catalog catalog,
+            @Mocked InternalDataSource ds, @Injectable Database database, @Injectable Table table) throws Exception {
         new Expectations() {
             {
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = database;
                 database.getTableNullable(anyLong);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/SparkLoadJobTest.java b/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/SparkLoadJobTest.java
index 9fe32fd36a..5bca9f73b4 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/SparkLoadJobTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/load/loadv2/SparkLoadJobTest.java
@@ -44,6 +44,7 @@ import org.apache.doris.common.LoadException;
 import org.apache.doris.common.MetaNotFoundException;
 import org.apache.doris.common.Pair;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.EtlJobType;
 import org.apache.doris.load.EtlStatus;
 import org.apache.doris.load.loadv2.LoadJob.LoadJobStateUpdateInfo;
@@ -127,10 +128,10 @@ public class SparkLoadJobTest {
     }
 
     @Test
-    public void testCreateFromLoadStmt(@Mocked Catalog catalog, @Injectable LoadStmt loadStmt,
-                                       @Injectable DataDescription dataDescription, @Injectable LabelName labelName,
-                                       @Injectable Database db, @Injectable OlapTable olapTable,
-                                       @Injectable ResourceMgr resourceMgr) throws Exception {
+    public void testCreateFromLoadStmt(@Mocked Catalog catalog, @Mocked InternalDataSource ds,
+            @Injectable LoadStmt loadStmt, @Injectable DataDescription dataDescription, @Injectable LabelName labelName,
+            @Injectable Database db, @Injectable OlapTable olapTable, @Injectable ResourceMgr resourceMgr)
+            throws Exception {
         List<DataDescription> dataDescriptionList = Lists.newArrayList();
         dataDescriptionList.add(dataDescription);
         Map<String, String> resourceProperties = Maps.newHashMap();
@@ -144,7 +145,11 @@ public class SparkLoadJobTest {
 
         new Expectations() {
             {
-                catalog.getDbOrDdlException(dbName);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbOrDdlException(dbName);
+                minTimes = 0;
                 result = db;
                 catalog.getResourceMgr();
                 result = resourceMgr;
diff --git a/fe/fe-core/src/test/java/org/apache/doris/load/routineload/RoutineLoadJobTest.java b/fe/fe-core/src/test/java/org/apache/doris/load/routineload/RoutineLoadJobTest.java
index e4b0282cb4..63cac770ac 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/load/routineload/RoutineLoadJobTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/load/routineload/RoutineLoadJobTest.java
@@ -27,6 +27,7 @@ import org.apache.doris.common.InternalErrorCode;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.jmockit.Deencapsulation;
 import org.apache.doris.common.util.KafkaUtil;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.persist.EditLog;
 import org.apache.doris.thrift.TKafkaRLTaskProgress;
 import org.apache.doris.transaction.TransactionException;
@@ -191,10 +192,18 @@ public class RoutineLoadJobTest {
     }
 
     @Test
-    public void testUpdateWhileDbDeleted(@Mocked Catalog catalog) throws UserException {
+    public void testUpdateWhileDbDeleted(@Mocked Catalog catalog, @Mocked InternalDataSource ds) throws UserException {
         new Expectations() {
             {
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+            }
+        };
+
+        new Expectations() {
+            {
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = null;
             }
@@ -207,11 +216,14 @@ public class RoutineLoadJobTest {
     }
 
     @Test
-    public void testUpdateWhileTableDeleted(@Mocked Catalog catalog,
-                                            @Injectable Database database) throws UserException {
+    public void testUpdateWhileTableDeleted(@Mocked Catalog catalog, @Mocked InternalDataSource ds,
+            @Injectable Database database) throws UserException {
         new Expectations() {
             {
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = database;
                 database.getTableNullable(anyLong);
@@ -226,17 +238,18 @@ public class RoutineLoadJobTest {
     }
 
     @Test
-    public void testUpdateWhilePartitionChanged(@Mocked Catalog catalog,
-                                                @Injectable Database database,
-                                                @Injectable Table table,
-                                                @Injectable PartitionInfo partitionInfo,
-                                                @Injectable KafkaProgress kafkaProgress) throws UserException {
+    public void testUpdateWhilePartitionChanged(@Mocked Catalog catalog, @Mocked InternalDataSource ds,
+            @Injectable Database database, @Injectable Table table, @Injectable PartitionInfo partitionInfo,
+            @Injectable KafkaProgress kafkaProgress) throws UserException {
         List<PartitionInfo> partitionInfoList = Lists.newArrayList();
         partitionInfoList.add(partitionInfo);
 
         new Expectations() {
             {
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = database;
                 database.getTableNullable(anyLong);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/load/routineload/RoutineLoadManagerTest.java b/fe/fe-core/src/test/java/org/apache/doris/load/routineload/RoutineLoadManagerTest.java
index a0b0a89fde..c4fddfe0a5 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/load/routineload/RoutineLoadManagerTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/load/routineload/RoutineLoadManagerTest.java
@@ -36,6 +36,7 @@ import org.apache.doris.common.MetaNotFoundException;
 import org.apache.doris.common.PatternMatcher;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.loadv2.LoadTask;
 import org.apache.doris.mysql.privilege.PaloAuth;
 import org.apache.doris.mysql.privilege.PrivPredicate;
@@ -540,10 +541,9 @@ public class RoutineLoadManagerTest {
 
     @Test
     public void testGetJobIncludeHistory(@Injectable RoutineLoadJob routineLoadJob1,
-                                         @Injectable RoutineLoadJob routineLoadJob2,
-                                         @Injectable RoutineLoadJob routineLoadJob3,
-                                         @Mocked Catalog catalog,
-                                         @Mocked Database database) throws MetaNotFoundException {
+            @Injectable RoutineLoadJob routineLoadJob2, @Injectable RoutineLoadJob routineLoadJob3,
+            @Mocked Catalog catalog, @Mocked InternalDataSource ds, @Mocked Database database)
+            throws MetaNotFoundException {
         new Expectations() {
             {
                 routineLoadJob1.isFinal();
@@ -555,7 +555,10 @@ public class RoutineLoadManagerTest {
                 routineLoadJob3.isFinal();
                 minTimes = 0;
                 result = true;
-                catalog.getDbNullable(anyString);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyString);
                 minTimes = 0;
                 result = database;
                 database.getId();
@@ -583,11 +586,9 @@ public class RoutineLoadManagerTest {
     }
 
     @Test
-    public void testPauseRoutineLoadJob(@Injectable PauseRoutineLoadStmt pauseRoutineLoadStmt,
-                                        @Mocked Catalog catalog,
-                                        @Mocked Database database,
-                                        @Mocked PaloAuth paloAuth,
-                                        @Mocked ConnectContext connectContext) throws UserException {
+    public void testPauseRoutineLoadJob(@Injectable PauseRoutineLoadStmt pauseRoutineLoadStmt, @Mocked Catalog catalog,
+            @Mocked InternalDataSource ds, @Mocked Database database, @Mocked PaloAuth paloAuth,
+            @Mocked ConnectContext connectContext) throws UserException {
         RoutineLoadManager routineLoadManager = new RoutineLoadManager();
         Map<Long, Map<String, List<RoutineLoadJob>>> dbToNameToRoutineLoadJob = Maps.newHashMap();
         Map<String, List<RoutineLoadJob>> nameToRoutineLoadJob = Maps.newHashMap();
@@ -610,7 +611,10 @@ public class RoutineLoadManagerTest {
                 pauseRoutineLoadStmt.getName();
                 minTimes = 0;
                 result = "";
-                catalog.getDbNullable("");
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable("");
                 minTimes = 0;
                 result = database;
                 database.getId();
@@ -648,10 +652,8 @@ public class RoutineLoadManagerTest {
 
     @Test
     public void testResumeRoutineLoadJob(@Injectable ResumeRoutineLoadStmt resumeRoutineLoadStmt,
-                                         @Mocked Catalog catalog,
-                                         @Mocked Database database,
-                                         @Mocked PaloAuth paloAuth,
-                                         @Mocked ConnectContext connectContext) throws UserException {
+            @Mocked Catalog catalog, @Mocked InternalDataSource ds, @Mocked Database database,
+            @Mocked PaloAuth paloAuth, @Mocked ConnectContext connectContext) throws UserException {
         RoutineLoadManager routineLoadManager = new RoutineLoadManager();
         Map<Long, Map<String, List<RoutineLoadJob>>> dbToNameToRoutineLoadJob = Maps.newHashMap();
         Map<String, List<RoutineLoadJob>> nameToRoutineLoadJob = Maps.newHashMap();
@@ -670,7 +672,10 @@ public class RoutineLoadManagerTest {
                 resumeRoutineLoadStmt.getName();
                 minTimes = 0;
                 result = "";
-                catalog.getDbNullable("");
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable("");
                 minTimes = 0;
                 result = database;
                 database.getId();
@@ -691,11 +696,9 @@ public class RoutineLoadManagerTest {
     }
 
     @Test
-    public void testStopRoutineLoadJob(@Injectable StopRoutineLoadStmt stopRoutineLoadStmt,
-                                       @Mocked Catalog catalog,
-                                       @Mocked Database database,
-                                       @Mocked PaloAuth paloAuth,
-                                       @Mocked ConnectContext connectContext) throws UserException {
+    public void testStopRoutineLoadJob(@Injectable StopRoutineLoadStmt stopRoutineLoadStmt, @Mocked Catalog catalog,
+            @Mocked InternalDataSource ds, @Mocked Database database, @Mocked PaloAuth paloAuth,
+            @Mocked ConnectContext connectContext) throws UserException {
         RoutineLoadManager routineLoadManager = new RoutineLoadManager();
         Map<Long, Map<String, List<RoutineLoadJob>>> dbToNameToRoutineLoadJob = Maps.newHashMap();
         Map<String, List<RoutineLoadJob>> nameToRoutineLoadJob = Maps.newHashMap();
@@ -714,7 +717,10 @@ public class RoutineLoadManagerTest {
                 stopRoutineLoadStmt.getName();
                 minTimes = 0;
                 result = "";
-                catalog.getDbNullable("");
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable("");
                 minTimes = 0;
                 result = database;
                 database.getId();
@@ -887,10 +893,8 @@ public class RoutineLoadManagerTest {
     }
 
     @Test
-    public void testAlterRoutineLoadJob(@Injectable StopRoutineLoadStmt stopRoutineLoadStmt,
-            @Mocked Catalog catalog,
-            @Mocked Database database,
-            @Mocked PaloAuth paloAuth,
+    public void testAlterRoutineLoadJob(@Injectable StopRoutineLoadStmt stopRoutineLoadStmt, @Mocked Catalog catalog,
+            @Mocked InternalDataSource ds, @Mocked Database database, @Mocked PaloAuth paloAuth,
             @Mocked ConnectContext connectContext) throws UserException {
         RoutineLoadManager routineLoadManager = new RoutineLoadManager();
         Map<Long, Map<String, List<RoutineLoadJob>>> dbToNameToRoutineLoadJob = Maps.newHashMap();
@@ -910,7 +914,10 @@ public class RoutineLoadManagerTest {
                 stopRoutineLoadStmt.getName();
                 minTimes = 0;
                 result = "";
-                catalog.getDbNullable("");
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable("");
                 minTimes = 0;
                 result = database;
                 database.getId();
@@ -932,11 +939,9 @@ public class RoutineLoadManagerTest {
 
     @Test
     public void testPauseAndResumeAllRoutineLoadJob(@Injectable PauseRoutineLoadStmt pauseRoutineLoadStmt,
-                                                    @Injectable ResumeRoutineLoadStmt resumeRoutineLoadStmt,
-                                                    @Mocked Catalog catalog,
-                                                    @Mocked Database database,
-                                                    @Mocked PaloAuth paloAuth,
-                                                    @Mocked ConnectContext connectContext) throws UserException {
+            @Injectable ResumeRoutineLoadStmt resumeRoutineLoadStmt, @Mocked Catalog catalog,
+            @Mocked InternalDataSource ds, @Mocked Database database, @Mocked PaloAuth paloAuth,
+            @Mocked ConnectContext connectContext) throws UserException {
         RoutineLoadManager routineLoadManager = new RoutineLoadManager();
         Map<Long, Map<String, List<RoutineLoadJob>>> dbToNameToRoutineLoadJob = Maps.newHashMap();
         Map<String, List<RoutineLoadJob>> nameToRoutineLoadJob = Maps.newHashMap();
@@ -967,7 +972,10 @@ public class RoutineLoadManagerTest {
                 pauseRoutineLoadStmt.getDbFullName();
                 minTimes = 0;
                 result = "";
-                catalog.getDb("");
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDb("");
                 minTimes = 0;
                 result = database;
                 database.getId();
diff --git a/fe/fe-core/src/test/java/org/apache/doris/load/routineload/RoutineLoadSchedulerTest.java b/fe/fe-core/src/test/java/org/apache/doris/load/routineload/RoutineLoadSchedulerTest.java
index 3d697f8d09..7c2deb5cbd 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/load/routineload/RoutineLoadSchedulerTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/load/routineload/RoutineLoadSchedulerTest.java
@@ -26,6 +26,7 @@ import org.apache.doris.common.LoadException;
 import org.apache.doris.common.MetaNotFoundException;
 import org.apache.doris.common.ThreadPoolManager;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.RoutineLoadDesc;
 import org.apache.doris.planner.StreamLoadPlanner;
 import org.apache.doris.qe.ConnectContext;
@@ -53,13 +54,10 @@ public class RoutineLoadSchedulerTest {
     TResourceInfo tResourceInfo;
 
     @Test
-    public void testNormalRunOneCycle(@Mocked Catalog catalog,
-                                      @Injectable RoutineLoadManager routineLoadManager,
-                                      @Injectable SystemInfoService systemInfoService,
-                                      @Injectable Database database,
-                                      @Injectable RoutineLoadDesc routineLoadDesc,
-                                      @Mocked StreamLoadPlanner planner,
-                                      @Injectable OlapTable olapTable)
+    public void testNormalRunOneCycle(@Mocked Catalog catalog, @Mocked InternalDataSource ds,
+            @Injectable RoutineLoadManager routineLoadManager, @Injectable SystemInfoService systemInfoService,
+            @Injectable Database database, @Injectable RoutineLoadDesc routineLoadDesc,
+            @Mocked StreamLoadPlanner planner, @Injectable OlapTable olapTable)
             throws LoadException, MetaNotFoundException {
         String clusterName = "default";
         List<Long> beIds = Lists.newArrayList();
@@ -91,7 +89,10 @@ public class RoutineLoadSchedulerTest {
                 routineLoadManager.getRoutineLoadJobByState(Sets.newHashSet(RoutineLoadJob.JobState.NEED_SCHEDULE));
                 minTimes = 0;
                 result = routineLoadJobList;
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = database;
                 database.getTableNullable(1L);
@@ -126,9 +127,9 @@ public class RoutineLoadSchedulerTest {
         }
     }
 
-    public void functionTest(@Mocked Catalog catalog,
-                             @Mocked SystemInfoService systemInfoService,
-                             @Injectable Database database) throws DdlException, InterruptedException {
+    public void functionTest(@Mocked Catalog catalog, @Mocked InternalDataSource ds,
+            @Mocked SystemInfoService systemInfoService, @Injectable Database database)
+            throws DdlException, InterruptedException {
         new Expectations() {
             {
                 connectContext.toResourceCtx();
@@ -150,7 +151,10 @@ public class RoutineLoadSchedulerTest {
                 catalog.getRoutineLoadManager();
                 minTimes = 0;
                 result = routineLoadManager;
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = database;
                 systemInfoService.getBackendIds(true);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/load/sync/SyncJobManagerTest.java b/fe/fe-core/src/test/java/org/apache/doris/load/sync/SyncJobManagerTest.java
index 36cad3016b..bcffee0308 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/load/sync/SyncJobManagerTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/load/sync/SyncJobManagerTest.java
@@ -26,6 +26,7 @@ import org.apache.doris.catalog.Database;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.sync.SyncFailMsg.MsgType;
 import org.apache.doris.load.sync.SyncJob.JobState;
 import org.apache.doris.load.sync.SyncJob.SyncJobUpdateStateInfo;
@@ -60,6 +61,8 @@ public class SyncJobManagerTest {
     @Mocked
     Catalog catalog;
     @Mocked
+    InternalDataSource ds;
+    @Mocked
     Database database;
     @Mocked
     SyncCanalClient client;
@@ -71,13 +74,17 @@ public class SyncJobManagerTest {
                 catalog.getEditLog();
                 minTimes = 0;
                 result = editLog;
-                catalog.getDbNullable(anyString);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyString);
                 minTimes = 0;
                 result = database;
                 database.getId();
                 minTimes = 0;
                 result = dbId;
                 Catalog.getCurrentCatalog();
+                minTimes = 0;
                 result = catalog;
             }
         };
diff --git a/fe/fe-core/src/test/java/org/apache/doris/load/sync/canal/CanalSyncJobTest.java b/fe/fe-core/src/test/java/org/apache/doris/load/sync/canal/CanalSyncJobTest.java
index 3995839fef..c9e195cc71 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/load/sync/canal/CanalSyncJobTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/load/sync/canal/CanalSyncJobTest.java
@@ -27,6 +27,7 @@ import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.common.DdlException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.sync.DataSyncJobType;
 import org.apache.doris.load.sync.SyncChannel;
 import org.apache.doris.load.sync.SyncFailMsg;
@@ -61,6 +62,7 @@ public class CanalSyncJobTest {
     private String tblName;
     private String jobName;
     private Catalog catalog;
+    private InternalDataSource ds;
     private Map<String, String> properties;
 
     @Mocked
@@ -86,16 +88,25 @@ public class CanalSyncJobTest {
         properties.put(CanalSyncJob.CANAL_USERNAME, "test_user");
         properties.put(CanalSyncJob.CANAL_PASSWORD, "test_password");
 
-        catalog = Deencapsulation.newInstance(Catalog.class);
-        new Expectations(catalog) {
+        ds = Deencapsulation.newInstance(InternalDataSource.class);
+        new Expectations(ds) {
             {
-                catalog.getDbNullable(10000L);
+                ds.getDbNullable(10000L);
                 minTimes = 0;
                 result = database;
 
-                catalog.getDbNullable("testDb");
+                ds.getDbNullable("testDb");
                 minTimes = 0;
                 result = database;
+            }
+        };
+
+        catalog = Deencapsulation.newInstance(Catalog.class);
+        new Expectations(catalog) {
+            {
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
 
                 catalog.getEditLog();
                 minTimes = 0;
diff --git a/fe/fe-core/src/test/java/org/apache/doris/mysql/MysqlProtoTest.java b/fe/fe-core/src/test/java/org/apache/doris/mysql/MysqlProtoTest.java
index eb4459918b..377ffb9d92 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/mysql/MysqlProtoTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/mysql/MysqlProtoTest.java
@@ -54,6 +54,8 @@ public class MysqlProtoTest {
     @Mocked
     private Catalog catalog;
     @Mocked
+    private InternalDataSource ds;
+    @Mocked
     private PaloAuth auth;
     @Mocked
     private LdapClient ldapClient;
@@ -75,8 +77,8 @@ public class MysqlProtoTest {
                 auth.checkPassword(anyString, anyString, (byte[]) any, (byte[]) any, (List<UserIdentity>) any);
                 minTimes = 0;
                 result = new Delegate() {
-                    boolean fakeCheckPassword(String remoteUser, String remoteHost, byte[] remotePasswd, byte[] randomString,
-                                              List<UserIdentity> currentUser) {
+                    boolean fakeCheckPassword(String remoteUser, String remoteHost, byte[] remotePasswd,
+                            byte[] randomString, List<UserIdentity> currentUser) {
                         UserIdentity userIdentity = new UserIdentity("default_cluster:user", "192.168.1.1");
                         currentUser.add(userIdentity);
                         return true;
@@ -85,9 +87,9 @@ public class MysqlProtoTest {
 
                 catalog.getInternalDataSource();
                 minTimes = 0;
-                result = new InternalDataSource();
+                result = ds;
 
-                catalog.getDbNullable(anyString);
+                ds.getDbNullable(anyString);
                 minTimes = 0;
                 result = new Database();
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/PrivEntryTest.java b/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/PrivEntryTest.java
index 8e9a3f173b..9528d227ff 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/PrivEntryTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/mysql/privilege/PrivEntryTest.java
@@ -18,6 +18,7 @@
 package org.apache.doris.mysql.privilege;
 
 import org.apache.doris.analysis.UserIdentity;
+import org.apache.doris.datasource.InternalDataSource;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -25,9 +26,8 @@ import org.junit.Test;
 public class PrivEntryTest {
     @Test
     public void testNameWithUnderscores() throws Exception {
-        TablePrivEntry tablePrivEntry = TablePrivEntry.create(
-                "user1", "127.%", "__internal", "db_db1", "tbl_tbl1", false,
-                PrivBitSet.of(PaloPrivilege.SELECT_PRIV, PaloPrivilege.DROP_PRIV));
+        TablePrivEntry tablePrivEntry = TablePrivEntry.create("user1", "127.%", InternalDataSource.INTERNAL_DS_NAME,
+                "db_db1", "tbl_tbl1", false, PrivBitSet.of(PaloPrivilege.SELECT_PRIV, PaloPrivilege.DROP_PRIV));
         // pattern match
         Assert.assertFalse(tablePrivEntry.getDbPattern().match("db-db1"));
         Assert.assertFalse(tablePrivEntry.getTblPattern().match("tbl-tbl1"));
@@ -42,7 +42,7 @@ public class PrivEntryTest {
         Assert.assertFalse(PaloPrivilege.satisfy(privs1, PrivPredicate.DROP));
 
         PrivBitSet privs2 = PrivBitSet.of();
-        tablePrivTable.getPrivs(userIdentity, "__internal", "db_db1", "tbl_tbl1", privs2);
+        tablePrivTable.getPrivs(userIdentity, InternalDataSource.INTERNAL_DS_NAME, "db_db1", "tbl_tbl1", privs2);
         Assert.assertTrue(PaloPrivilege.satisfy(privs2, PrivPredicate.DROP));
     }
 }
diff --git a/fe/fe-core/src/test/java/org/apache/doris/persist/LoadJobV2PersistTest.java b/fe/fe-core/src/test/java/org/apache/doris/persist/LoadJobV2PersistTest.java
index 093d6dd0c4..01df7b6f44 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/persist/LoadJobV2PersistTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/persist/LoadJobV2PersistTest.java
@@ -24,6 +24,7 @@ import org.apache.doris.catalog.Catalog;
 import org.apache.doris.catalog.Database;
 import org.apache.doris.catalog.Table;
 import org.apache.doris.common.FeMetaVersion;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.EtlJobType;
 import org.apache.doris.load.loadv2.BrokerLoadJob;
 import org.apache.doris.qe.OriginStatement;
@@ -56,13 +57,15 @@ public class LoadJobV2PersistTest {
     }
 
     @Test
-    public void testBrokerLoadJob(@Mocked Catalog catalog,
-                                  @Injectable Database database,
-                                  @Injectable Table table) throws Exception {
+    public void testBrokerLoadJob(@Mocked Catalog catalog, @Mocked InternalDataSource ds, @Injectable Database database,
+            @Injectable Table table) throws Exception {
 
         new Expectations() {
             {
-                catalog.getDbNullable(anyLong);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+                ds.getDbNullable(anyLong);
                 minTimes = 0;
                 result = database;
                 database.getTableNullable(anyLong);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
index de4ca4ccc3..a439072b39 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/QueryPlanTest.java
@@ -1077,7 +1077,7 @@ public class QueryPlanTest extends TestWithFeService {
         Deencapsulation.setField(connectContext.getSessionVariable(), "enableBucketShuffleJoin", true);
 
         // set data size and row count for the olap table
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable tbl = (OlapTable) db.getTableOrMetaException("bucket_shuffle1");
         for (Partition partition : tbl.getPartitions()) {
             partition.updateVisibleVersion(2);
@@ -1091,7 +1091,7 @@ public class QueryPlanTest extends TestWithFeService {
             }
         }
 
-        db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         tbl = (OlapTable) db.getTableOrMetaException("bucket_shuffle2");
         for (Partition partition : tbl.getPartitions()) {
             partition.updateVisibleVersion(2);
@@ -1169,7 +1169,7 @@ public class QueryPlanTest extends TestWithFeService {
         connectContext.setDatabase("default_cluster:test");
 
         // set data size and row count for the olap table
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable tbl = (OlapTable) db.getTableOrMetaException("jointest");
         for (Partition partition : tbl.getPartitions()) {
             partition.updateVisibleVersion(2);
@@ -1219,7 +1219,7 @@ public class QueryPlanTest extends TestWithFeService {
         connectContext.setDatabase("default_cluster:test");
 
         // set data size and row count for the olap table
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:test");
         OlapTable tbl = (OlapTable) db.getTableOrMetaException("jointest");
         for (Partition partition : tbl.getPartitions()) {
             partition.updateVisibleVersion(2);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/planner/ResourceTagQueryTest.java b/fe/fe-core/src/test/java/org/apache/doris/planner/ResourceTagQueryTest.java
index d202919e5b..76c7386f35 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/planner/ResourceTagQueryTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/planner/ResourceTagQueryTest.java
@@ -191,7 +191,7 @@ public class ResourceTagQueryTest {
                 + ")\n"
                 + "distributed by hash(k2) buckets 10;";
         ExceptionChecker.expectThrowsNoException(() -> createTable(createStr));
-        Database db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:test");
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:test");
         OlapTable tbl = (OlapTable) db.getTableNullable("tbl1");
 
         Set<Tag> userTags = Catalog.getCurrentCatalog().getAuth().getResourceTags(PaloAuth.ROOT_USER);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/qe/PartitionCacheTest.java b/fe/fe-core/src/test/java/org/apache/doris/qe/PartitionCacheTest.java
index d5eddb3e5f..8daaff95b9 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/qe/PartitionCacheTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/qe/PartitionCacheTest.java
@@ -47,6 +47,7 @@ import org.apache.doris.common.UserException;
 import org.apache.doris.common.jmockit.Deencapsulation;
 import org.apache.doris.common.util.SqlParserUtils;
 import org.apache.doris.common.util.Util;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.metric.MetricRepo;
 import org.apache.doris.mysql.MysqlChannel;
 import org.apache.doris.mysql.MysqlSerializer;
@@ -112,6 +113,8 @@ public class PartitionCacheTest {
     @Mocked
     private Catalog catalog;
     @Mocked
+    private InternalDataSource ds;
+    @Mocked
     private ConnectContext ctx;
     @Mocked
     MysqlChannel channel;
@@ -168,29 +171,41 @@ public class PartitionCacheTest {
         db.createTable(view3);
         db.createTable(view4);
 
-        new Expectations(catalog) {
+        new Expectations(ds) {
             {
-                catalog.getAuth();
-                minTimes = 0;
-                result = auth;
-
-                catalog.getDbNullable(fullDbName);
+                ds.getDbNullable(fullDbName);
                 minTimes = 0;
                 result = db;
 
-                catalog.getDbNullable(dbName);
+                ds.getDbNullable(dbName);
                 minTimes = 0;
                 result = db;
 
-                catalog.getDbNullable(db.getId());
+                ds.getDbNullable(db.getId());
                 minTimes = 0;
                 result = db;
 
-                catalog.getDbNames();
+                ds.getDbNames();
                 minTimes = 0;
                 result = Lists.newArrayList(fullDbName);
             }
         };
+
+        new Expectations(catalog) {
+            {
+                catalog.getAuth();
+                minTimes = 0;
+                result = auth;
+
+                catalog.getCurrentDataSource();
+                minTimes = 0;
+                result = ds;
+
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+            }
+        };
         FunctionSet fs = new FunctionSet();
         fs.init();
         Deencapsulation.setField(catalog, "functionSet", fs);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/qe/ShowExecutorTest.java b/fe/fe-core/src/test/java/org/apache/doris/qe/ShowExecutorTest.java
index eb2db677e3..4760f6f498 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/qe/ShowExecutorTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/qe/ShowExecutorTest.java
@@ -50,6 +50,7 @@ import org.apache.doris.common.AnalysisException;
 import org.apache.doris.common.PatternMatcher;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.jmockit.Deencapsulation;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.mysql.MysqlCommand;
 import org.apache.doris.mysql.privilege.PaloAuth;
 import org.apache.doris.system.SystemInfoService;
@@ -73,6 +74,7 @@ import java.util.List;
 public class ShowExecutorTest {
     private ConnectContext ctx;
     private Catalog catalog;
+    private InternalDataSource ds;
 
     @Rule
     public ExpectedException expectedEx = ExpectedException.none();
@@ -165,25 +167,39 @@ public class ShowExecutorTest {
         // mock auth
         PaloAuth auth = AccessTestUtil.fetchAdminAccess();
 
-        // mock catalog.
-        catalog = Deencapsulation.newInstance(Catalog.class);
-        new Expectations(catalog) {
+        // mock ds
+        ds = Deencapsulation.newInstance(InternalDataSource.class);
+        new Expectations(ds) {
             {
-                catalog.getDbNullable("testCluster:testDb");
+                ds.getDbNullable("testCluster:testDb");
                 minTimes = 0;
                 result = db;
 
-                catalog.getDbNullable("testCluster:emptyDb");
+                ds.getDbNullable("testCluster:emptyDb");
                 minTimes = 0;
                 result = null;
 
-                catalog.getClusterDbNames("testCluster");
+                ds.getClusterDbNames("testCluster");
                 minTimes = 0;
                 result = Lists.newArrayList("testCluster:testDb");
 
-                catalog.getClusterDbNames("");
+                ds.getClusterDbNames("");
                 minTimes = 0;
                 result = Lists.newArrayList("");
+            }
+        };
+
+        // mock catalog.
+        catalog = Deencapsulation.newInstance(Catalog.class);
+        new Expectations(catalog) {
+            {
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                catalog.getCurrentDataSource();
+                minTimes = 0;
+                result = ds;
 
                 catalog.getAuth();
                 minTimes = 0;
diff --git a/fe/fe-core/src/test/java/org/apache/doris/task/LoadEtlTaskTest.java b/fe/fe-core/src/test/java/org/apache/doris/task/LoadEtlTaskTest.java
index 4380eaae9a..6d80ecf279 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/task/LoadEtlTaskTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/task/LoadEtlTaskTest.java
@@ -26,6 +26,7 @@ import org.apache.doris.catalog.Partition;
 import org.apache.doris.catalog.Tablet;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.util.UnitTestUtil;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.DppScheduler;
 import org.apache.doris.load.EtlStatus;
 import org.apache.doris.load.Load;
@@ -64,6 +65,8 @@ public class LoadEtlTaskTest {
     @Mocked
     private Catalog catalog;
     @Mocked
+    private InternalDataSource ds;
+    @Mocked
     private EditLog editLog;
     @Mocked
     private Load load;
@@ -87,13 +90,17 @@ public class LoadEtlTaskTest {
     public void testRunEtlTask(@Mocked DppScheduler dppScheduler) throws Exception {
         // mock catalog
         db = UnitTestUtil.createDb(dbId, tableId, partitionId, indexId, tabletId, backendId, 1L);
-        new Expectations(catalog) {
+        new Expectations(catalog, ds) {
             {
-                catalog.getDbNullable(dbId);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNullable(dbId);
                 minTimes = 0;
                 result = db;
 
-                catalog.getDbNullable(db.getFullName());
+                ds.getDbNullable(db.getFullName());
                 minTimes = 0;
                 result = db;
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/task/LoadPendingTaskTest.java b/fe/fe-core/src/test/java/org/apache/doris/task/LoadPendingTaskTest.java
index b12475e1a2..9d37333167 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/task/LoadPendingTaskTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/task/LoadPendingTaskTest.java
@@ -23,6 +23,7 @@ import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.Partition;
 import org.apache.doris.common.Config;
 import org.apache.doris.common.util.UnitTestUtil;
+import org.apache.doris.datasource.InternalDataSource;
 import org.apache.doris.load.DppScheduler;
 import org.apache.doris.load.EtlSubmitResult;
 import org.apache.doris.load.Load;
@@ -59,6 +60,8 @@ public class LoadPendingTaskTest {
     @Mocked
     private Catalog catalog;
     @Mocked
+    private InternalDataSource ds;
+    @Mocked
     private EditLog editLog;
     @Mocked
     private Load load;
@@ -90,13 +93,17 @@ public class LoadPendingTaskTest {
         globalTransactionMgr.addDatabaseTransactionMgr(db.getId());
 
         // mock catalog
-        new Expectations(catalog) {
+        new Expectations(catalog, ds) {
             {
-                catalog.getDbNullable(dbId);
+                catalog.getInternalDataSource();
+                minTimes = 0;
+                result = ds;
+
+                ds.getDbNullable(dbId);
                 minTimes = 0;
                 result = db;
 
-                catalog.getDbNullable(db.getFullName());
+                ds.getDbNullable(db.getFullName());
                 minTimes = 0;
                 result = db;
 
diff --git a/fe/fe-core/src/test/java/org/apache/doris/transaction/DatabaseTransactionMgrTest.java b/fe/fe-core/src/test/java/org/apache/doris/transaction/DatabaseTransactionMgrTest.java
index 4935d69864..5edb6f3484 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/transaction/DatabaseTransactionMgrTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/transaction/DatabaseTransactionMgrTest.java
@@ -97,7 +97,8 @@ public class DatabaseTransactionMgrTest {
         transTablets.add(tabletCommitInfo1);
         transTablets.add(tabletCommitInfo2);
         transTablets.add(tabletCommitInfo3);
-        Table testTable1 = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1);
+        Table testTable1 = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1);
         masterTransMgr.commitTransaction(CatalogTestUtil.testDbId1, Lists.newArrayList(testTable1), transactionId1, transTablets);
         masterTransMgr.finishTransaction(CatalogTestUtil.testDbId1, transactionId1, null);
         labelToTxnId.put(CatalogTestUtil.testTxnLabel1, transactionId1);
diff --git a/fe/fe-core/src/test/java/org/apache/doris/transaction/GlobalTransactionMgrTest.java b/fe/fe-core/src/test/java/org/apache/doris/transaction/GlobalTransactionMgrTest.java
index eab20c6f93..f79d110e19 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/transaction/GlobalTransactionMgrTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/transaction/GlobalTransactionMgrTest.java
@@ -155,29 +155,30 @@ public class GlobalTransactionMgrTest {
     @Test
     public void testCommitTransaction1() throws UserException {
         FakeCatalog.setCatalog(masterCatalog);
-        long transactionId = masterTransMgr.beginTransaction(CatalogTestUtil.testDbId1, Lists.newArrayList(CatalogTestUtil.testTableId1),
-                CatalogTestUtil.testTxnLabel1,
-                transactionSource,
+        long transactionId = masterTransMgr.beginTransaction(CatalogTestUtil.testDbId1,
+                Lists.newArrayList(CatalogTestUtil.testTableId1), CatalogTestUtil.testTxnLabel1, transactionSource,
                 LoadJobSourceType.FRONTEND, Config.stream_load_default_timeout_second);
         // commit a transaction
-        TabletCommitInfo tabletCommitInfo1 = new TabletCommitInfo(CatalogTestUtil.testTabletId1,
-                CatalogTestUtil.testBackendId1);
-        TabletCommitInfo tabletCommitInfo2 = new TabletCommitInfo(CatalogTestUtil.testTabletId1,
-                CatalogTestUtil.testBackendId2);
-        TabletCommitInfo tabletCommitInfo3 = new TabletCommitInfo(CatalogTestUtil.testTabletId1,
-                CatalogTestUtil.testBackendId3);
+        TabletCommitInfo tabletCommitInfo1 =
+                new TabletCommitInfo(CatalogTestUtil.testTabletId1, CatalogTestUtil.testBackendId1);
+        TabletCommitInfo tabletCommitInfo2 =
+                new TabletCommitInfo(CatalogTestUtil.testTabletId1, CatalogTestUtil.testBackendId2);
+        TabletCommitInfo tabletCommitInfo3 =
+                new TabletCommitInfo(CatalogTestUtil.testTabletId1, CatalogTestUtil.testBackendId3);
         List<TabletCommitInfo> transTablets = Lists.newArrayList();
         transTablets.add(tabletCommitInfo1);
         transTablets.add(tabletCommitInfo2);
         transTablets.add(tabletCommitInfo3);
-        Table testTable1 = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1);
-        masterTransMgr.commitTransaction(CatalogTestUtil.testDbId1, Lists.newArrayList(testTable1), transactionId, transTablets);
+        Table testTable1 = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1);
+        masterTransMgr.commitTransaction(CatalogTestUtil.testDbId1, Lists.newArrayList(testTable1), transactionId,
+                transTablets);
         TransactionState transactionState = fakeEditLog.getTransaction(transactionId);
         // check status is committed
         Assert.assertEquals(TransactionStatus.COMMITTED, transactionState.getTransactionStatus());
         // check replica version
-        Partition testPartition = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1)
-                .getPartition(CatalogTestUtil.testPartition1);
+        Partition testPartition = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1).getPartition(CatalogTestUtil.testPartition1);
         // check partition version
         Assert.assertEquals(CatalogTestUtil.testStartVersion, testPartition.getVisibleVersion());
         Assert.assertEquals(CatalogTestUtil.testStartVersion + 2, testPartition.getNextVersion());
@@ -209,7 +210,8 @@ public class GlobalTransactionMgrTest {
         List<TabletCommitInfo> transTablets = Lists.newArrayList();
         transTablets.add(tabletCommitInfo1);
         transTablets.add(tabletCommitInfo2);
-        Table testTable1 = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1);
+        Table testTable1 = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1);
         masterTransMgr.commitTransaction(CatalogTestUtil.testDbId1, Lists.newArrayList(testTable1), transactionId, transTablets);
 
         // follower catalog replay the transaction
@@ -239,8 +241,8 @@ public class GlobalTransactionMgrTest {
             Assert.assertEquals(TransactionStatus.PREPARE, transactionState.getTransactionStatus());
         }
         // check replica version
-        Partition testPartition = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1)
-                .getPartition(CatalogTestUtil.testPartition1);
+        Partition testPartition = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1).getPartition(CatalogTestUtil.testPartition1);
         // check partition version
         Assert.assertEquals(CatalogTestUtil.testStartVersion, testPartition.getVisibleVersion());
         Assert.assertEquals(CatalogTestUtil.testStartVersion + 2, testPartition.getNextVersion());
@@ -265,8 +267,8 @@ public class GlobalTransactionMgrTest {
         // check status is commit
         Assert.assertEquals(TransactionStatus.COMMITTED, transactionState.getTransactionStatus());
         // check replica version
-        testPartition = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1)
-                .getPartition(CatalogTestUtil.testPartition1);
+        testPartition = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1).getPartition(CatalogTestUtil.testPartition1);
         // check partition version
         Assert.assertEquals(CatalogTestUtil.testStartVersion, testPartition.getVisibleVersion());
         Assert.assertEquals(CatalogTestUtil.testStartVersion + 3, testPartition.getNextVersion());
@@ -356,7 +358,8 @@ public class GlobalTransactionMgrTest {
         routineLoadManager.addRoutineLoadJob(routineLoadJob, "db");
 
         Deencapsulation.setField(masterTransMgr.getDatabaseTransactionMgr(CatalogTestUtil.testDbId1), "idToRunningTransactionState", idToTransactionState);
-        Table testTable1 = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1);
+        Table testTable1 = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1);
         masterTransMgr.commitTransaction(1L, Lists.newArrayList(testTable1), 1L, transTablets, txnCommitAttachment);
         RoutineLoadStatistic jobStatistic =  Deencapsulation.getField(routineLoadJob, "jobStatistic");
 
@@ -426,7 +429,8 @@ public class GlobalTransactionMgrTest {
         routineLoadManager.addRoutineLoadJob(routineLoadJob, "db");
 
         Deencapsulation.setField(masterTransMgr.getDatabaseTransactionMgr(CatalogTestUtil.testDbId1), "idToRunningTransactionState", idToTransactionState);
-        Table testTable1 = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1);
+        Table testTable1 = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1);
         masterTransMgr.commitTransaction(1L, Lists.newArrayList(testTable1), 1L, transTablets, txnCommitAttachment);
 
         // current total rows and error rows will be reset after job pause, so here they should be 0.
@@ -457,7 +461,8 @@ public class GlobalTransactionMgrTest {
         transTablets.add(tabletCommitInfo1);
         transTablets.add(tabletCommitInfo2);
         transTablets.add(tabletCommitInfo3);
-        Table testTable1 = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1);
+        Table testTable1 = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1);
         masterTransMgr.commitTransaction(CatalogTestUtil.testDbId1, Lists.newArrayList(testTable1), transactionId, transTablets);
         TransactionState transactionState = fakeEditLog.getTransaction(transactionId);
         Assert.assertEquals(TransactionStatus.COMMITTED, transactionState.getTransactionStatus());
@@ -468,8 +473,8 @@ public class GlobalTransactionMgrTest {
         transactionState = fakeEditLog.getTransaction(transactionId);
         Assert.assertEquals(TransactionStatus.VISIBLE, transactionState.getTransactionStatus());
         // check replica version
-        Partition testPartition = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1)
-                .getPartition(CatalogTestUtil.testPartition1);
+        Partition testPartition = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1).getPartition(CatalogTestUtil.testPartition1);
         // check partition version
         Assert.assertEquals(CatalogTestUtil.testStartVersion + 1, testPartition.getVisibleVersion());
         Assert.assertEquals(CatalogTestUtil.testStartVersion + 2, testPartition.getNextVersion());
@@ -491,8 +496,8 @@ public class GlobalTransactionMgrTest {
     @Test
     public void testFinishTransactionWithOneFailed() throws UserException {
         TransactionState transactionState = null;
-        Partition testPartition = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1)
-                .getPartition(CatalogTestUtil.testPartition1);
+        Partition testPartition = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1).getPartition(CatalogTestUtil.testPartition1);
         Tablet tablet = testPartition.getIndex(CatalogTestUtil.testIndexId1).getTablet(CatalogTestUtil.testTabletId1);
         FakeCatalog.setCatalog(masterCatalog);
         long transactionId = masterTransMgr.beginTransaction(CatalogTestUtil.testDbId1, Lists.newArrayList(CatalogTestUtil.testTableId1),
@@ -507,7 +512,8 @@ public class GlobalTransactionMgrTest {
         List<TabletCommitInfo> transTablets = Lists.newArrayList();
         transTablets.add(tabletCommitInfo1);
         transTablets.add(tabletCommitInfo2);
-        Table testTable1 = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1);
+        Table testTable1 = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1);
         masterTransMgr.commitTransaction(CatalogTestUtil.testDbId1, Lists.newArrayList(testTable1), transactionId, transTablets);
 
         // follower catalog replay the transaction
@@ -584,8 +590,8 @@ public class GlobalTransactionMgrTest {
         // check status is commit
         Assert.assertEquals(TransactionStatus.COMMITTED, transactionState.getTransactionStatus());
         // check replica version
-        testPartition = masterCatalog.getDbOrMetaException(CatalogTestUtil.testDbId1).getTableOrMetaException(CatalogTestUtil.testTableId1)
-                .getPartition(CatalogTestUtil.testPartition1);
+        testPartition = masterCatalog.getInternalDataSource().getDbOrMetaException(CatalogTestUtil.testDbId1)
+                .getTableOrMetaException(CatalogTestUtil.testTableId1).getPartition(CatalogTestUtil.testPartition1);
         // check partition version
         Assert.assertEquals(CatalogTestUtil.testStartVersion + 1, testPartition.getVisibleVersion());
         Assert.assertEquals(CatalogTestUtil.testStartVersion + 3, testPartition.getNextVersion());
diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/AnotherDemoTest.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/AnotherDemoTest.java
index 5629e695f9..3b94721e16 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/utframe/AnotherDemoTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/AnotherDemoTest.java
@@ -97,13 +97,13 @@ public class AnotherDemoTest {
         String createDbStmtStr = "create database db1;";
         CreateDbStmt createDbStmt = (CreateDbStmt) UtFrameUtils.parseAndAnalyzeStmt(createDbStmtStr, ctx);
         Catalog.getCurrentCatalog().createDb(createDbStmt);
-        System.out.println(Catalog.getCurrentCatalog().getDbNames());
+        System.out.println(Catalog.getCurrentInternalCatalog().getDbNames());
         // 3. create table tbl1
         String createTblStmtStr = "create table db1.tbl1(k1 int) distributed by hash(k1) buckets 3 properties('replication_num' = '1');";
         CreateTableStmt createTableStmt = (CreateTableStmt) UtFrameUtils.parseAndAnalyzeStmt(createTblStmtStr, ctx);
         Catalog.getCurrentCatalog().createTable(createTableStmt);
         // 4. get and test the created db and table
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:db1");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:db1");
         OlapTable tbl = (OlapTable) db.getTableOrMetaException("tbl1", Table.TableType.OLAP);
         tbl.readLock();
         try {
diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/DemoMultiBackendsTest.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/DemoMultiBackendsTest.java
index 4c91afab33..e6480a8e8a 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/utframe/DemoMultiBackendsTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/DemoMultiBackendsTest.java
@@ -129,7 +129,7 @@ public class DemoMultiBackendsTest {
         String createDbStmtStr = "create database db1;";
         CreateDbStmt createDbStmt = (CreateDbStmt) UtFrameUtils.parseAndAnalyzeStmt(createDbStmtStr, ctx);
         Catalog.getCurrentCatalog().createDb(createDbStmt);
-        System.out.println(Catalog.getCurrentCatalog().getDbNames());
+        System.out.println(Catalog.getCurrentInternalCatalog().getDbNames());
         // 3. create table tbl1
         String createTblStmtStr = "create table db1.tbl1(k1 int) distributed by hash(k1) buckets 3"
                 + " properties('replication_num' = '3',"
@@ -140,7 +140,7 @@ public class DemoMultiBackendsTest {
         updateReplicaPathHash();
 
         // 4. get and test the created db and table
-        Database db = Catalog.getCurrentCatalog().getDbNullable("default_cluster:db1");
+        Database db = Catalog.getCurrentInternalCatalog().getDbNullable("default_cluster:db1");
         Assert.assertNotNull(db);
         OlapTable tbl = (OlapTable) db.getTableNullable("tbl1");
         tbl.readLock();
diff --git a/fe/fe-core/src/test/java/org/apache/doris/utframe/DemoTest.java b/fe/fe-core/src/test/java/org/apache/doris/utframe/DemoTest.java
index 9f3e3453b3..6fea54c5f3 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/utframe/DemoTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/utframe/DemoTest.java
@@ -59,13 +59,13 @@ public class DemoTest extends TestWithFeService {
 
         // 2. create database db1
         createDatabase("db1");
-        System.out.println(Catalog.getCurrentCatalog().getDbNames());
+        System.out.println(Catalog.getCurrentInternalCatalog().getDbNames());
 
         // 3. create table tbl1
         createTable("create table db1.tbl1(k1 int) distributed by hash(k1) buckets 3 properties('replication_num' = '1');");
 
         // 4. get and test the created db and table
-        Database db = Catalog.getCurrentCatalog().getDbOrMetaException("default_cluster:db1");
+        Database db = Catalog.getCurrentInternalCatalog().getDbOrMetaException("default_cluster:db1");
         OlapTable tbl = (OlapTable) db.getTableOrMetaException("tbl1", Table.TableType.OLAP);
         tbl.readLock();
         try {
diff --git a/gensrc/thrift/FrontendService.thrift b/gensrc/thrift/FrontendService.thrift
index ae3018d8a4..b2ef1a1143 100644
--- a/gensrc/thrift/FrontendService.thrift
+++ b/gensrc/thrift/FrontendService.thrift
@@ -289,8 +289,8 @@ struct TGetDbsParams {
 
 // getDbNames returns a list of database names and catalog names
 struct TGetDbsResult {
-  1: list<string> dbs
-  2: list<string> catalogs
+  1: optional list<string> dbs
+  2: optional list<string> catalogs
 }
 
 // Arguments to getTableNames, which returns a list of tables that match an 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org