# 导入导出Hive数据库
#### 操作场景
在大数据应用场景中，企业可能需要将Hive中的数据库及数据库下的所有表迁移到另一个集群上，例如从测试环境迁移到生产环境、从旧集群迁移到新集群、或进行跨地域数据同步等。传统的迁移方式需要逐个导出和导入表，操作繁琐且容易出错。如何快速、完整地将整个数据库（包括表结构、表数据、权限信息等）迁移到目标集群？Hive提供数据库导入导出功能（Dump/Load命令），可以实现完整数据库的迁移，简化数据迁移操作，提高迁移效率。
本文介绍如何使用Hive的导入导出功能迁移数据库。
- **Load命令**：Hive提供的数据库导入命令，用于将Dump命令导出的数据库快照导入到目标集群的指定数据库中。Load命令会恢复数据库的完整结构，包括表定义、表数据、权限等。
- **复制策略（Replication Policy）**：Hive数据库导入导出功能使用的策略机制，用于标识数据库的复制关系。设置复制策略后，数据库可以被导出到目标集群，并支持增量复制。
- **跨集群互信**：在Kerberos安全模式下，源集群和目标集群之间建立的信任关系，允许跨集群访问资源。跨集群导入导出Hive数据库时，需要配置跨集群互信。
 
#### 约束与限制
- 本章节内容适用于MRS 3.2.0及之后版本。
- Hive数据库导入导出功能目前不支持对加密表、HBase外部表、Hudi表、视图表及物化视图表进行导入导出操作。
 
#### 前提条件
- 如果是跨集群对Hive数据库进行导入导出，且目标集群和源集群都开启了Kerberos认证，需配置跨集群互信。
- 如果使用Dump/Load命令导入导出其他用户创建的数据库，需要授予用户对应数据库的权限：
  - 集群未启用Ranger鉴权，需登录FusionInsight Manager授予该用户所属角色管理员权限，详细操作请参考[创建Hive用户并绑定角色](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0949.html)章节。
  
  - 集群启用了Ranger鉴权，需参考[添加Hive的Ranger访问权限策略](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1858.html)章节授予用户对应数据库的Repl Dump/Load操作权限。
   
- 还需在源端集群和目标集群启用集群间拷贝功能。
- 需配置源端集群访问目标集群HDFS服务地址参数。 登录源端集群的FusionInsight Manager，选择"集群 \> 服务 \> Hive \> 配置"，搜索"hdfs.site.customized.configs"，新增自定义参数"dfs.namenode.rpc-address.haclusterX"，值为"*目标集群的NameNode实例主节点业务IP* :*RPC端口* "；新增自定义参数"dfs.namenode.rpc-address.haclusterX1"，值为"*目标集群的NameNode实例备节点的业务IP* :*RPC端口*"，NameNode RPC端口默认为"25000"。保存配置后需滚动重启Hive服务。
  
 
#### 操作步骤
1. 以Hive客户端安装用户登录源端集群安装客户端的节点。
2. 执行以下命令，切换到客户端安装目录，例如安装目录为"/opt/client"，请用户根据实际情况修改。
   
   ```
   cd /opt/client
   ```
   
   
3. 执行以下命令配置环境变量。 
   ```
   source bigdata_env
   ```
   
   
4. 如果集群开启了Kerberos认证，执行以下命令认证用户，否则跳过此步骤。 
   ```
   kinit Hive业务用户
   ```
   
   
5. 执行以下命令登录Hive客户端。
   
   ```
   beeline
   ```
   
   
6. 执行以下命令创建数据库"dump_db"。 
   ```
   create database dump_db;
   ```
   
   
7. 执行以下命令切换到"dump_db"数据库。 
   ```
   use dump_db;
   ```
   
   
8. 执行以下命令在"dump_db"中创建表"test"。 
   ```
   create table test(id int);
   ```
   
   
9. 执行以下命令向表"test"中插入数据。 
   ```
   insert into test values(123);
   ```
   
   
10. 执行以下命令将数据库"dump_db"设置为复制策略的源。 
    ```
    alter database dump_db set dbproperties ('repl.source.for'='replpolicy1');
    ```
    - 执行alter命令修改数据库属性时，用户需要对该数据库拥有对应权限。权限设置方式如下：
      - 集群未启用Ranger鉴权，需登录FusionInsight Manager授予该用户所属角色管理员权限，详细操作请参考[创建Hive用户并绑定角色](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0949.html)章节。
      
      - 集群启用了Ranger鉴权，需参考[添加Hive的Ranger访问权限策略](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1858.html)章节授予用户对应数据库的Repl Dump/Load操作权限。
       
    
    - 删除设置了复制策略源的数据库时，需要先将该数据库的复制策略源设置为空，再对数据库执行删除操作，否则无法删除。将数据库复制策略源设置为空的命令如下：
      ```
      alter database dump_db set dbproperties ('repl.source.for'='');
      ```
      
    
    
    
    
11. 执行以下命令将"dump_db"导出到目标集群的"/user/hive/test"目录下。 
    ```
    repl dump dump_db with ('hive.repl.rootdir'='hdfs://haclusterX/user/hive/test');
    ```
    - "haclusterX"为新增的自定义参数"dfs.namenode.rpc-address.haclusterX"中的"haclusterX"。
    
    - 指定导出目录时需要确保当前用户对该目录拥有读写权限。
    
    
    
    
12. 以Hive客户端安装用户登录目标集群安装客户端的节点，并执行[2]\~[5]。
13. 执行以下命令将"/user/hive/test"目录下的"dump_db"数据库的数据导入到"load_db"数据库中。 
    ```
    repl load load_db from '/user/hive/repl';
    ```
    通过**repl load**导入数据库，指定数据库名称时需要注意以下情况：
    - 指定的数据库不存在，在导入的过程中会创建对应的数据库。
    
    - 指定的数据库已存在，且该数据库的"hive.repl.ckpt.key"属性值与导入的路径一致，则跳过导入操作。
    
    - 指定的数据库已存在，但是该数据库下不存在任何表和functions，导入的过程中只将源数据库下的表导入到当前数据库中；如果该数据库下存在表或functions会导入失败。
    
    
    
    
**验证操作：**
导入完成后，可通过以下方式验证导入是否成功：
1. 在目标集群的beeline中执行以下命令确认目标数据库已创建。
   ```
   show databases;
   ```
   
2. 切换到目标数据库。
   ```
   use load_db;
   ```
   
3. 确认表已导入。
   ```
   show tables;
   ```
   
4. 查询数据，确认数据已正确导入。
   ```
   select * from test;
   ```
   
 
#### 常见问题
- **导出命令执行失败**
  导出命令执行失败的常见原因包括：用户权限不足、导出目录不存在或无写入权限、数据库包含不支持的表类型（如加密表、Hudi表等）。
  请确认用户具有Repl Dump权限。检查导出目录是否存在且有写入权限。确认导出的数据库不包含加密表、HBase外部表、Hudi表、视图表及物化视图表等不支持的表类型。
  
- **导入命令执行失败**
  导入命令执行失败的常见原因包括：目标数据库已存在且包含表或functions、跨集群互信未配置、HDFS路径不正确等。
  如果目标数据库已存在且包含表或functions，请先清空数据库或指定新的数据库名称。确认跨集群互信已正确配置。检查HDFS路径是否正确且可访问。
  
- **如何删除设置了复制策略的数据库**
  设置了复制策略源的数据库无法直接删除，需要先清除复制策略源设置。
  执行以下命令将数据库的复制策略源设置为空，然后再删除数据库：
  ```
  alter database dump_db set dbproperties ('repl.source.for'=''); 
  drop database dump_db;
  ```
  
 
#### 相关文档
- 了解Hive数据操作，请参考[Hive客户端使用实践](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0952.html)。
- 了解如何创建Hive用户并绑定角色，请参考[创建Hive用户并绑定角色](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_0949.html)。
- 了解Hive常见问题，请参考[Hive常见问题](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_1752.html)。
 
