在您成功部署兼容MongoDB语法的PolarDB PostgreSQL轻量版集群后,下一步是将现有MongoDB数据库中的数据迁移过来。本文将提供在线热迁移和离线恢复两种方法,您可以根据业务场景选择最合适的方案。
选择迁移方法
PolarDB提供dsync工具(在线迁移)和mongorestore工具(离线恢复)两种方式。请参考下表,根据您的业务对停机时间的要求、数据量和操作复杂度来选择最适合的迁移方案。
| 对比项 | dsync在线迁移 | mongorestore离线恢复 | 
| 迁移类型 | 在线热迁移(全量+增量同步) | 离线冷迁移(基于备份的时间点恢复) | 
| 业务停机时间 | 分钟级。仅在最后切换时需要短暂中断业务写入。 | 小时级或更长。停机时间等于备份和恢复所需的总时长。 | 
| 数据一致性 | 高。可同步至切换前的最后一秒数据,无数据丢失。 | 时间点一致。恢复后,备份时间点之后产生的新数据会丢失。 | 
| 核心优势 | 最大限度减少业务中断,适合生产系统平滑迁移。 | 操作简单直接,适合开发、测试环境或可接受停机的场景。 | 
| 源库要求 | 需为主备架构。 | 无特殊要求,能执行 | 
| 推荐场景 | 
 | 
 | 
结论:对于需要保障业务连续性的生产系统,推荐使用方法一(dsync在线迁移)。对于其他场景,方法二(mongorestore)是一个更简单直接的选择。
使用dsync工具进行在线迁移
dsync是一款高效的数据同步工具,它能够实现从源MongoDB到目标PolarDB PostgreSQL轻量版集群的全量数据迁移和增量数据同步。整个过程自动化进行,可以最大限度地减少业务停机时间。
前提条件
在开始迁移前,请确保您的环境满足以下条件:
- 源MongoDB实例 - 实例处于主备模式。 
- 用于数据同步的连接点必须是主节点(PRIMARY)。您可以通过 - mongosh连接到源实例后,执行- rs.status()命令来确认,并检查返回结果中连接节点的- stateStr字段值。
- 准备一个具有 - root或- readAnyDatabase权限的数据库账户,用于- dsync读取数据。
 
- 目标PolarDB PostgreSQL轻量版集群 - 已成功部署兼容MongoDB语法的集群。如果您尚未部署,请参考安装部署(兼容MongoDB语法)。 
- 准备好目标集群的MongoDB协议连接串和高权限账户(例如,安装时创建的 - admin账户)。
 
- 安装 - dsync工具- 请提交工单联系我们以获取 - dsync工具的RPM压缩包。
- 解压后,使用 - root权限执行以下命令进行安装:- sudo rpm -ivh t-polardb-pg-dsync-xxx.an8.x86_64.rpm
- 执行以下命令验证安装是否成功。 - 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
 
操作步骤
步骤一:优化目标集群配置
为了提升全量数据导入的性能,建议在迁移前调整目标集群的写入批处理大小。
- 连接到目标PolarDB PostgreSQL轻量版集群。 - # 将 localhost 替换为您的数据库主机IP PGPASSWORD=postgres /u01/polardb_pg/bin/psql -h localhost -p 1523 -U admin -d admin_db说明- 您可以通过查看配置文件 - postgresql.conf中的- port参数来确认数据库的PostgreSQL协议端口。
- 执行以下SQL命令,修改参数并使其生效。请确保使用具有 - superuser权限的账户(如- admin)执行。- ALTER SYSTEM SET documentdb.maxWriteBatchSize=100000; SELECT pg_reload_conf();
- 执行 - SHOW documentdb.maxWriteBatchSize;命令,确认返回值为- 100000。
步骤二:启动dsync并开始迁移
dsync工具通过环境变量配置源和目标数据库的连接信息,启动后将自动执行全量和增量同步。
- 设置环境变量,配置源和目标数据库的连接串(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- 源库账户,需具备 - root或- readAnyDatabase权限。- 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'
- 启动 - 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会话中断导致迁移任务意外终止,强烈建议在 - tmux或- screen等终端会话管理器中运行- 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启动后,您将在终端看到一个实时更新的进度报告,它会自动经历以下两个阶段:
- 全量同步(InitialSync) - 此阶段会复制源数据库中的所有存量数据。您可以看到每个集合(Collection)的同步进度。  
- 增量同步(Change Stream) 全量同步完成后, - dsync会自动进入增量同步阶段,持续捕获并应用源数据库中发生的数据变更(增、删、改)。 
步骤四:(可选)数据校验
在准备进行业务切换前,您可以执行数据校验以确保源库和目标库的数据完全一致。
- 数据校验需要在源数据库停止写入后进行。 
- 校验过程会扫描全表,消耗大量资源。作为一种轻量级校验,您可以先通过 - db.collection.countDocuments()命令快速比对两侧的文档数量。
要执行全量数据校验,请先停止(Ctrl + C)正在运行的dsync进程,然后使用--verify参数重新启动:
# --verify 表示全量数据校验,注意校验命令需单独执行
./dsync --verify --progress --logfile dsync.log "$MDB_SRC" "$FERRETDB_DEST"如果所有集合的校验结果均为OK,则表示数据完全一致。
步骤五:业务切换(Cutover)
当您确认数据同步完成并校验无误后,即可进行最后的业务切换。
- 停止向源MongoDB实例写入数据(即停写业务应用)。 
- 观察 - dsync的增量同步界面,当- Change Stream Events计数不再增长时,表示所有变更已同步至目标库。
- 按下 - Ctrl + C停止- dsync进程。重要- 在 - dsync进程完全退出之前,请勿关闭源MongoDB实例,否则可能导致同步状态丢失或报错。
- 将您的应用程序的数据库连接配置修改为目标PolarDB PostgreSQL轻量版集群的连接串。 
- 启动业务应用,完成迁移。 
使用mongorestore进行离线恢复
如果您的场景是基于备份文件进行数据恢复,可以使用MongoDB官方的mongorestore工具。此方法为离线操作。
- 准备好通过 - mongodump创建的备份文件目录。
- 执行以下命令将数据恢复到目标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参数中直接提供密码存在安全风险。建议省略密码,并通过交互式提示输入,以避免密码泄露。