
# 通过mongodump和mongorestore工具迁移数据
mongodump和mongorestore是MongoDB客户端自带的备份恢复工具。您可以在本地设备或ECS中安装MongoDB客户端，通过mongodump和mongorestore工具将自建MongoDB数据库或其他云数据库MongoDB迁移至华为云GeminiDB Mongo 实例。
#### 使用须知
- mongodump和mongorestore工具仅支持全量数据迁移。为保障数据一致性，迁移操作开始前请停止源数据库的相关业务，并停止数据写入。
- 建议您尽量选择在业务低峰期迁移数据，避免在迁移过程中对业务造成影响。
- 不支持迁移系统库admin和local。
- 确保源库中系统库admin和local没有创建业务集合，如果已经有业务集合，必须在迁移前将这些业务集合从admin和local库中迁移出来。
- 导入数据之前，确保源端有必要的索引，即在迁移前删除不需要的索引，创建好必要的索引。
- 如果选择迁移分片集群，必须在目标库创建好要分片的集合，并配置数据分片。同时，迁移前必须要创建好索引。
- 如果使用mongodump工具备份失败（示例：备份进度至97%时报错），建议您尝试增大虚拟机磁盘空间，预留部分冗余空间，再重新执行备份。
- 客户侧使用的是rwuser账号，仅支持操作客户业务库表。所以，在使用时建议指定库和表，仅对业务数据执行导入导出。不指定库表，全量进行导入导出，可能会遇到权限不足的问题。
 
#### 前提条件
1. 准备弹性云服务器或可访问GeminiDB Mongo 的设备。
   - 通过内网连接GeminiDB Mongo 数据库实例，需要创建并登录弹性云服务器，请参见[购买弹性云服务器](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)和[登录弹性云服务器](https://support.huaweicloud.com/ecs_faq/ecs_faq_0632.html)。
   
   - 通过公网地址连接GeminiDB Mongo数据库实例，需具备以下条件。
     1. 为实例中的节点绑定公网地址，如何绑定公网地址，请参见[绑定或解绑公网网关地址](https://support.huaweicloud.com/mongoug-nosql/zh-cn_topic_0000002541471247.html)。
     
     2. 保证本地设备可以访问GeminiDB Mongo 数据库绑定的公网地址。
      
    
2. 在已准备的弹性云服务器或可访问GeminiDB Mongo 的设备上，安装数据迁移工具。 安装数据迁移工具，请参见[如何安装MongoDB客户端](https://support.huaweicloud.com/mongoug-nosql/mongo_faq_0023.html)。
   ![](https://support.huaweicloud.com/mongoug-nosql/public_sys-resources/note_3.0-zh-cn.png)
   - MongoDB客户端会自带mongodump和mongorestore工具。
   
   - MongoDB客户端版本须和实例相匹配，如果版本不匹配则会有兼容性问题出现。
     
 
#### 导出源库数据
1. 登录到已准备的弹性云服务器或可访问源数据库的设备。
2. 使用mongodump工具，备份源数据库中的数据。 
   - SSL命令格式： **./mongodump --host** *\<* *DB_HOST\>* **--port** *\<DB_PORT\>* **--authenticationDatabase** *\<AUTH_DB\>* **-u \<DB_USER\> --ssl --sslCAFile** \<*FILE_PATH* \> **-** **-sslAllowInvalidCertificates** **--db** \<*DB_NAME* \> **--collection** \<*DB_COLLECTION* \> **--gzip --archive=**\<Backup_directory\>
     
   
   - 非SSL命令格式： **./mongodump --host** *\<* *DB_HOST\>* **--port** *\<DB_PORT\>* **--authenticationDatabase** *\<AUTH_DB\>* **-u \<DB_USER\>** **--db** \<*DB_NAME* \> **--collection** \<*DB_COLLECTION* \> **--gzip --archive=**\<Backup_directory\>
     
   
   
   表1参数说明 
   | 参数               | 说明                              |
   |:---|:---|
   | DB_HOST          | 数据库地址。                          |
   | DB_PORT          | 数据库端口号。                         |
   | DB_USER          | 数据库用户名。                         |
   | AUTH_DB          | 存储*\<DB_USER\>*信息的数据库，一般为admin。 |
   | FILE_PATH        | 存放根证书的路径。                       |
   | DB_NAME          | 需要迁移的数据库名称。                     |
   | DB_COLLECTION    | 需要迁移的数据库中的集合。                   |
   | Backup_directory | 导出数据的存放路径，可以自定义路径。              |
      
   出现如下提示时，输入数据库管理员对应的密码：
   ```
   Enter password:
   ```
   示例如下：
   **./mongodump --host 192.168.xx.xx --port 8635 --authenticationDatabase admin -u rwuser** **--db** **test** **--collection** **usertable --gzip --archive=/tmp/usertable.tar.gz**
   ![](https://support.huaweicloud.com/mongoug-nosql/zh-cn_image_0000001241571641.png)
   
   
 
#### 将数据导入至目标GeminiDB Mongo
1. 登录到已准备的弹性云服务器或可访问GeminiDB Mongo 的设备。
2. 将要导入的数据上传到弹性云服务器或可访问GeminiDB Mongo 的设备。 
   根据不同的平台选择相应的上传方法。
   - Linux系统可参考如下命令： scp -r *\<* *IDENTITY_DIR\>* *\<REMOTE_USER\>* @*\<REMOTE_ADDRESS\>* :*\<REMOTE_DIR\>*
     表2参数说明 
     | 参数                    | 说明                                                          |
     |:---|:---|
     | *\<* *IDENTITY_DIR\>* | 备份文件夹所在的目录。                                                 |
     | *\<REMOTE_USER\>*     | [1]中的弹性云服务器的操作系统用户。 |
     | *\<REMOTE_ADDRESS\>*  | [1]中的弹性云服务器的主机地址。   |
     | *\<REMOTE_DIR\>*      | 待导入的目标弹性云服务器的文件目录。                                          |
        
     
   
   
   
   - Windows平台下，请使用传输工具上传备份目录至弹性云服务器。
   
   
   
   
3. 将备份的数据导入到GeminiDB Mongo 。 
   - SSL命令格式： **./mongorestore --host** *\<* *DB_HOST\>* ****--port**** *\<DB_PORT\>* **--authenticationDatabase** *\<AUTH_DB\>* **-u** *\<DB_USER\>* **--ssl --sslCAFile** \<*FILE_PATH* \> **-** **-sslAllowInvalidCertificates** **--db** \<*DB_NAME* \> **--collection** \<*DB_COLLECTION* \> **--gzip --archive=** *\<Backup_directory\>*
     
   
   - 非SSL命令格式： **./mongorestore --host** *\<* *DB_HOST\>* ****--port**** *\<DB_PORT\>* **--authenticationDatabase** *\<AUTH_DB\>* **-u** *\<DB_USER\>* **--db** \<*DB_NAME* \> **--collection** \<*DB_COLLECTION* \>**--gzip --archive=** *\<Backup_directory\>*
     
   
   
   表3参数说明 
   | 参数               | 说明                         |
   |:---|:---|
   | DB_HOST          | GeminiDB Mongo数据库地址。       |
   | DB_PORT          | GeminiDB Mongo数据库端口号。      |
   | AUTH_DB          | 数据库管理员进行权限验证的数据库，一般为admin。 |
   | DB_USER          | 数据库管理员账号名，默认为rwuser。       |
   | FILE_PATH        | 存放根证书的路径。                  |
   | DB_NAME          | 需要导入的数据库名称。                |
   | DB_COLLECTION    | 需要导入的数据库中的集合。              |
   | Backup_directory | 备份文件存储目录。                  |
      
   出现如下提示时，输入数据库管理员对应的密码：
   ```
   Enter password:
   ```
   示例如下：
   **./mongorestore --host 192.168.xx.xx --port 8635 --authenticationDatabase admin -u rwuser --db test --collection usertable --gzip --archive=/tmp/usertable.tar.gz**
   ![](https://support.huaweicloud.com/mongoug-nosql/zh-cn_image_0000001196815024.png)
   
   
 
#### 相关问题
在执行mongodump和mongorestore操作时，会对整个实例进行备份恢复，此时会出现权限验证失败。
- 问题原因 因为rwuser账户对实例上的admin库和config库权限受限，所以会出现权限验证失败。
  
- 解决方案： 明确指定用户业务相关库表，即可正常操作。
  
 
