在您成功部署兼容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
下的collectionnew_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
参数中直接提供密码存在安全风险。建议省略密码,并通过交互式提示输入,以避免密码泄露。