导入与迁移(兼容MongoDB语法)

在您成功部署兼容MongoDB语法的PolarDB PostgreSQL轻量版集群后,下一步是将现有MongoDB数据库中的数据迁移过来。本文将提供在线热迁移和离线恢复两种方法,您可以根据业务场景选择最合适的方案。

选择迁移方法

PolarDB提供dsync工具(在线迁移)和mongorestore工具(离线恢复)两种方式。请参考下表,根据您的业务对停机时间的要求、数据量和操作复杂度来选择最适合的迁移方案。

对比项

dsync在线迁移

mongorestore离线恢复

迁移类型

在线热迁移(全量+增量同步)

离线冷迁移(基于备份的时间点恢复)

业务停机时间

分钟级。仅在最后切换时需要短暂中断业务写入。

小时级或更长。停机时间等于备份和恢复所需的总时长。

数据一致性

高。可同步至切换前的最后一秒数据,无数据丢失。

时间点一致。恢复后,备份时间点之后产生的新数据会丢失。

核心优势

最大限度减少业务中断,适合生产系统平滑迁移。

操作简单直接,适合开发、测试环境或可接受停机的场景。

源库要求

需为主备架构。

无特殊要求,能执行mongodump即可。

推荐场景

  • 对业务连续性要求高的生产环境。

  • 需要迁移持续有写入的动态数据库。

  • 开发、测试环境的数据初始化。

  • 迁移静态数据或只读数据库。

  • 业务允许较长维护窗口的场景。

结论:对于需要保障业务连续性的生产系统,推荐使用方法一(dsync在线迁移)。对于其他场景,方法二(mongorestore)是一个更简单直接的选择。

使用dsync工具进行在线迁移

dsync是一款高效的数据同步工具,它能够实现从源MongoDB到目标PolarDB PostgreSQL轻量版集群的全量数据迁移和增量数据同步。整个过程自动化进行,可以最大限度地减少业务停机时间。

前提条件

在开始迁移前,请确保您的环境满足以下条件:

  • MongoDB实例

    1. 实例处于主备模式。

    2. 用于数据同步的连接点必须是主节点(PRIMARY)。您可以通过mongosh连接到源实例后,执行rs.status()命令来确认,并检查返回结果中连接节点的stateStr字段值。

    3. 准备一个具有rootreadAnyDatabase权限的数据库账户,用于dsync读取数据。

  • 目标PolarDB PostgreSQL轻量版集群

    1. 已成功部署兼容MongoDB语法的集群。如果您尚未部署,请参考安装部署(兼容MongoDB语法)

    2. 准备好目标集群的MongoDB协议连接串和高权限账户(例如,安装时创建的admin账户)。

  • 安装dsync工具

    1. 提交工单联系我们以获取dsync工具的RPM压缩包。

    2. 解压后,使用root权限执行以下命令进行安装:

      sudo rpm -ivh t-polardb-pg-dsync-xxx.an8.x86_64.rpm
    3. 执行以下命令验证安装是否成功。dsync默认安装在/u01/dsync/目录下。

      cd  /u01/dsync/
      ./dsync --version

      如果成功返回版本号,则表示安装成功。例如:

      dsync version 0.15-beta (git commit dsync version 0.15-beta (git commit dd1c8xxxx)
      dsync exited successfully

操作步骤

步骤一:优化目标集群配置

为了提升全量数据导入的性能,建议在迁移前调整目标集群的写入批处理大小。

  1. 连接到目标PolarDB PostgreSQL轻量版集群。

    # 将 localhost 替换为您的数据库主机IP
    PGPASSWORD=postgres /u01/polardb_pg/bin/psql -h localhost -p 1523 -U admin -d admin_db
    说明

    您可以通过查看配置文件postgresql.conf中的port参数来确认数据库的PostgreSQL协议端口。

  2. 执行以下SQL命令,修改参数并使其生效。请确保使用具有superuser权限的账户(如admin)执行。

    ALTER SYSTEM SET documentdb.maxWriteBatchSize=100000;
    SELECT pg_reload_conf();
  3. 执行SHOW documentdb.maxWriteBatchSize;命令,确认返回值为100000

步骤二:启动dsync并开始迁移

dsync工具通过环境变量配置源和目标数据库的连接信息,启动后将自动执行全量和增量同步。

  1. 设置环境变量,配置源和目标数据库的连接串(URI)。

    # 设置源MongoDB实例的连接串
    export MDB_SRC='mongodb://<src_username>:<src_password>@<src_ip>:<src_port>/<src_db>'
    # 设置目标PolarDB实例的连接串
    export FERRETDB_DEST='mongodb://<dest_username>:<dest_password>@<dest_ip>:<dest_port>/<dest_db>'

    参数说明

    参数

    说明

    src_username

    源库账户,需具备rootreadAnyDatabase权限。

    src_password

    源库密码。

    src_ip

    源库的主节点IP地址。

    src_port

    源库的端口。

    src_db

    需要迁移的源数据库名。

    dest_username

    目标库账户,可使用admin等高权限账户。

    dest_password

    目标库密码。

    dest_ip

    目标库的IP地址。

    dest_port

    目标库的MongoDB协议端口(默认为27030)。

    dest_db

    迁移到目标库的数据库名。

    示例

    export MDB_SRC='mongodb://readAnyDatabase:password123@127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.5.0'
    export FERRETDB_DEST='mongodb://test_user:superuser_20250530@127.0.0.1:27030/postgres'
  2. 启动dsync进程。建议使用--progress参数以可视化方式查看进度。

    ./dsync --progress --logfile dsync.log "$MDB_SRC" "$FERRETDB_DEST"

    参数说明

    字段

    说明

    样例

    Namespace

    表示迁移的每个collection。

    .ycsb.new_users:表示DB ycsb下的collection new_users

    Percent Complete

    表示完成进度。

    100%,表示全量同步已经全部完成。

    Tasks Completed

    表示全量迁移的切片任务情况。

    5/21,表示21个任务完成了5个。

    Docs Synced

    表示collections同步了多少行。

    282132,表示同步了282132行。

    Throughput

    表示吞吐:每秒同步了多少行。

    -

    说明

    为防止因SSH会话中断导致迁移任务意外终止,强烈建议在tmuxscreen等终端会话管理器中运行dsync命令。例如:

    tmux new -t mysession
    export MDB_SRC='mongodb://readAnyDatabase:password123@127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.5.0'
    export FERRETDB_DEST='mongodb://test_user:superuser_20250530@127.0.0.1:27030/postgres'
    ./dsync --progress --logfile dsync.log "$MDB_SRC" "$FERRETDB_DEST"

    假设已经通过tmux new -s mysession创建了,但窗口超时关闭了,可以通过tmux attach -t mysession命令重入。

步骤三:监控迁移进度

dsync启动后,您将在终端看到一个实时更新的进度报告,它会自动经历以下两个阶段:

  1. 全量同步(InitialSync)

    此阶段会复制源数据库中的所有存量数据。您可以看到每个集合(Collection)的同步进度。image.png

  2. 增量同步(Change Stream) 全量同步完成后,dsync会自动进入增量同步阶段,持续捕获并应用源数据库中发生的数据变更(增、删、改)。

    image.png

步骤四:(可选)数据校验

在准备进行业务切换前,您可以执行数据校验以确保源库和目标库的数据完全一致。

重要
  • 数据校验需要在源数据库停止写入后进行。

  • 校验过程会扫描全表,消耗大量资源。作为一种轻量级校验,您可以先通过db.collection.countDocuments()命令快速比对两侧的文档数量。

要执行全量数据校验,请先停止(Ctrl + C)正在运行的dsync进程,然后使用--verify参数重新启动:

# --verify 表示全量数据校验,注意校验命令需单独执行
./dsync --verify --progress --logfile dsync.log "$MDB_SRC" "$FERRETDB_DEST"

如果所有集合的校验结果均为OK,则表示数据完全一致。

步骤五:业务切换(Cutover)

当您确认数据同步完成并校验无误后,即可进行最后的业务切换。

  1. 停止向源MongoDB实例写入数据(即停写业务应用)。

  2. 观察dsync的增量同步界面,当Change Stream Events计数不再增长时,表示所有变更已同步至目标库。

  3. 按下Ctrl + C停止dsync进程。

    重要

    dsync进程完全退出之前,请勿关闭源MongoDB实例,否则可能导致同步状态丢失或报错。

  4. 将您的应用程序的数据库连接配置修改为目标PolarDB PostgreSQL轻量版集群的连接串。

  5. 启动业务应用,完成迁移。

使用mongorestore进行离线恢复

如果您的场景是基于备份文件进行数据恢复,可以使用MongoDB官方的mongorestore工具。此方法为离线操作。

  1. 准备好通过mongodump创建的备份文件目录。

  2. 执行以下命令将数据恢复到目标PolarDB PostgreSQL轻量版集群。

    mongorestore --uri="mongodb://<user>:<password>@<dest_ip>:<dest_port>/<dest_db>" /path/to/backup_dir/

    示例:

    mongorestore --uri="mongodb://admin:postgres@10.0.0.1:27030/ycsb" /root/ycsb/

    期望返回的最终信息如下所示,15 document(s)表示导入15行数据。

    ...
    2025-08-25T11:05:20.505+0800    15 document(s) restored successfully. 0 document(s) failed to restore.
    说明

    安全提示:在--uri参数中直接提供密码存在安全风险。建议省略密码,并通过交互式提示输入,以避免密码泄露。

常见问题

dsync迁移时需要手动在目标库创建集合(Collection)吗?

不需要。dsync会自动在目标库创建源数据库中的所有集合,并同步其索引和数据。

dsync迁移过程中,如果源库或目标库发生重启会怎么样?

  • 目标库重启:无影响。dsync会记录同步断点,待目标库恢复后,会自动从断点处继续同步,不会丢失数据。

  • 源库重启:dsync会尝试重连。如果源库停机时间过长,导致其oplog被覆盖,dsync将无法继续增量同步并退出。此时,您需要在源库恢复后,重新启动dsync进程进行迁移。