数据复制服务(Data Replication Service,简称DRS)支持在多种场景下,将源库数据迁移到目标文档数据库实例,最大限度允许迁移过程中业务继续对外提供使用,有效地将业务系统中断时间和业务影响最小化,完成数据库平滑迁移工作。
前提条件
使用数据复制服务进行数据迁移时,为了提高数据迁移的稳定性和安全性,请先阅读以确保数据库实例已满足迁移条件。
迁移场景
- 全量迁移
该模式为数据库一次性迁移,适用于可中断业务的数据库迁移场景,全量迁移将非系统数据库的全部数据库对象和数据一次性迁移至目标端数据库,包括:表、视图、存储过程等。选择 “全量迁移” 模式,建议停止对源数据库的操作,否则迁移过程中源数据库产生的新数据不会同步到目标数据库。
- 全量+增量迁移
该模式为数据库持续性迁移,适用于对业务中断敏感的场景,通过全量迁移过程中完成的目标端数据库的初始化后,增量迁移阶段通过解析日志等技术,将远端和目标端数据库保持数据持续一致。选择 “全量+增量” 迁移模式,增量迁移可以在全量迁移完成的基础上实现数据的持续同步,无需中断业务,实现迁移过程中源业务和数据库继续对外提供访问。
支持的源和目标数据库
表 支持的数据库
源数据库 | 目标数据库 |
---|---|
本地自建Mongo数据库(3.2、3.4、4.0版本 ECS自建Mongo数据库(3.2、3.4、4.0版本 其他云上Mongo数据库(3.2、3.4、4.0版本,不支持腾讯云3.2版本) DDS实例(3.4、4.0版本) |
DDS实例(3.4、4.0、4.2版本) 说明:仅支持目标库版本等于或高于源库版本。 |
支持的迁移对象范围
在使用DRS进行迁移时,不同类型的迁移任务,支持的迁移对象范围不同,详细情况可参考下表。 DRS会根据用户选择,在“预检查”阶段对迁移对象进行自动检查 。
支持的迁移对象
类型名称 | 使用须知 |
---|---|
迁移对象范围 | 迁移对象选择维度:支持选择表级、库级或实例级(全部迁移)。 支持的迁移对象: 相互关联的数据对象要确保同时迁移,避免迁移因关联对象缺失,导致迁移失败。常见的关联关系:视图引用集合、视图引用视图等。 副本集:目前只支持集合(包括验证器,是否是固定集合),索引和视图的迁移。− 集群:目前只支持集合(包括验证器,是否是固定集合),分片键,索引和视图的迁移。 单节点:目前只支持集合(包括验证器,是否是固定集合),索引和视图的迁移。− 只支持迁移用户数据和源数据库的账号信息,不支持迁移系统库(如local、admin、config等)和系统集合,如果业务数据在系统库下,则需要先将业务数据移动到用户数据库下,可以使用renameCollection命令进行移出。 不支持视图的创建语句中有正则表达式。 不支持_id字段没有索引的集合。 不支持BinData()的第一个参数为2。 不支持范围分片的情况下maxKey当主键。 支持迁移的对象有如下限制: 源数据库的库名不能包含/."和空格,集合名和视图名中不能包含字符或以system.开头。 |
数据库账号权限要求
在使用DRS进行迁移时,连接源库和目标库的数据库账号需要满足以下权限要求,才能启动实时迁移任务。不同类型的迁移任务,需要的账号权限也不同,详细可参考下表进行赋权。DRS会在“预检查”阶段对数据库账号权限进行自动检查,并给出处理建议。
- 建议创建单独用于DRS任务连接的数据库帐号,避免因为数据库帐号密码修改,导致的任务连接失败。
- 连接源和目标数据库的帐号密码修改后,请尽快修改DRS任务中的连接信息,避免任务连接失败后自动重试,导致数据库帐号被锁定影响使用。
表 数据库账号权限
类型名称 | 全量迁移 | 全量+增量迁移 |
---|---|---|
源数据库连接账号 | 副本集:连接源数据库的用户需要有admin库的readAnyDatabase权限。 单节点:连接源数据库的用户需要有admin库的readAnyDatabase权限。 集群:连接源数据库的用户需要有admin库的readAnyDatabase权限,有config库的read权限。 果需要迁移源数据库用户和角色信息,连接源数据库和目标库数据库的用户需要有admin数据库的系统表system.users、system.roles的read权限。 |
副本集:连接源数据库的用户需要有admin库的readAnyDatabase权限,有local库的read权限。 单节点:连接源数据库的用户需要有admin库的readAnyDatabase权限,有local库的read权限。 集群:连接源数据库mongos节点的用户需要有admin库的readAnyDatabase权限,有config库的read权限,连接源数据库分片节点的用户需要有admin库的readAnyDatabase权限,有local库的read权限。 如果需要迁移源数据库用户和角色信息,连接源数据库和目标库数据库的用户需要有admin数据库的系统表system.users、system.roles的read权限。 |
目标数据库连接账号 | 连接目标数据库的用户需要有admin库的dbAdminAnyDatabase权限,有目标数据库的readWrite权限。对于目标数据库是集群的实例,迁移账号还要有admin库的clusterManager权限。 | 连接目标数据库的用户需要有admin库的dbAdminAnyDatabase权限,有目标数据库的readWrite权限。对于目标数据库是集群的实例,迁移账号还要有admin库的clusterManager权限。 |
用户赋权参考语句:如连接源数据库的用户需要有admin库的readAnyDatabase权限和config库的read权限。
db.grantRolesToUser("用户名",[{role:"readAnyDatabase",db:"admin"}, {role:"read",db:"config"}])
迁移操作
具体的迁移操作请参考《数据复制服务最佳实践》中“MongoDB数据库迁移”章节。