
# 使用DRS迁移多租户数据
#### 操作场景
开启多租户管理与资源隔离功能后，DRS迁移可以迁移所有租户下的数据。
#### 使用须知
- 若源实例和目标实例多租户开关状态不一致，会预检查失败。
- 源实例和目标实例的版本或规格不一致时，迁移成功后，源实例的资源配置不再适用目标实例。建议用户按照目标实例的规格，使用资源配置语法重新调整目标实例租户的资源配置。
- DRS灾备同步场景，不支持使用目标实例IP+端口场景进行迁移。如果选择IP+端口模式，租户元数据将无法迁移到目标实例上。
- 推荐源实例和目标实例均为2.0.60.241200版本及其以上使用DRS迁移功能，其他版本无法保证多租户功能正常提供服务。
- 若源实例和目标实例多租户开关打开，由于多租户元数据表中存在初始化配置，会在预检查阶段上报提醒，告知用户__taurus_sys__库下存在非空表。用户可根据实际情况清理该库下非空表的内容。如果不清理，则会在DRS灾备同步过程中保留非空表中的数据，可能会造成多租户功能无法使用。具体清理步骤请参考[常见问题]。
 
#### 迁移方案
- TaurusDB实例内核版本2.0.60.241200之前，DRS不会同步租户相关元数据，故租户信息不会被同步到目标端。如果需要迁移某个租户到另一个实例，需要遵循以下步骤：
  1. 目标端需要使用具备多租户特性的实例，首先在目标端手动创建租户。
  
  2. 使用DRS数据同步功能创建库级同步任务（如果源端和目标端租户名有改动，则这里需要改动目标端库名）。 ![](https://support.huaweicloud.com/kerneldesc-taurusdb/figure/zh-cn_image_0000002321055293.png "点击放大")
     
  
  3. 进行同步。
   
- TaurusDB实例内核版本2.0.60.241200及以上，DRS迁移支持租户元数据跨实例迁移，可直接使用DRS数据同步功能创建库级同步任务后进行迁移。
 
 #### 常见问题
如何清理__taurus_sys__库下非空表数据？
1. 清理普通租户下的用户，数据库以及表空间。示例如下： 
   - 执行SQL语句，查询普通租户下是否仍有用户存在。
     ```
     select user,host from mysql.user where instr(user, '@') > 0;
     ```
     存在用户，执行SQL语句，删除对应用户。
     ```
     drop user 'user_name@tenant_name'@'%';
     ```
     
   
   - 执行SQL语句，查询普通租户下是否仍有数据库存在。
     ```
     select * from SCHEMATA where instr(SCHEMA_NAME, '@') > 0;
     ```
     如果存在普通租户下的数据库，执行SQL语句，删除对应数据库。
     ```
     drop database 'db_name@tenant_name';
     ```
     
   
   - 执行SQL语句，查询普通租户下有哪些存量数据库。
     ```
     select * from information_schema.MT_tenant_DB;
     ```
     执行SQL语句，将存量数据库回收到系统租户下。
     ```
     alter database 'db_name' tenant = ``;
     ```
     
   
   - 执行SQL语句，查询普通租户创建的表空间。
     ```
     select * from information_schema.innodb_tablespaces where instr(NAME, '@') > 0;
     ```
     执行SQL语句，删除对应的表空间。
     ```
     drop tablespace tbs_name;
     ```
     
   
   
   
   
2. 删除普通租户（用户级资源配置会自动删除），删除对应的租户级资源配置。示例如下： 
   ```
   drop tenant tenant_name;
   ```
   ```
   drop resource_config config_name;
   ```
   
   
3. 删除系统租户下的用户级资源配置。示例如下： 
   ```
   CALL dbms_resource_manager.clear_all_configs();
   ```
   
   
