
# 通过mongoexport和mongoimport工具迁移数据
#### 操作场景
mongoexport和mongoimport是MongoDB客户端自带的备份恢复工具。您可以在本地设备或ECS中安装MongoDB客户端，通过mongoexport和mongoimport工具将自建MongoDB数据库或其他云数据库MongoDB迁移至华为云DDS实例。
要将已有的MongoDB数据库迁移到文档数据库，需要先使用mongoexport工具对它做转储。再通过弹性云服务器或可访问文档数据库的设备，使用mongoimport工具将转储文件导入到文档数据库服务。
#### 使用须知
- mongoexport和mongoimport工具仅支持全量数据迁移。为保障数据一致性，迁移操作开始前请停止源数据库的相关业务，并停止数据写入。
- 建议您尽量选择在业务低峰期迁移数据，避免在迁移过程中对业务造成影响。
- 不支持迁移系统库admin和local。
- 确保源库中系统库admin和local没有创建业务集合，如果已经有业务集合，必须在迁移前将这些业务集合从admin和local库中迁移出来。
- 导入数据之前，确保源端有必要的索引，即在迁移前删除不需要的索引，创建好必要的索引。
- 如果选择迁移分片集群，必须在目标库创建好要分片的集合，并配置数据分片。同时，迁移前必须要创建好索引。
 
#### 前提条件
1. 准备弹性云服务器或可访问文档数据库的设备。
   - 通过内网连接文档数据库实例，需要创建并登录弹性云服务器，请参见[购买弹性云服务器](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)和[登录弹性云服务器](https://support.huaweicloud.com/ecs_faq/ecs_faq_0632.html)。
   
   - 通过公网地址连接文档数据库实例，需具备以下条件。
     1. 为实例中的节点绑定公网地址，如何绑定公网地址，请参见《文档数据库服务用户指南》通过公网连接实例下"绑定弹性公网IP"或"绑定公网网关"的内容。
     
     2. 保证本地设备可以访问文档数据库绑定的公网地址。
      
    
2. 在已准备的弹性云服务器或可访问文档数据库的设备上，安装数据迁移工具。 安装数据迁移工具，请参见[安装MongoDB迁移工具](https://www.mongodb.com/try/download/database-tools)。
   
 
#### 操作步骤
- [导出源库数据]
  
  1. 登录到已准备的弹性云服务器或可访问源数据库的设备。
  
  2. 使用mongoexport，将源数据库转储至JSON文件。 
     此处以SSL连接方式为例进行说明，如果选择普通连接方式，去掉命令中对应的"--ssl --sslAllowInvalidCertificates"即可。
     ./**mongoexport** **--host** *\<* *DB_ADDRESS\>* ***--*port** *\<DB_PORT\>* ***--*ssl** **--sslAllowInvalidCertificates** **--type json** **--authenticationDatabase** *\<AUTH_DB* \> **-u** *\<DB_USER\>* **--db** \<*DB_NAME* \> **--collection** \<*DB_COLLECTION* \> **--out** \<*DB_PATH*\>
     - DB_ADDRESS为数据库地址。
     
     - DB_PORT为数据库端口。
     
     - AUTH_DB为存储DB_USER信息的数据库，一般为admin。
     
     - DB_USER为数据库用户。
     
     - DB_NAME为要迁移的数据库名称。
     
     - DB_COLLECTION为要迁移的数据库集合。
     
     - DB_PATH为存储数据JSON文件所在的路径。
     
     
     出现如下提示时，输入数据库管理员对应的密码：
     ```
     Enter password:
     ```
     示例如下，命令执行完会生成"exportfile.json"文件：
     **./mongoexport --host 192.168.1.21 --port 8635 --ssl --sslAllowInvalidCertificates --type json --authenticationDatabase admin -u rwuser --db test02 --collection Test --out /tmp/mongodb/export/exportfile.json**
     
     
  
  3. 查看导出结果。 
     输出内容显示如下，说明迁移成功。其中，"x"表示转储数据的记录条数。
     ```
     exported x records
     ```
     
     
  
  4. 压缩导出的JSON文件。 
     **gzip exportfile.json**
     压缩是为了方便网络传输，压缩后生成"exportfile.json.gz"文件。
     
     
   
- [将数据导入至目标DDS]
  
  1. 登录到已准备的弹性云服务器或可访问文档数据库的设备。
  
  2. 将要导入的数据上传到弹性云服务器或可访问文档数据库的设备。 
     根据不同的平台选择相应的上传方法。
     - Linux下可参考命令： scp *\<* *IDENTITY_FILE\>* *\<REMOTE_USER\>* @*\<REMOTE_ADDRESS\>* :*\<REMOTE_DIR\>*
       - IDENTITY_FILE为存储"exportfile.json.gz"的文件目录，该文件目录权限为600。
       
       - REMOTE_USER为弹性云服务器的操作系统用户。
       
       - REMOTE_ADDRESS为弹性云服务器的主机地址。
       
       - REMOTE_DIR为将"exportfile.json.gz"上传到弹性云服务器的文件目录。
        
     
     - Windows平台下，请使用传输工具上传"exportfile.json.gz"至弹性云服务器。
     
     
     
     
  
  3. 解压数据包。 
     **gzip** **-d** *exportfile.json.gz*
     
     
  
  4. 将转储文件导入到文档数据库。 
     此处以SSL连接方式为例进行说明，如果选择普通连接方式，去掉命令中对应的"--ssl --sslAllowInvalidCertificates"即可。
     ./**mongoimport --host** \<*DB_ADDRESS* \> **--port** \<*DB_PORT* \> **--ssl --sslAllowInvalidCertificates --type json --authenticationDatabase** \<*AUTH_DB* \> **-u** \<*DB_USER* \> **--db** \<*DB_NAME* \> **--collection** \<*DB_COLLECTION* \> **--file** \<*DB_PATH*\>
     - DB_ADDRESS为数据库实例的IP地址。
     
     - DB_PORT为数据库端口。
     
     - AUTH_DB为DB_USER进行权限验证的数据库，一般为admin。
     
     - DB_USER为数据库管理员账号名。
     
     - DB_NAME为要导入的数据库。
     
     - DB_COLLECTION为要导入的数据库中的集合。
     
     - DB_PATH为转储数据JSON文件所在的路径。
     
     
     出现如下提示时，输入数据库管理员对应的密码：
     ```
     Enter password:
     ```
     示例如下：
     **./mongoimport --host 192.168.1.21 --port 8635 --ssl --sslAllowInvalidCertificates --type json --authenticationDatabase admin -u rwuser --db test02 --collection Test --file /tmp/mongodb/export/exportfile.json**
     
     
  
  5. 查看迁移结果。 
     输出内容显示如下，说明迁移成功。其中，"x"表示转储数据的记录条数。
     ```
     imported x records
     ```
     
     
   
#### 相关文档
[如何安装MongoDB客户端](https://support.huaweicloud.com/dds_faq/dds_faq_0018.html)
