You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/04/11 02:30:55 UTC

[shardingsphere] branch master updated: Refactor load governance center or use local configuration when startup (#25035)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new a84885e22bb Refactor load governance center or use local configuration when startup (#25035)
a84885e22bb is described below

commit a84885e22bb7617e51fb89de9b3960af503893fc
Author: zhaojinchao <zh...@apache.org>
AuthorDate: Tue Apr 11 10:30:47 2023 +0800

    Refactor load governance center or use local configuration when startup (#25035)
    
    * Refactor load governance center or use local configuration when startup
    
    * Fix checkstyle
    
    * Fix ut
    
    * Fix IT
    
    * Fix mask IT
    
    * Fix bug
    
    * Fix ci
    
    * Remove db-discovery.yaml
    
    * Fix IT
    
    * Fix IT
---
 .../swapper/rule/YamlRuleConfigurationSwapper.java |   4 +-
 .../metadata/persist/MetaDataPersistService.java   |  38 +++---
 .../config/database/DataSourcePersistService.java  |  18 +--
 .../database/DatabaseBasedPersistService.java      |  22 ++--
 .../database/DatabaseRulePersistService.java       |  24 ++--
 .../config/global/GlobalPersistService.java        |   7 --
 .../config/global/GlobalRulePersistService.java    |  18 +--
 .../config/global/PropertiesPersistService.java    |  14 +--
 .../persist/MetaDataPersistServiceTest.java        |  26 ----
 .../YamlTrafficRuleConfigurationSwapper.java       |   2 +-
 .../mode/metadata/MetaDataContextsFactory.java     |  84 +++++++++----
 .../cluster/ClusterContextManagerBuilder.java      |  17 +--
 .../manager/cluster/ClusterModeContextManager.java |   6 +-
 .../cluster/ClusterModeContextManagerTest.java     |  71 ++++++-----
 .../StandaloneContextManagerBuilder.java           |   7 --
 .../standalone/StandaloneModeContextManager.java   |   7 +-
 .../YamlDatabaseConfigurationImportExecutor.java   |   4 +-
 .../resources/conf/config-database-discovery.yaml  | 131 ---------------------
 .../dataset/mask/{ => cluster}/show_mask_rule.xml  |   0
 .../standalone}/show_mask_rule.xml                 |   2 +-
 .../cluster}/show_mask_rule.xml                    |   0
 .../rql/dataset/mask_encrypt/show_mask_rule.xml    |   2 +-
 .../standalone}/show_mask_rule.xml                 |   2 +-
 .../cluster}/show_mask_rule.xml                    |   0
 .../{ => standalone}/show_mask_rule.xml            |   2 +-
 .../cluster}/show_mask_rule.xml                    |   0
 .../standalone}/show_mask_rule.xml                 |   2 +-
 27 files changed, 190 insertions(+), 320 deletions(-)

diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/YamlRuleConfigurationSwapper.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/YamlRuleConfigurationSwapper.java
index 39e9a30dd79..cfd03fc123b 100644
--- a/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/YamlRuleConfigurationSwapper.java
+++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/yaml/config/swapper/rule/YamlRuleConfigurationSwapper.java
@@ -18,10 +18,10 @@
 package org.apache.shardingsphere.infra.yaml.config.swapper.rule;
 
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-import org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
-import org.apache.shardingsphere.infra.util.yaml.swapper.YamlConfigurationSwapper;
 import org.apache.shardingsphere.infra.util.spi.annotation.SingletonSPI;
 import org.apache.shardingsphere.infra.util.spi.type.ordered.OrderedSPI;
+import org.apache.shardingsphere.infra.util.yaml.swapper.YamlConfigurationSwapper;
+import org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
 
 /**
  * YAML rule configuration swapper.
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
index 64ec078e19c..82f3f512957 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistService.java
@@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCre
 import org.apache.shardingsphere.infra.datasource.pool.destroyer.DataSourcePoolDestroyer;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
 import org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.metadata.persist.data.ShardingSphereDataPersistService;
 import org.apache.shardingsphere.metadata.persist.service.DatabaseMetaDataPersistService;
 import org.apache.shardingsphere.metadata.persist.service.MetaDataVersionPersistService;
@@ -74,25 +75,32 @@ public final class MetaDataPersistService {
     }
     
     /**
-     * Persist configurations.
+     * Persist global rule configurations.
      *
-     * @param databaseConfigs database configurations
      * @param globalRuleConfigs global rule configurations
      * @param props properties
      */
-    public void persistConfigurations(final Map<String, ? extends DatabaseConfiguration> databaseConfigs,
-                                      final Collection<RuleConfiguration> globalRuleConfigs, final Properties props) {
-        globalRuleService.conditionalPersist(globalRuleConfigs);
-        propsService.conditionalPersist(props);
-        for (Entry<String, ? extends DatabaseConfiguration> entry : databaseConfigs.entrySet()) {
-            String databaseName = entry.getKey();
-            Map<String, DataSourceProperties> dataSourcePropertiesMap = getDataSourcePropertiesMap(entry.getValue().getDataSources());
-            if (dataSourcePropertiesMap.isEmpty() && entry.getValue().getRuleConfigurations().isEmpty()) {
-                databaseMetaDataService.addDatabase(databaseName);
-            } else {
-                dataSourceService.conditionalPersist(databaseName, getDataSourcePropertiesMap(entry.getValue().getDataSources()));
-                databaseRulePersistService.conditionalPersist(databaseName, entry.getValue().getRuleConfigurations());
-            }
+    public void persistGlobalRuleConfiguration(final Collection<RuleConfiguration> globalRuleConfigs, final Properties props) {
+        globalRuleService.persist(globalRuleConfigs);
+        propsService.persist(props);
+    }
+    
+    /**
+     * Persist configurations.
+     *
+     * @param databaseName database name
+     * @param databaseConfigs database configurations
+     * @param dataSources data sources
+     * @param rules rules
+     */
+    public void persistConfigurations(final String databaseName, final DatabaseConfiguration databaseConfigs,
+                                      final Map<String, DataSource> dataSources, final Collection<ShardingSphereRule> rules) {
+        Map<String, DataSourceProperties> dataSourcePropertiesMap = getDataSourcePropertiesMap(databaseConfigs.getDataSources());
+        if (dataSourcePropertiesMap.isEmpty() && databaseConfigs.getRuleConfigurations().isEmpty()) {
+            databaseMetaDataService.addDatabase(databaseName);
+        } else {
+            dataSourceService.persist(databaseName, dataSources, rules, getDataSourcePropertiesMap(databaseConfigs.getDataSources()));
+            databaseRulePersistService.persist(databaseName, dataSources, rules, databaseConfigs.getRuleConfigurations());
         }
     }
     
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DataSourcePersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DataSourcePersistService.java
index 74810c5c147..d2a536b3a63 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DataSourcePersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DataSourcePersistService.java
@@ -20,11 +20,14 @@ package org.apache.shardingsphere.metadata.persist.service.config.database;
 import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import org.apache.shardingsphere.infra.yaml.config.swapper.resource.YamlDataSourceConfigurationSwapper;
 import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 
+import javax.sql.DataSource;
+import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -41,23 +44,22 @@ public final class DataSourcePersistService implements DatabaseBasedPersistServi
     private final PersistRepository repository;
     
     @Override
-    public void conditionalPersist(final String databaseName, final Map<String, DataSourceProperties> dataSourcePropsMap) {
-        if (!dataSourcePropsMap.isEmpty() && !isExisted(databaseName)) {
-            persist(databaseName, dataSourcePropsMap);
-        }
+    public void persist(final String databaseName, final Map<String, DataSource> dataSources, final Collection<ShardingSphereRule> rules,
+                        final Map<String, DataSourceProperties> dataSourcePropsMap) {
+        persist(databaseName, dataSourcePropsMap);
     }
     
-    @Override
-    public void persist(final String databaseName, final Map<String, DataSourceProperties> dataSourcePropsMap) {
+    private void persist(final String databaseName, final Map<String, DataSourceProperties> dataSourceConfigs) {
         if (Strings.isNullOrEmpty(getDatabaseActiveVersion(databaseName))) {
             repository.persist(DatabaseMetaDataNode.getActiveVersionPath(databaseName), DEFAULT_VERSION);
         }
         repository.persist(DatabaseMetaDataNode.getMetaDataDataSourcePath(databaseName, getDatabaseActiveVersion(databaseName)),
-                YamlEngine.marshal(swapYamlDataSourceConfiguration(dataSourcePropsMap)));
+                YamlEngine.marshal(swapYamlDataSourceConfiguration(dataSourceConfigs)));
     }
     
     @Override
-    public void persist(final String databaseName, final String version, final Map<String, DataSourceProperties> dataSourcePropsMap) {
+    public void persist(final String databaseName, final String version, final Map<String, DataSource> dataSources,
+                        final Collection<ShardingSphereRule> rules, final Map<String, DataSourceProperties> dataSourcePropsMap) {
         repository.persist(DatabaseMetaDataNode.getMetaDataDataSourcePath(databaseName, version), YamlEngine.marshal(swapYamlDataSourceConfiguration(dataSourcePropsMap)));
     }
     
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
index 19a69ce1e35..3a3deb0270e 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
@@ -17,6 +17,12 @@
 
 package org.apache.shardingsphere.metadata.persist.service.config.database;
 
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
+
+import javax.sql.DataSource;
+import java.util.Map;
+import java.util.Collection;
+
 /**
  * Schema based persist service.
  * 
@@ -24,30 +30,26 @@ package org.apache.shardingsphere.metadata.persist.service.config.database;
  */
 public interface DatabaseBasedPersistService<T> {
     
-    /**
-     * Conditional persist configurations.
-     *
-     * @param databaseName database name
-     * @param configs configurations
-     */
-    void conditionalPersist(String databaseName, T configs);
-    
     /**
      * Persist configurations.
      *
      * @param databaseName database name
+     * @param dataSources data sources
+     * @param rules rules
      * @param configs configurations
      */
-    void persist(String databaseName, T configs);
+    void persist(String databaseName, Map<String, DataSource> dataSources, Collection<ShardingSphereRule> rules, T configs);
     
     /**
      * Persist version configurations.
      * 
      * @param databaseName database name
      * @param version version
+     * @param dataSources data sources
+     * @param rules rules
      * @param configs configurations
      */
-    void persist(String databaseName, String version, T configs);
+    void persist(String databaseName, String version, Map<String, DataSource> dataSources, Collection<ShardingSphereRule> rules, T configs);
     
     /**
      * Load configurations.
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRulePersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRulePersistService.java
index 6de19f6b049..1a63ca4de62 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRulePersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseRulePersistService.java
@@ -20,14 +20,17 @@ package org.apache.shardingsphere.metadata.persist.service.config.database;
 import com.google.common.base.Strings;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
 import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine;
 import org.apache.shardingsphere.metadata.persist.node.DatabaseMetaDataNode;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 
+import javax.sql.DataSource;
 import java.util.Collection;
 import java.util.LinkedList;
+import java.util.Map;
 
 /**
  * Database rule persist service.
@@ -40,26 +43,23 @@ public final class DatabaseRulePersistService implements DatabaseBasedPersistSer
     private final PersistRepository repository;
     
     @Override
-    public void conditionalPersist(final String databaseName, final Collection<RuleConfiguration> configs) {
-        if (!configs.isEmpty() && !isExisted(databaseName)) {
-            persist(databaseName, configs);
-        }
-    }
-    
-    @Override
-    public void persist(final String databaseName, final Collection<RuleConfiguration> configs) {
+    public void persist(final String databaseName, final Map<String, DataSource> dataSources,
+                        final Collection<ShardingSphereRule> rules, final Collection<RuleConfiguration> configs) {
         if (Strings.isNullOrEmpty(getDatabaseActiveVersion(databaseName))) {
             repository.persist(DatabaseMetaDataNode.getActiveVersionPath(databaseName), DEFAULT_VERSION);
         }
-        repository.persist(DatabaseMetaDataNode.getRulePath(databaseName, getDatabaseActiveVersion(databaseName)), YamlEngine.marshal(createYamlRuleConfigurations(configs)));
+        repository.persist(DatabaseMetaDataNode.getRulePath(databaseName, getDatabaseActiveVersion(databaseName)),
+                YamlEngine.marshal(createYamlRuleConfigurations(dataSources, rules, configs)));
     }
     
     @Override
-    public void persist(final String databaseName, final String version, final Collection<RuleConfiguration> configs) {
-        repository.persist(DatabaseMetaDataNode.getRulePath(databaseName, version), YamlEngine.marshal(createYamlRuleConfigurations(configs)));
+    public void persist(final String databaseName, final String version, final Map<String, DataSource> dataSources,
+                        final Collection<ShardingSphereRule> rules, final Collection<RuleConfiguration> configs) {
+        repository.persist(DatabaseMetaDataNode.getRulePath(databaseName, version), YamlEngine.marshal(createYamlRuleConfigurations(dataSources, rules, configs)));
     }
     
-    private Collection<YamlRuleConfiguration> createYamlRuleConfigurations(final Collection<RuleConfiguration> ruleConfigs) {
+    private Collection<YamlRuleConfiguration> createYamlRuleConfigurations(final Map<String, DataSource> dataSources, final Collection<ShardingSphereRule> rules,
+                                                                           final Collection<RuleConfiguration> ruleConfigs) {
         return new YamlRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(ruleConfigs);
     }
     
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalPersistService.java
index 15622e49510..c5aeb87a973 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalPersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalPersistService.java
@@ -24,13 +24,6 @@ package org.apache.shardingsphere.metadata.persist.service.config.global;
  */
 public interface GlobalPersistService<T> {
     
-    /**
-     * Conditional persist configurations.
-     *
-     * @param globalRuleConfigs configurations
-     */
-    void conditionalPersist(T globalRuleConfigs);
-    
     /**
      * Persist configurations.
      *
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalRulePersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalRulePersistService.java
index 4a46eb72b88..b557f572c8a 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalRulePersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/GlobalRulePersistService.java
@@ -39,13 +39,6 @@ public final class GlobalRulePersistService implements GlobalPersistService<Coll
     
     private final PersistRepository repository;
     
-    @Override
-    public void conditionalPersist(final Collection<RuleConfiguration> globalRuleConfigs) {
-        if (!globalRuleConfigs.isEmpty() && !isExisted()) {
-            persist(globalRuleConfigs);
-        }
-    }
-    
     @Override
     public void persist(final Collection<RuleConfiguration> globalRuleConfigs) {
         repository.persist(GlobalNode.getGlobalRuleNode(), YamlEngine.marshal(new YamlRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(globalRuleConfigs)));
@@ -54,13 +47,10 @@ public final class GlobalRulePersistService implements GlobalPersistService<Coll
     @Override
     @SuppressWarnings("unchecked")
     public Collection<RuleConfiguration> load() {
-        return isExisted()
-                ? new YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(YamlEngine.unmarshal(repository.getDirectly(GlobalNode.getGlobalRuleNode()), Collection.class))
-                : Collections.emptyList();
-    }
-    
-    private boolean isExisted() {
-        return !Strings.isNullOrEmpty(repository.getDirectly(GlobalNode.getGlobalRuleNode()));
+        String globalRule = repository.getDirectly(GlobalNode.getGlobalRuleNode());
+        return Strings.isNullOrEmpty(globalRule)
+                ? Collections.emptyList()
+                : new YamlRuleConfigurationSwapperEngine().swapToRuleConfigurations(YamlEngine.unmarshal(globalRule, Collection.class));
     }
     
     /**
diff --git a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/PropertiesPersistService.java b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/PropertiesPersistService.java
index 179436ad719..82b99448da7 100644
--- a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/PropertiesPersistService.java
+++ b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/global/PropertiesPersistService.java
@@ -33,24 +33,14 @@ public final class PropertiesPersistService implements GlobalPersistService<Prop
     
     private final PersistRepository repository;
     
-    @Override
-    public void conditionalPersist(final Properties props) {
-        if (!props.isEmpty() && !isExisted()) {
-            persist(props);
-        }
-    }
-    
     @Override
     public void persist(final Properties props) {
         repository.persist(GlobalNode.getPropsPath(), YamlEngine.marshal(props));
     }
     
-    private boolean isExisted() {
-        return !Strings.isNullOrEmpty(repository.getDirectly(GlobalNode.getPropsPath()));
-    }
-    
     @Override
     public Properties load() {
-        return Strings.isNullOrEmpty(repository.getDirectly(GlobalNode.getPropsPath())) ? new Properties() : YamlEngine.unmarshal(repository.getDirectly(GlobalNode.getPropsPath()), Properties.class);
+        String props = repository.getDirectly(GlobalNode.getPropsPath());
+        return Strings.isNullOrEmpty(props) ? new Properties() : YamlEngine.unmarshal(props, Properties.class);
     }
 }
diff --git a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistServiceTest.java b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistServiceTest.java
index bc7cc99edb0..e816573b34f 100644
--- a/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistServiceTest.java
+++ b/kernel/metadata/core/src/test/java/org/apache/shardingsphere/metadata/persist/MetaDataPersistServiceTest.java
@@ -20,10 +20,7 @@ package org.apache.shardingsphere.metadata.persist;
 import lombok.SneakyThrows;
 import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
 import org.apache.shardingsphere.infra.config.database.impl.DataSourceProvidedDatabaseConfiguration;
-import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
-import org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
 import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine;
 import org.apache.shardingsphere.metadata.persist.service.config.database.DataSourcePersistService;
@@ -32,8 +29,6 @@ import org.apache.shardingsphere.metadata.persist.service.config.global.GlobalRu
 import org.apache.shardingsphere.metadata.persist.service.config.global.PropertiesPersistService;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
-import org.apache.shardingsphere.test.util.PropertiesBuilder;
-import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -47,16 +42,13 @@ import java.net.URISyntaxException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Collection;
-import java.util.Properties;
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.stream.Collectors;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
 
 @ExtendWith(MockitoExtension.class)
 class MetaDataPersistServiceTest {
@@ -90,24 +82,6 @@ class MetaDataPersistServiceTest {
         Plugins.getMemberAccessor().set(metaDataPersistService.getClass().getDeclaredField(name), metaDataPersistService, value);
     }
     
-    @Test
-    void assertConditionalPersistConfigurations() {
-        Map<String, DataSource> dataSourceMap = createDataSourceMap();
-        Collection<RuleConfiguration> ruleConfigs = Collections.emptyList();
-        Collection<RuleConfiguration> globalRuleConfigs = Collections.emptyList();
-        Properties props = PropertiesBuilder.build(new Property(ConfigurationPropertyKey.SQL_SHOW.getKey(), Boolean.FALSE.toString()));
-        metaDataPersistService.persistConfigurations(Collections.singletonMap("foo_db", new DataSourceProvidedDatabaseConfiguration(dataSourceMap, ruleConfigs)), globalRuleConfigs, props);
-        verify(dataSourceService).conditionalPersist("foo_db", createDataSourcePropertiesMap(dataSourceMap));
-        verify(databaseRulePersistService).conditionalPersist("foo_db", ruleConfigs);
-        verify(globalRuleService).conditionalPersist(globalRuleConfigs);
-        verify(propsService).conditionalPersist(props);
-    }
-    
-    private Map<String, DataSourceProperties> createDataSourcePropertiesMap(final Map<String, DataSource> dataSourceMap) {
-        return dataSourceMap.entrySet().stream().collect(
-                Collectors.toMap(Entry::getKey, entry -> DataSourcePropertiesCreator.create(entry.getValue()), (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
-    }
-    
     @SuppressWarnings("unchecked")
     @Test
     void assertGetEffectiveDataSources() {
diff --git a/kernel/traffic/core/src/main/java/org/apache/shardingsphere/traffic/yaml/swapper/YamlTrafficRuleConfigurationSwapper.java b/kernel/traffic/core/src/main/java/org/apache/shardingsphere/traffic/yaml/swapper/YamlTrafficRuleConfigurationSwapper.java
index 7c02d5bb5f4..cca3c493172 100644
--- a/kernel/traffic/core/src/main/java/org/apache/shardingsphere/traffic/yaml/swapper/YamlTrafficRuleConfigurationSwapper.java
+++ b/kernel/traffic/core/src/main/java/org/apache/shardingsphere/traffic/yaml/swapper/YamlTrafficRuleConfigurationSwapper.java
@@ -17,8 +17,8 @@
 
 package org.apache.shardingsphere.traffic.yaml.swapper;
 
-import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper;
 import org.apache.shardingsphere.infra.yaml.config.swapper.algorithm.YamlAlgorithmConfigurationSwapper;
+import org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper;
 import org.apache.shardingsphere.traffic.api.config.TrafficRuleConfiguration;
 import org.apache.shardingsphere.traffic.constant.TrafficOrder;
 import org.apache.shardingsphere.traffic.yaml.config.YamlTrafficRuleConfiguration;
diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
index c997db4015d..78f147c91cd 100644
--- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
+++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
@@ -32,9 +32,9 @@ import org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaDa
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
-import org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
 import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
+import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
 import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.event.storage.StorageNodeDataSource;
@@ -46,7 +46,8 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.Map.Entry;
+import java.util.Properties;
 import java.util.stream.Collectors;
 
 /**
@@ -80,18 +81,35 @@ public final class MetaDataContextsFactory {
      */
     public static MetaDataContexts create(final MetaDataPersistService persistService, final ContextManagerBuilderParameter param,
                                           final InstanceContext instanceContext, final Map<String, StorageNodeDataSource> storageNodes) throws SQLException {
-        Collection<String> databaseNames = instanceContext.getInstance().getMetaData() instanceof JDBCInstanceMetaData
-                ? param.getDatabaseConfigs().keySet()
-                : persistService.getDatabaseMetaDataService().loadAllDatabaseNames();
-        Map<String, DatabaseConfiguration> effectiveDatabaseConfigs = createEffectiveDatabaseConfigurations(databaseNames, param.getDatabaseConfigs(), persistService);
+        boolean databaseMetaDataExisted = databaseMetaDataExisted(persistService);
+        Map<String, DatabaseConfiguration> effectiveDatabaseConfigs = getDatabaseConfigurations(databaseMetaDataExisted,
+                getDatabaseNames(instanceContext, param.getDatabaseConfigs(), persistService), param.getDatabaseConfigs(), persistService);
         checkDataSourceStates(effectiveDatabaseConfigs, storageNodes, param.isForce());
-        Collection<RuleConfiguration> globalRuleConfigs = persistService.getGlobalRuleService().load();
-        ConfigurationProperties props = new ConfigurationProperties(persistService.getPropsService().load());
-        // TODO Distinguish load calls ExternalMetaDataFactory or InternalMetaDataFactory
-        Map<String, ShardingSphereDatabase> databases = ExternalMetaDataFactory.create(effectiveDatabaseConfigs, props, instanceContext);
-        databases.putAll(reloadDatabases(databases, persistService));
+        Collection<RuleConfiguration> globalRuleConfigs = getGlobalRuleConfigs(databaseMetaDataExisted, persistService, param.getGlobalRuleConfigs());
+        ConfigurationProperties props = getConfigurationProperties(databaseMetaDataExisted, persistService, param.getProps());
+        Map<String, ShardingSphereDatabase> databases = getDatabases(databaseMetaDataExisted, effectiveDatabaseConfigs, props, instanceContext);
         ShardingSphereRuleMetaData globalMetaData = new ShardingSphereRuleMetaData(GlobalRulesBuilder.buildRules(globalRuleConfigs, databases, props));
-        return new MetaDataContexts(persistService, new ShardingSphereMetaData(databases, globalMetaData, props));
+        MetaDataContexts result = new MetaDataContexts(persistService, new ShardingSphereMetaData(databases, globalMetaData, props));
+        persistDatabaseConfigurations(databaseMetaDataExisted, param, result);
+        persistMetaData(databaseMetaDataExisted, result);
+        return result;
+    }
+    
+    private static boolean databaseMetaDataExisted(final MetaDataPersistService persistService) {
+        return !persistService.getDatabaseMetaDataService().loadAllDatabaseNames().isEmpty();
+    }
+    
+    private static Collection<String> getDatabaseNames(final InstanceContext instanceContext, final Map<String, DatabaseConfiguration> databaseConfigs, final MetaDataPersistService persistService) {
+        return instanceContext.getInstance().getMetaData() instanceof JDBCInstanceMetaData ? databaseConfigs.keySet() : persistService.getDatabaseMetaDataService().loadAllDatabaseNames();
+    }
+    
+    private static ConfigurationProperties getConfigurationProperties(final boolean databaseMetaDataExisted, final MetaDataPersistService persistService, final Properties props) {
+        return databaseMetaDataExisted ? new ConfigurationProperties(persistService.getPropsService().load()) : new ConfigurationProperties(props);
+    }
+    
+    private static Map<String, DatabaseConfiguration> getDatabaseConfigurations(final boolean databaseMetaDataExisted, final Collection<String> databaseNames,
+                                                                                final Map<String, DatabaseConfiguration> databaseConfigs, final MetaDataPersistService persistService) {
+        return databaseMetaDataExisted ? createEffectiveDatabaseConfigurations(databaseNames, databaseConfigs, persistService) : databaseConfigs;
     }
     
     private static Map<String, DatabaseConfiguration> createEffectiveDatabaseConfigurations(final Collection<String> databaseNames,
@@ -128,13 +146,39 @@ public final class MetaDataContextsFactory {
         return result;
     }
     
-    private static Map<String, ShardingSphereDatabase> reloadDatabases(final Map<String, ShardingSphereDatabase> databases, final MetaDataPersistService persistService) {
-        Map<String, ShardingSphereDatabase> result = new ConcurrentHashMap<>(databases.size(), 1);
-        databases.forEach((key, value) -> {
-            Map<String, ShardingSphereSchema> schemas = persistService.getDatabaseMetaDataService().loadSchemas(key);
-            result.put(key.toLowerCase(), new ShardingSphereDatabase(value.getName(),
-                    value.getProtocolType(), value.getResourceMetaData(), value.getRuleMetaData(), schemas.isEmpty() ? value.getSchemas() : schemas));
-        });
-        return result;
+    private static Collection<RuleConfiguration> getGlobalRuleConfigs(final boolean databaseMetaDataExisted, final MetaDataPersistService persistService,
+                                                                      final Collection<RuleConfiguration> globalRuleConfigs) {
+        return databaseMetaDataExisted ? persistService.getGlobalRuleService().load() : globalRuleConfigs;
+    }
+    
+    private static Map<String, ShardingSphereDatabase> getDatabases(final boolean databaseMetaDataExisted, final Map<String, DatabaseConfiguration> databaseConfigMap,
+                                                                    final ConfigurationProperties props, final InstanceContext instanceContext) throws SQLException {
+        return databaseMetaDataExisted ? InternalMetaDataFactory.create(databaseConfigMap, props, instanceContext)
+                : ExternalMetaDataFactory.create(databaseConfigMap, props, instanceContext);
+    }
+    
+    private static void persistDatabaseConfigurations(final boolean databaseMetaDataExisted, final ContextManagerBuilderParameter param, final MetaDataContexts metadataContexts) {
+        if (!databaseMetaDataExisted) {
+            persistDatabaseConfigurations(metadataContexts, param);
+        }
+    }
+    
+    private static void persistDatabaseConfigurations(final MetaDataContexts metadataContexts, final ContextManagerBuilderParameter param) {
+        metadataContexts.getPersistService().persistGlobalRuleConfiguration(param.getGlobalRuleConfigs(), param.getProps());
+        for (Entry<String, ? extends DatabaseConfiguration> entry : param.getDatabaseConfigs().entrySet()) {
+            String databaseName = entry.getKey();
+            metadataContexts.getPersistService().persistConfigurations(entry.getKey(), entry.getValue(),
+                    metadataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(),
+                    metadataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules());
+        }
+    }
+    
+    private static void persistMetaData(final boolean databaseMetaDataExisted, final MetaDataContexts metaDataContexts) {
+        if (!databaseMetaDataExisted) {
+            metaDataContexts.getMetaData().getDatabases().values().forEach(each -> each.getSchemas()
+                    .forEach((schemaName, schema) -> metaDataContexts.getPersistService().getDatabaseMetaDataService().persist(each.getName(), schemaName, schema)));
+            metaDataContexts.getShardingSphereData().getDatabaseData().forEach((databaseName, databaseData) -> databaseData.getSchemaData().forEach((schemaName, schemaData) -> metaDataContexts
+                    .getPersistService().getShardingSphereDataPersistService().persist(databaseName, schemaName, schemaData, metaDataContexts.getMetaData().getDatabases())));
+        }
     }
 }
diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
index 99bf19e05e0..d90052985d0 100644
--- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
+++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
@@ -47,15 +47,13 @@ public final class ClusterContextManagerBuilder implements ContextManagerBuilder
     @Override
     public ContextManager build(final ContextManagerBuilderParameter param) throws SQLException {
         ClusterPersistRepository repository = getClusterPersistRepository((ClusterPersistRepositoryConfiguration) param.getModeConfiguration().getRepository());
-        MetaDataPersistService persistService = new MetaDataPersistService(repository);
-        persistConfigurations(persistService, param);
         RegistryCenter registryCenter = new RegistryCenter(repository, new EventBusContext(), param.getInstanceMetaData(), param.getDatabaseConfigs());
         InstanceContext instanceContext = buildInstanceContext(registryCenter, param);
         if (registryCenter.getRepository() instanceof InstanceContextAware) {
             ((InstanceContextAware) registryCenter.getRepository()).setInstanceContext(instanceContext);
         }
+        MetaDataPersistService persistService = new MetaDataPersistService(repository);
         MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(persistService, param, instanceContext, registryCenter.getStorageNodeStatusService().loadStorageNodes());
-        persistMetaData(metaDataContexts);
         ContextManager result = new ContextManager(metaDataContexts, instanceContext);
         setContextManagerAware(result);
         registerOnline(persistService, registryCenter, param, result);
@@ -69,24 +67,11 @@ public final class ClusterContextManagerBuilder implements ContextManagerBuilder
         return result;
     }
     
-    private void persistConfigurations(final MetaDataPersistService persistService, final ContextManagerBuilderParameter param) {
-        if (!param.isEmpty()) {
-            persistService.persistConfigurations(param.getDatabaseConfigs(), param.getGlobalRuleConfigs(), param.getProps());
-        }
-    }
-    
     private InstanceContext buildInstanceContext(final RegistryCenter registryCenter, final ContextManagerBuilderParameter param) {
         return new InstanceContext(new ComputeNodeInstance(param.getInstanceMetaData()), new ClusterWorkerIdGenerator(registryCenter, param.getInstanceMetaData()),
                 param.getModeConfiguration(), new ClusterModeContextManager(), new GlobalLockContext(registryCenter.getGlobalLockPersistService()), registryCenter.getEventBusContext());
     }
     
-    private void persistMetaData(final MetaDataContexts metaDataContexts) {
-        metaDataContexts.getMetaData().getDatabases().values().forEach(each -> each.getSchemas()
-                .forEach((schemaName, schema) -> metaDataContexts.getPersistService().getDatabaseMetaDataService().persist(each.getName(), schemaName, schema)));
-        metaDataContexts.getShardingSphereData().getDatabaseData().forEach((databaseName, databaseData) -> databaseData.getSchemaData().forEach((schemaName, schemaData) -> metaDataContexts
-                .getPersistService().getShardingSphereDataPersistService().persist(databaseName, schemaName, schemaData, metaDataContexts.getMetaData().getDatabases())));
-    }
-    
     private void setContextManagerAware(final ContextManager contextManager) {
         ((ContextManagerAware) contextManager.getInstanceContext().getModeContextManager()).setContextManagerAware(contextManager);
     }
diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
index f54bd7be455..be22cbfcb39 100644
--- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
+++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
@@ -99,6 +99,8 @@ public final class ClusterModeContextManager implements ModeContextManager, Cont
     @Override
     public void unregisterStorageUnits(final String databaseName, final Collection<String> toBeDroppedStorageUnitNames) {
         contextManager.getMetaDataContexts().getPersistService().getDataSourceService().persist(databaseName,
+                contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(),
+                contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getRuleMetaData().getRules(),
                 getToBeReversedDataSourcePropsMap(contextManager.getMetaDataContexts().getPersistService().getDataSourceService().load(databaseName), toBeDroppedStorageUnitNames));
     }
     
@@ -108,7 +110,9 @@ public final class ClusterModeContextManager implements ModeContextManager, Cont
     
     @Override
     public void alterRuleConfiguration(final String databaseName, final Collection<RuleConfiguration> ruleConfigs) {
-        contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().persist(databaseName, ruleConfigs);
+        contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().persist(databaseName,
+                contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(),
+                contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getRuleMetaData().getRules(), ruleConfigs);
     }
     
     @Override
diff --git a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManagerTest.java b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManagerTest.java
index c383b6f2fc8..69bf76c7145 100644
--- a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManagerTest.java
+++ b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManagerTest.java
@@ -21,6 +21,7 @@ import org.apache.shardingsphere.infra.config.mode.ModeConfiguration;
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.database.type.dialect.H2DatabaseType;
+import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
@@ -28,6 +29,7 @@ import org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaDa
 import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaMetaDataPOJO;
 import org.apache.shardingsphere.infra.metadata.database.schema.pojo.AlterSchemaPOJO;
@@ -47,6 +49,7 @@ import java.util.LinkedList;
 import java.util.Map;
 import java.util.Properties;
 import java.util.TreeMap;
+import java.util.Collections;
 
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.mockito.Mockito.mock;
@@ -66,7 +69,7 @@ class ClusterModeContextManagerTest {
         clusterModeContextManager
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
-        clusterModeContextManager.createDatabase("Database Name");
+        clusterModeContextManager.createDatabase("db");
     }
     
     @Test
@@ -82,7 +85,7 @@ class ClusterModeContextManagerTest {
         clusterModeContextManager
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
-        clusterModeContextManager.dropDatabase("Database Name");
+        clusterModeContextManager.dropDatabase("db");
     }
     
     @Test
@@ -98,13 +101,13 @@ class ClusterModeContextManagerTest {
         clusterModeContextManager
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
-        clusterModeContextManager.createSchema("Database Name", "Schema Name");
+        clusterModeContextManager.createSchema("db", "Schema Name");
     }
     
     @Test
     void assertAlterSchema() {
         ShardingSphereMetaData shardingSphereMetaData = new ShardingSphereMetaData();
-        shardingSphereMetaData.addDatabase("Database Name", new H2DatabaseType());
+        shardingSphereMetaData.addDatabase("db", new H2DatabaseType());
         MetaDataContexts metaDataContexts = new MetaDataContexts(
                 new MetaDataPersistService(new ClusterPersistRepositoryFixture()), shardingSphereMetaData);
         ComputeNodeInstance instance = new ComputeNodeInstance(new JDBCInstanceMetaData("42"));
@@ -114,11 +117,11 @@ class ClusterModeContextManagerTest {
         ClusterModeContextManager modeContextManager = new ClusterModeContextManager();
         ContextManager contextManager = new ContextManager(metaDataContexts, new InstanceContext(instance,
                 workerIdGenerator, modeConfiguration, modeContextManager, null, new EventBusContext()));
-        contextManager.addSchema("Database Name", "Schema Name");
+        contextManager.addSchema("db", "Schema Name");
         ClusterModeContextManager clusterModeContextManager = new ClusterModeContextManager();
         clusterModeContextManager.setContextManagerAware(contextManager);
         clusterModeContextManager
-                .alterSchema(new AlterSchemaPOJO("Database Name", "Schema Name", "Rename Schema Name", new LinkedList<>()));
+                .alterSchema(new AlterSchemaPOJO("db", "Schema Name", "Rename Schema Name", new LinkedList<>()));
     }
     
     @Test
@@ -134,7 +137,7 @@ class ClusterModeContextManagerTest {
         clusterModeContextManager
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
-        clusterModeContextManager.dropSchema("Database Name", new LinkedList<>());
+        clusterModeContextManager.dropSchema("db", new LinkedList<>());
     }
     
     @Test
@@ -152,7 +155,7 @@ class ClusterModeContextManagerTest {
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
         Collection<String> stringList = new LinkedList<>();
         stringList.add("foo");
-        clusterModeContextManager.dropSchema("Database Name", stringList);
+        clusterModeContextManager.dropSchema("db", stringList);
     }
     
     @Test
@@ -171,7 +174,7 @@ class ClusterModeContextManagerTest {
         Collection<String> stringList = new LinkedList<>();
         stringList.add("/");
         stringList.add("foo");
-        clusterModeContextManager.dropSchema("Database Name", stringList);
+        clusterModeContextManager.dropSchema("db", stringList);
     }
     
     @Test
@@ -187,7 +190,7 @@ class ClusterModeContextManagerTest {
         clusterModeContextManager
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
-        AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO("Database Name", "Schema Name");
+        AlterSchemaMetaDataPOJO alterSchemaMetaDataPOJO = new AlterSchemaMetaDataPOJO("db", "Schema Name");
         clusterModeContextManager.alterSchemaMetaData(alterSchemaMetaDataPOJO);
         assertNull(alterSchemaMetaDataPOJO.getLogicDataSourceName());
     }
@@ -205,7 +208,7 @@ class ClusterModeContextManagerTest {
         clusterModeContextManager
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
-        clusterModeContextManager.registerStorageUnits("Database Name", new TreeMap<>());
+        clusterModeContextManager.registerStorageUnits("db", new TreeMap<>());
     }
     
     @Test
@@ -221,7 +224,7 @@ class ClusterModeContextManagerTest {
         clusterModeContextManager
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
-        clusterModeContextManager.alterStorageUnits("Database Name", new TreeMap<>());
+        clusterModeContextManager.alterStorageUnits("db", new TreeMap<>());
     }
     
     @Test
@@ -238,7 +241,7 @@ class ClusterModeContextManagerTest {
         clusterModeContextManager
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
-        clusterModeContextManager.alterStorageUnits("Database Name", new TreeMap<>());
+        clusterModeContextManager.alterStorageUnits("db", new TreeMap<>());
     }
     
     @Test
@@ -256,7 +259,7 @@ class ClusterModeContextManagerTest {
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
         Map<String, DataSourceProperties> stringDataSourcePropertiesMap = new HashMap<>();
         stringDataSourcePropertiesMap.put("active_version", new DataSourceProperties("active_version", new HashMap<>()));
-        clusterModeContextManager.alterStorageUnits("Database Name", stringDataSourcePropertiesMap);
+        clusterModeContextManager.alterStorageUnits("db", stringDataSourcePropertiesMap);
     }
     
     @Test
@@ -275,7 +278,7 @@ class ClusterModeContextManagerTest {
         Map<String, DataSourceProperties> stringDataSourcePropertiesMap = new HashMap<>();
         stringDataSourcePropertiesMap.put("\n", new DataSourceProperties("\n", new HashMap<>()));
         stringDataSourcePropertiesMap.put("active_version", new DataSourceProperties("active_version", new HashMap<>()));
-        clusterModeContextManager.alterStorageUnits("Database Name", stringDataSourcePropertiesMap);
+        clusterModeContextManager.alterStorageUnits("db", stringDataSourcePropertiesMap);
     }
     
     @Test
@@ -295,7 +298,7 @@ class ClusterModeContextManagerTest {
         clusterModeContextManager
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
-        clusterModeContextManager.alterStorageUnits("Database Name", new TreeMap<>());
+        clusterModeContextManager.alterStorageUnits("db", new TreeMap<>());
     }
     
     @Test
@@ -313,7 +316,7 @@ class ClusterModeContextManagerTest {
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
         Map<String, DataSourceProperties> stringDataSourcePropertiesMap = new HashMap<>(new TreeMap<>());
-        clusterModeContextManager.alterStorageUnits("Database Name", stringDataSourcePropertiesMap);
+        clusterModeContextManager.alterStorageUnits("db", stringDataSourcePropertiesMap);
     }
     
     @Test
@@ -332,14 +335,14 @@ class ClusterModeContextManagerTest {
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
         Map<String, DataSourceProperties> stringDataSourcePropertiesMap = new HashMap<>();
         stringDataSourcePropertiesMap.put("42", new DataSourceProperties("active_version", new HashMap<>()));
-        clusterModeContextManager.alterStorageUnits("Database Name", stringDataSourcePropertiesMap);
+        clusterModeContextManager.alterStorageUnits("db", stringDataSourcePropertiesMap);
     }
     
     @Test
     void assertUnregisterStorageUnits() {
         ClusterModeContextManager clusterModeContextManager = new ClusterModeContextManager();
         MetaDataPersistService persistService = new MetaDataPersistService(new ClusterPersistRepositoryFixture());
-        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, new ShardingSphereMetaData());
+        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, createShardingSphereMetaData());
         ComputeNodeInstance instance = new ComputeNodeInstance(new JDBCInstanceMetaData("42"));
         WorkerIdGenerator workerIdGenerator = mock(WorkerIdGenerator.class);
         ModeConfiguration modeConfiguration = new ModeConfiguration("Type",
@@ -348,7 +351,7 @@ class ClusterModeContextManagerTest {
         clusterModeContextManager
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
-        clusterModeContextManager.unregisterStorageUnits("Database Name", new LinkedList<>());
+        clusterModeContextManager.unregisterStorageUnits("db", new LinkedList<>());
     }
     
     @Test
@@ -356,7 +359,7 @@ class ClusterModeContextManagerTest {
         ClusterModeContextManager clusterModeContextManager = new ClusterModeContextManager();
         MetaDataPersistService persistService = new MetaDataPersistService(
                 new ProcessListClusterPersistRepositoryFixture());
-        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, new ShardingSphereMetaData());
+        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, createShardingSphereMetaData());
         ComputeNodeInstance instance = new ComputeNodeInstance(new JDBCInstanceMetaData("42"));
         WorkerIdGenerator workerIdGenerator = mock(WorkerIdGenerator.class);
         ModeConfiguration modeConfiguration = new ModeConfiguration("Type",
@@ -365,14 +368,14 @@ class ClusterModeContextManagerTest {
         clusterModeContextManager
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
-        clusterModeContextManager.unregisterStorageUnits("Database Name", new LinkedList<>());
+        clusterModeContextManager.unregisterStorageUnits("db", new LinkedList<>());
     }
     
     @Test
     void assertUnregisterStorageUnitsWithClusterPersistRepoFixture() {
         ClusterModeContextManager clusterModeContextManager = new ClusterModeContextManager();
         MetaDataPersistService persistService = new MetaDataPersistService(new ClusterPersistRepositoryFixture());
-        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, new ShardingSphereMetaData());
+        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, createShardingSphereMetaData());
         ComputeNodeInstance instance = new ComputeNodeInstance(new JDBCInstanceMetaData("42"));
         WorkerIdGenerator workerIdGenerator = mock(WorkerIdGenerator.class);
         ModeConfiguration modeConfiguration = new ModeConfiguration("Type",
@@ -381,14 +384,14 @@ class ClusterModeContextManagerTest {
         clusterModeContextManager
                 .setContextManagerAware(new ContextManager(metaDataContexts, new InstanceContext(instance, workerIdGenerator,
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
-        clusterModeContextManager.alterRuleConfiguration("Database Name", new LinkedList<>());
+        clusterModeContextManager.alterRuleConfiguration("db", new LinkedList<>());
     }
     
     @Test
     void assertAlterRuleConfiguration() {
         ClusterModeContextManager clusterModeContextManager = new ClusterModeContextManager();
         MetaDataPersistService persistService = new MetaDataPersistService(new ClusterPersistRepositoryFixture());
-        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, new ShardingSphereMetaData());
+        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, createShardingSphereMetaData());
         ComputeNodeInstance instance = new ComputeNodeInstance(new JDBCInstanceMetaData("42"));
         WorkerIdGenerator workerIdGenerator = mock(WorkerIdGenerator.class);
         ModeConfiguration modeConfiguration = new ModeConfiguration("Type",
@@ -399,14 +402,20 @@ class ClusterModeContextManagerTest {
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
         Collection<RuleConfiguration> ruleConfigurationList = new LinkedList<>();
         ruleConfigurationList.add(new RuleConfigurationFixture());
-        clusterModeContextManager.alterRuleConfiguration("Database Name", ruleConfigurationList);
+        clusterModeContextManager.alterRuleConfiguration("db", ruleConfigurationList);
+    }
+    
+    private ShardingSphereMetaData createShardingSphereMetaData() {
+        return new ShardingSphereMetaData(Collections.singletonMap("db", new ShardingSphereDatabase("db", new MySQLDatabaseType(),
+                new ShardingSphereResourceMetaData("db", Collections.emptyMap()), new ShardingSphereRuleMetaData(Collections.emptyList()), Collections.emptyMap())),
+                new ShardingSphereRuleMetaData(Collections.emptyList()), new ConfigurationProperties(new Properties()));
     }
     
     @Test
     void assertAlterRuleConfigurationMultiple() {
         ClusterModeContextManager clusterModeContextManager = new ClusterModeContextManager();
         MetaDataPersistService persistService = new MetaDataPersistService(new ClusterPersistRepositoryFixture());
-        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, new ShardingSphereMetaData());
+        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, createShardingSphereMetaData());
         ComputeNodeInstance instance = new ComputeNodeInstance(new JDBCInstanceMetaData("42"));
         WorkerIdGenerator workerIdGenerator = mock(WorkerIdGenerator.class);
         ModeConfiguration modeConfiguration = new ModeConfiguration("Type",
@@ -418,7 +427,7 @@ class ClusterModeContextManagerTest {
         Collection<RuleConfiguration> ruleConfigurationList = new LinkedList<>();
         ruleConfigurationList.add(new RuleConfigurationFixture());
         ruleConfigurationList.add(new RuleConfigurationFixture());
-        clusterModeContextManager.alterRuleConfiguration("Database Name", ruleConfigurationList);
+        clusterModeContextManager.alterRuleConfiguration("db", ruleConfigurationList);
     }
     
     @Test
@@ -426,7 +435,7 @@ class ClusterModeContextManagerTest {
         ClusterModeContextManager clusterModeContextManager = new ClusterModeContextManager();
         MetaDataPersistService persistService = new MetaDataPersistService(
                 new ProcessListClusterPersistRepositoryFixture());
-        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, new ShardingSphereMetaData());
+        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, createShardingSphereMetaData());
         ComputeNodeInstance instance = new ComputeNodeInstance(new JDBCInstanceMetaData("42"));
         WorkerIdGenerator workerIdGenerator = mock(WorkerIdGenerator.class);
         ModeConfiguration modeConfiguration = new ModeConfiguration("Type",
@@ -437,14 +446,14 @@ class ClusterModeContextManagerTest {
                         modeConfiguration, modeContextManager, null, new EventBusContext())));
         Collection<RuleConfiguration> ruleConfigurationList = new LinkedList<>();
         ruleConfigurationList.add(new RuleConfigurationFixture());
-        clusterModeContextManager.alterRuleConfiguration("Database Name", ruleConfigurationList);
+        clusterModeContextManager.alterRuleConfiguration("db", ruleConfigurationList);
     }
     
     @Test
     void assertAlterGlobalRuleConfigurationWithEmptyRuleConfigurations() {
         ClusterModeContextManager clusterModeContextManager = new ClusterModeContextManager();
         MetaDataPersistService persistService = new MetaDataPersistService(new ClusterPersistRepositoryFixture());
-        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, new ShardingSphereMetaData());
+        MetaDataContexts metaDataContexts = new MetaDataContexts(persistService, createShardingSphereMetaData());
         ComputeNodeInstance instance = new ComputeNodeInstance(new JDBCInstanceMetaData("42"));
         WorkerIdGenerator workerIdGenerator = mock(WorkerIdGenerator.class);
         ModeConfiguration modeConfiguration = new ModeConfiguration("Type",
diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
index 1641341acac..96761e02828 100644
--- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
+++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java
@@ -47,7 +47,6 @@ public final class StandaloneContextManagerBuilder implements ContextManagerBuil
         StandalonePersistRepository repository = TypedSPILoader.getService(
                 StandalonePersistRepository.class, null == repositoryConfig ? null : repositoryConfig.getType(), null == repositoryConfig ? new Properties() : repositoryConfig.getProps());
         MetaDataPersistService persistService = new MetaDataPersistService(repository);
-        persistConfigurations(persistService, param);
         InstanceContext instanceContext = buildInstanceContext(param);
         new ProcessStandaloneSubscriber(instanceContext.getEventBusContext());
         MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(persistService, param, instanceContext);
@@ -56,12 +55,6 @@ public final class StandaloneContextManagerBuilder implements ContextManagerBuil
         return result;
     }
     
-    private void persistConfigurations(final MetaDataPersistService persistService, final ContextManagerBuilderParameter param) {
-        if (!param.isEmpty()) {
-            persistService.persistConfigurations(param.getDatabaseConfigs(), param.getGlobalRuleConfigs(), param.getProps());
-        }
-    }
-    
     private InstanceContext buildInstanceContext(final ContextManagerBuilderParameter param) {
         return new InstanceContext(new ComputeNodeInstance(param.getInstanceMetaData()),
                 new StandaloneWorkerIdGenerator(), param.getModeConfiguration(), new StandaloneModeContextManager(), new GlobalLockContext(null), new EventBusContext());
diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
index 628d75b6408..2de894d080b 100644
--- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
+++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
@@ -237,6 +237,8 @@ public final class StandaloneModeContextManager implements ModeContextManager, C
         contextManager.renewMetaDataContexts(reloadMetaDataContexts);
         Map<String, DataSourceProperties> toBeReversedDataSourcePropsMap = getToBeReversedDataSourcePropsMap(dataSourcePropsMap, toBeDroppedStorageUnitNames);
         contextManager.getMetaDataContexts().getPersistService().getDataSourceService().persist(contextManager.getMetaDataContexts().getMetaData().getActualDatabaseName(databaseName),
+                contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(),
+                contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getRuleMetaData().getRules(),
                 toBeReversedDataSourcePropsMap);
         switchingResource.closeStaleDataSources();
         clearServiceCache();
@@ -254,7 +256,10 @@ public final class StandaloneModeContextManager implements ModeContextManager, C
     public void alterRuleConfiguration(final String databaseName, final Collection<RuleConfiguration> ruleConfigs) {
         contextManager.alterRuleConfiguration(databaseName, ruleConfigs);
         contextManager.getMetaDataContexts().getPersistService()
-                .getDatabaseRulePersistService().persist(contextManager.getMetaDataContexts().getMetaData().getActualDatabaseName(databaseName), ruleConfigs);
+                .getDatabaseRulePersistService().persist(contextManager.getMetaDataContexts().getMetaData().getActualDatabaseName(databaseName),
+                        contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(),
+                        contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getRuleMetaData().getRules(),
+                        ruleConfigs);
         clearServiceCache();
     }
     
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
index 42850cc73a5..297864c0b56 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
@@ -185,7 +185,9 @@ public final class YamlDatabaseConfigurationImportExecutor {
         }
         ruleConfigsMap.keySet().stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList())
                 .forEach(each -> addRules(allRuleConfigs, ruleConfigsMap.get(each), database));
-        metaDataContexts.getPersistService().getDatabaseRulePersistService().persist(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), allRuleConfigs);
+        metaDataContexts.getPersistService().getDatabaseRulePersistService().persist(metaDataContexts.getMetaData().getActualDatabaseName(databaseName),
+                metaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources(),
+                metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getRules(), allRuleConfigs);
     }
     
     private void addRules(final Collection<RuleConfiguration> allRuleConfigs, final Collection<RuleConfiguration> ruleConfigs, final ShardingSphereDatabase database) {
diff --git a/proxy/bootstrap/src/main/resources/conf/config-database-discovery.yaml b/proxy/bootstrap/src/main/resources/conf/config-database-discovery.yaml
deleted file mode 100644
index 1e541e74a16..00000000000
--- a/proxy/bootstrap/src/main/resources/conf/config-database-discovery.yaml
+++ /dev/null
@@ -1,131 +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.
-#
-
-######################################################################################################
-#
-# Here you can configure the rules for the proxy.
-# This example is configuration of HA rule.
-#
-######################################################################################################
-#
-#databaseName: database_discovery_db
-#
-#dataSources:
-#  ds_0:
-#    url: jdbc:postgresql://127.0.0.1:5432/demo_primary_ds
-#    username: postgres
-#    password: postgres
-#    connectionTimeoutMilliseconds: 3000
-#    idleTimeoutMilliseconds: 60000
-#    maxLifetimeMilliseconds: 1800000
-#    maxPoolSize: 50
-#    minPoolSize: 1
-#  ds_1:
-#    url: jdbc:postgresql://127.0.0.1:5432/demo_replica_ds_0
-#    username: postgres
-#    password: postgres
-#    connectionTimeoutMilliseconds: 3000
-#    idleTimeoutMilliseconds: 60000
-#    maxLifetimeMilliseconds: 1800000
-#    maxPoolSize: 50
-#    minPoolSize: 1
-#  ds_2:
-#    url: jdbc:postgresql://127.0.0.1:5432/demo_replica_ds_1
-#    username: postgres
-#    password: postgres
-#    connectionTimeoutMilliseconds: 3000
-#    idleTimeoutMilliseconds: 60000
-#    maxLifetimeMilliseconds: 1800000
-#    maxPoolSize: 50
-#    minPoolSize: 1
-#
-#rules:
-#- !DB_DISCOVERY
-#  dataSources:
-#    readwrite_ds:
-#      dataSourceNames:
-#        - ds_0
-#        - ds_1
-#        - ds_2
-#      discoveryHeartbeatName: mgr_heartbeat
-#      discoveryTypeName: mgr
-#  discoveryHeartbeats:
-#    mgr_heartbeat:
-#      props:
-#        keep-alive-cron: '0/5 * * * * ?'
-#  discoveryTypes:
-#    mgr:
-#      type: MySQL.MGR
-#      props:
-#        group-name: 92504d5b-6dec-11e8-91ea-246e9612aaf1
-
-######################################################################################################
-#
-# If you want to connect to MySQL, you should manually copy MySQL driver to lib directory.
-#
-######################################################################################################
-
-#databaseName: database_discovery_db
-#
-#dataSources:
-#  ds_0:
-#    url: jdbc:mysql://127.0.0.1:3306/demo_primary_ds?serverTimezone=UTC&useSSL=false
-#    username: root
-#    password:
-#    connectionTimeoutMilliseconds: 3000
-#    idleTimeoutMilliseconds: 60000
-#    maxLifetimeMilliseconds: 1800000
-#    maxPoolSize: 50
-#    minPoolSize: 1
-#  ds_1:
-#    url: jdbc:mysql://127.0.0.1:3306/demo_replica_ds_0?serverTimezone=UTC&useSSL=false
-#    username: root
-#    password:
-#    connectionTimeoutMilliseconds: 3000
-#    idleTimeoutMilliseconds: 60000
-#    maxLifetimeMilliseconds: 1800000
-#    maxPoolSize: 50
-#    minPoolSize: 1
-#  ds_2:
-#    url: jdbc:mysql://127.0.0.1:3306/demo_replica_ds_1?serverTimezone=UTC&useSSL=false
-#    username: root
-#    password:
-#    connectionTimeoutMilliseconds: 3000
-#    idleTimeoutMilliseconds: 60000
-#    maxLifetimeMilliseconds: 1800000
-#    maxPoolSize: 50
-#    minPoolSize: 1
-#
-#rules:
-#- !DB_DISCOVERY
-#  dataSources:
-#    readwrite_ds:
-#      dataSourceNames:
-#        - ds_0
-#        - ds_1
-#        - ds_2
-#      discoveryHeartbeatName: mgr_heartbeat
-#      discoveryTypeName: mgr
-#  discoveryHeartbeats:
-#    mgr_heartbeat:
-#      props:
-#        keep-alive-cron: '0/5 * * * * ?'
-#  discoveryTypes:
-#    mgr:
-#      type: MySQL.MGR
-#      props:
-#        group-name: 92504d5b-6dec-11e8-91ea-246e9612aaf1
diff --git a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask/show_mask_rule.xml b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask/cluster/show_mask_rule.xml
similarity index 100%
copy from test/e2e/sql/src/test/resources/cases/rql/dataset/mask/show_mask_rule.xml
copy to test/e2e/sql/src/test/resources/cases/rql/dataset/mask/cluster/show_mask_rule.xml
diff --git a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask/standalone/show_mask_rule.xml
similarity index 97%
copy from test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml
copy to test/e2e/sql/src/test/resources/cases/rql/dataset/mask/standalone/show_mask_rule.xml
index 0654800c268..d3090160de3 100644
--- a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml
+++ b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask/standalone/show_mask_rule.xml
@@ -24,5 +24,5 @@
     </metadata>
     <row values="t_user| password| MD5| " />
     <row values="t_user| email| MASK_BEFORE_SPECIAL_CHARS| special-chars=@,replace-char=*" />
-    <row values="t_user| telephone| KEEP_FIRST_N_LAST_M| first-n=3,last-m=4,replace-char=*" />
+    <row values="t_user| telephone| KEEP_FIRST_N_LAST_M| first-n=3,replace-char=*,last-m=4" />
 </dataset>
diff --git a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt/cluster/show_mask_rule.xml
similarity index 100%
copy from test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml
copy to test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt/cluster/show_mask_rule.xml
diff --git a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt/show_mask_rule.xml b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt/show_mask_rule.xml
index 0654800c268..d3090160de3 100644
--- a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt/show_mask_rule.xml
+++ b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt/show_mask_rule.xml
@@ -24,5 +24,5 @@
     </metadata>
     <row values="t_user| password| MD5| " />
     <row values="t_user| email| MASK_BEFORE_SPECIAL_CHARS| special-chars=@,replace-char=*" />
-    <row values="t_user| telephone| KEEP_FIRST_N_LAST_M| first-n=3,last-m=4,replace-char=*" />
+    <row values="t_user| telephone| KEEP_FIRST_N_LAST_M| first-n=3,replace-char=*,last-m=4" />
 </dataset>
diff --git a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt/standalone/show_mask_rule.xml
similarity index 97%
copy from test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml
copy to test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt/standalone/show_mask_rule.xml
index 0654800c268..d3090160de3 100644
--- a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml
+++ b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt/standalone/show_mask_rule.xml
@@ -24,5 +24,5 @@
     </metadata>
     <row values="t_user| password| MD5| " />
     <row values="t_user| email| MASK_BEFORE_SPECIAL_CHARS| special-chars=@,replace-char=*" />
-    <row values="t_user| telephone| KEEP_FIRST_N_LAST_M| first-n=3,last-m=4,replace-char=*" />
+    <row values="t_user| telephone| KEEP_FIRST_N_LAST_M| first-n=3,replace-char=*,last-m=4" />
 </dataset>
diff --git a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_sharding/show_mask_rule.xml b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/cluster/show_mask_rule.xml
similarity index 100%
rename from test/e2e/sql/src/test/resources/cases/rql/dataset/mask_sharding/show_mask_rule.xml
rename to test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/cluster/show_mask_rule.xml
diff --git a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/standalone/show_mask_rule.xml
similarity index 97%
copy from test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml
copy to test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/standalone/show_mask_rule.xml
index 0654800c268..d3090160de3 100644
--- a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml
+++ b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/standalone/show_mask_rule.xml
@@ -24,5 +24,5 @@
     </metadata>
     <row values="t_user| password| MD5| " />
     <row values="t_user| email| MASK_BEFORE_SPECIAL_CHARS| special-chars=@,replace-char=*" />
-    <row values="t_user| telephone| KEEP_FIRST_N_LAST_M| first-n=3,last-m=4,replace-char=*" />
+    <row values="t_user| telephone| KEEP_FIRST_N_LAST_M| first-n=3,replace-char=*,last-m=4" />
 </dataset>
diff --git a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask/show_mask_rule.xml b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_sharding/cluster/show_mask_rule.xml
similarity index 100%
rename from test/e2e/sql/src/test/resources/cases/rql/dataset/mask/show_mask_rule.xml
rename to test/e2e/sql/src/test/resources/cases/rql/dataset/mask_sharding/cluster/show_mask_rule.xml
diff --git a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_sharding/standalone/show_mask_rule.xml
similarity index 97%
rename from test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml
rename to test/e2e/sql/src/test/resources/cases/rql/dataset/mask_sharding/standalone/show_mask_rule.xml
index 0654800c268..d3090160de3 100644
--- a/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_encrypt_sharding/show_mask_rule.xml
+++ b/test/e2e/sql/src/test/resources/cases/rql/dataset/mask_sharding/standalone/show_mask_rule.xml
@@ -24,5 +24,5 @@
     </metadata>
     <row values="t_user| password| MD5| " />
     <row values="t_user| email| MASK_BEFORE_SPECIAL_CHARS| special-chars=@,replace-char=*" />
-    <row values="t_user| telephone| KEEP_FIRST_N_LAST_M| first-n=3,last-m=4,replace-char=*" />
+    <row values="t_user| telephone| KEEP_FIRST_N_LAST_M| first-n=3,replace-char=*,last-m=4" />
 </dataset>