
# 通过mongodump和mongorestore工具迁移数据
#### 操作场景
mongodump和mongorestore是MongoDB客户端自带的备份恢复工具。您可以在本地设备或ECS中安装MongoDB客户端，通过mongodump和mongorestore工具将自建MongoDB数据库或其他云数据库MongoDB迁移至华为云DDS实例。
#### 使用须知
- mongodump和mongorestore工具仅支持全量数据迁移。为保障数据一致性，迁移操作开始前请停止源数据库的相关业务，并停止数据写入。
- 建议您尽量选择在业务低峰期迁移数据，避免在迁移过程中对业务造成影响。
- 不支持迁移系统库admin和local。
- mongodump导出文件为BSON二进制文件，mongorestore使用mongodump导出的二进制备份文件将数据还原到实例中。
- 确保源库中系统库admin和local没有创建业务集合，如果已经有业务集合，必须在迁移前将这些业务集合从admin和local库中迁移出来。
- 导入数据之前，确保源端有必要的索引，即在迁移前删除不需要的索引，创建好必要的索引。
- 如果选择迁移分片集群，必须在目标库创建好要分片的集合，并配置数据分片。同时，迁移前必须要创建好索引。
- 如果使用mongodump工具备份失败（示例：备份进度至97%时报错），建议您尝试增大备份失败虚拟机的磁盘空间，预留部分冗余空间，再重新执行备份。
- 客户侧使用的是rwuser账号，仅支持操作客户业务库表。所以，在使用时建议指定库和表，仅对业务数据执行导入导出。不指定库表，全量进行导入导出，可能会遇到权限不足的问题。
- 如果需要恢复备份到本地自建数据库，请参见[恢复备份到本地自建数据库](https://support.huaweicloud.com/usermanual-dds/data_restore_local.html)。
 
#### 前提条件
1. 准备弹性云服务器或可访问DDS的设备。
   - 通过内网连接文档数据库实例，需要创建并登录弹性云服务器，请参见[购买弹性云服务器](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)和[登录弹性云服务器](https://support.huaweicloud.com/ecs_faq/ecs_faq_0632.html)。
   
   - 通过公网地址连接文档数据库实例，需具备以下条件。
     1. 为实例中的节点绑定公网地址，如何绑定公网地址，请参见《文档数据库服务用户指南》通过公网连接实例下"绑定弹性公网IP"或"绑定公网网关"的内容。
     
     2. 保证本地设备可以访问文档数据库绑定的公网地址。
      
    
2. 在已准备的弹性云服务器或可访问DDS的设备上，安装数据迁移工具。 安装数据迁移工具，请参见[安装MongoDB迁移工具](https://www.mongodb.com/try/download/database-tools)。
   ![](https://support.huaweicloud.com/usermanual-dds/public_sys-resources/note_3.0-zh-cn.png)
   - MongoDB客户端版本须和实例相匹配，若版本不匹配则会有兼容性问题出现。
     
 
#### 操作步骤
- [导出源库数据]
  
  1. 登录到已准备的弹性云服务器或可访问源数据库的设备。
  
  2. 使用mongodump工具，备份源数据库中的数据。 
     此处以SSL连接方式为例进行说明，如果选择普通连接方式，去掉命令中对应的"**--ssl --sslCAFile** \<*FILE_PATH* \> **-** **-sslAllowInvalidCertificates**"即可。
     **./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=** \<*备份文件的全目录的文件名称*\>
     表1参数说明 
     | 参数                  | 说明                              |
     |:---|:---|
     | *\<* *DB_HOST\>*    | 数据库地址。                          |
     | *\<DB_PORT\>*       | 数据库端口号。                         |
     | *\<DB_USER\>*       | 数据库用户名。                         |
     | *\<AUTH_DB\>*       | 存储*\<DB_USER\>*信息的数据库，一般为admin。 |
     | \<*FILE_PATH*\>     | 存放根证书的路径。                       |
     | \<*DB_NAME*\>       | 需要迁移的数据库名称。                     |
     | \<*DB_COLLECTION*\> | 需要迁移的数据库中的集合。                   |
        
     出现如下提示时，输入数据库管理员对应的密码：
     ```
     Enter password:
     ```
     示例如下，命令执行后，**archive** 指定的文件即为最终的备份文件，如下命令以**backup.tar.gz**为例。
     **./mongodump --host 192.168.** *xx* **.** *xx* **--port 8635 --authenticationDatabase admin -u rwuser --ssl --sslCAFile /tmp/ca.crt --sslAllowInvalidCertificates --db** **test --collection** **usertable --gzip --archive=** **backup.tar.gz**
     ```
     2019-03-04T18:42:10.687+0800    writing admin.system.users to
     2019-03-04T18:42:10.688+0800    done dumping admin.system.users (1 document)
     2019-03-04T18:42:10.688+0800    writing admin.system.roles to
     2019-03-04T18:42:10.690+0800    done dumping admin.system.roles (0 documents)
     2019-03-04T18:42:10.690+0800    writing admin.system.version to
     2019-03-04T18:42:10.691+0800    done dumping admin.system.version (2 documents)
     2019-03-04T18:42:10.691+0800    writing test.test_collection to
     2019-03-04T18:42:10.691+0800    writing admin.system.profile to
     2019-03-04T18:42:10.692+0800    done dumping admin.system.profile (4 documents)
     2019-03-04T18:42:10.695+0800    done dumping test.test_collection (198 documents)
     ```
     
     
   
- [将数据导入至目标DDS]
  
  1. 登录到已准备的弹性云服务器或可访问DDS的设备。
  
  2. 将要导入的数据上传到弹性云服务器或可访问DDS的设备。 
     根据不同的平台选择相应的上传方法。
     - Linux系统可参考如下命令： scp -r *\<* *IDENTITY_DIR\>* *\<REMOTE_USER\>* @*\<REMOTE_ADDRESS\>* :*\<REMOTE_DIR\>*
       表2参数说明 
       | 参数                    | 说明                                                 |
       |:---|:---|
       | *\<* *IDENTITY_DIR\>* | 备份文件夹所在的目录。                                        |
       | *\<REMOTE_USER\>*     | [1]中的弹性云服务器的操作系统用户。 |
       | *\<REMOTE_ADDRESS\>*  | [1]中的弹性云服务器的主机地址。   |
       | *\<REMOTE_DIR\>*      | 待导入的目标弹性云服务器的文件目录。                                 |
          
       
     
     
     
     - Windows平台下，请使用传输工具上传备份目录至弹性云服务器。
     
     
     
     
  
  3. 将备份的数据导入到DDS。 
     此处以SSL连接方式为例进行说明，如果选择普通连接方式，去掉命令中对应的"**--ssl --sslCAFile** \<*FILE_PATH* \> **-** **-sslAllowInvalidCertificates**"即可。
     **./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=** \<*备份文件的全目录的文件名称*\>
     表3参数说明 
     | 参数                  | 说明                                |
     |:---|:---|
     | *\<* *DB_HOST\>*    | DDS数据库地址。                         |
     | *\<DB_PORT\>*       | DDS数据库端口号。                        |
     | *\<AUTH_DB\>*       | *\<DB_USER\>*进行权限验证的数据库，一般为admin。 |
     | *\<DB_USER\>*       | 数据库管理员账号名，默认为rwuser。              |
     | \<*FILE_PATH*\>     | 存放根证书的路径。                         |
     | \<*DB_NAME*\>       | 需要迁移的数据库名称。                       |
     | \<*DB_COLLECTION*\> | 需要迁移的数据库中的集合。                     |
        
     出现如下提示时，输入数据库管理员对应的密码：
     ```
     Enter password:
     ```
     示例如下：
     **./mongorestore --host 192.168.** *xx.xx* **--port 8635 --authenticationDatabase admin -u rwuser --ssl --sslCAFile /tmp/ca.crt --sslAllowInvalidCertificates --db test --collection usertable --gzip --archive=backup.tar.gz**
     ```
     2019-03-05T14:19:43.240+0800    preparing collections to restore from
     2019-03-05T14:19:43.243+0800    reading metadata for test.test_collection from dump/test/test_collection.metadata.json
     2019-03-05T14:19:43.263+0800    restoring test.test_collection from dump/test/test_collection.bson
     2019-03-05T14:19:43.271+0800    restoring indexes for collection test.test_collection from metadata
     2019-03-05T14:19:43.273+0800    finished restoring test.test_collection (198 documents)
     2019-03-05T14:19:43.273+0800    restoring users from dump/admin/system.users.bson
     2019-03-05T14:19:43.305+0800    roles file 'dump/admin/system.roles.bson' is empty; skipping roles restoration
     2019-03-05T14:19:43.305+0800    restoring roles from dump/admin/system.roles.bson
     2019-03-05T14:19:43.333+0800    done
     ```
     
     
   
#### 相关问题
在执行mongodump和mongorestore操作时，会对整个实例进行备份恢复，此时会出现权限验证失败。
- 问题原因 因为rwuser账户对实例上的admin库和config库权限受限，所以会出现权限验证失败。
  
- 解决方案： 明确指定用户业务相关库表，即可正常操作。
  
 
