DRS迁移过程一般包含四个阶段:任务启动阶段、全量阶段、增量阶段、结束任务阶段(单全量任务则包含三个阶段)。为了确保迁移各个阶段的平顺,DRS在任务正式启动前,会对任务源数据库、目标数据库中的参数、对象等信息进行自动化的扫描和检测,帮助您提高数据迁移的成功率,常见的预检查项清单如下所示。
概览
根据迁移任务的源数据库类型,查看预检查信息:
源数据库为MySQL的迁移链路预检查一览表:
− MySQL->MySQL
− MySQL->DRDS
− MySQL->TaurusDB
源数据库为MySQL分库分表的迁移链路预检查一览表:
− MySQL分库分表->DRDS
源数据库为MongoDB的迁移链路预检查一览表:
− MongoDB->DDS
源数据库为DDS的迁移链路预检查一览表:
− DDS->MongoDB
MySQL->MySQL
表 预检查一览表
| 分类 | 预检查项 | 检查项详情 |
|---|---|---|
| 权限类 | 源数据库权限 |
SELECT、SHOW VIEW、EVENT。
SELECT、SHOW VIEW、EVENT、LOCK TABLES、REPLICATION SLAVE、REPLICATION CLIENT。
|
| 目标数据库权限 |
SELECT、CREATE、ALTER、DROP、DELETE、INSERT、UPDATE、INDEX、EVENT、CREATE VIEW、CREATE ROUTINE、TRIGGER、REFERENCES、WITH GRANT OPTION。当目标库为8.0.14-8.0.18版本时,还需要有SESSION_VARIABLES_ADMIN权限。
| |
| 版本类 | 源数据库版本 | 支持5.5、5.6、5.7、8.0版本。 |
| 目标数据库版本 | 支持5.5、5.6、5.7、8.0版本。 | |
| 迁移版本检查 | 仅支持目标数据库版本等于或高于源数据库版本。 | |
| 参数类 | GTID状态 | 源数据库GTID状态建议为开启状态,源数据库实例没有开启GTID的情况下不支持主备倒换,DRS任务会因为位点不续接而中断导致无法恢复。 |
| 性能参数 | 源数据库建议开启skip-name-resolve,减少连接超时的可能性。 | |
| 源数据库log_slave_updates参数需设置为开启状态,否则会导致迁移失败。 | ||
| 源数据库的binlog_row_image参数需设置为full,否则会导致迁移失败。 | ||
| 最大允许传输包的大小 | DRS在迁移数据量大或迁移大字段情况下,源库max_allowed_packet参数过小可能会导致任务失败。 | |
| DRS在迁移数据量大或迁移大字段情况下,目标库的max_allowed_packet参数值过小导致目标库数据无法写入造成全量迁移失败。 | ||
| sql_mode取值检查 | 迁移的对象中包含引擎为MyISAM的表,则目标数据库sql_mode不能包含no_engine_substitution参数,否则可能会导致迁移失败。 | |
| 增量迁移类 | Binlog开启 | 增量迁移时,源数据库的Binlog日志必须打开,且Binlog日志格式必须为Row格式。 |
| Binlog保留时长 | 在磁盘空间允许的情况下,建议源数据库Binlog保存时间越长越好,建议为3天,设置为0,可能会导致迁移失败。
| |
| server_id值设置 | 增量迁移时,必须设置MySQL源数据库的server_id。
| |
| session变量设置 | 增量迁移时,如果设置session变量character_set_client为binary,可能导致乱码。 | |
| 目标数据库检查 | 磁盘空间检查 | 目标数据库实例必须有足够的磁盘空间。 |
| 状态检查 | 目标数据库实例的状态必须正常。 | |
| 一致性检查 | 字符集 | 目标库和源库的字符集需要一致。 |
| 字符序 | 目标库和源库的collation_server需要一致。 | |
| 时区 | 目标库和源库的time_zone需要一致。 | |
| 大小写敏感 | 目标库和源库的lower_case_table_names参数设置需要一致。 | |
| 事务隔离级别 | 目标库和源库事务隔离级别需要一致。 | |
| group_concat函数计算结果字符的最大长度 | 目标库和源库的group_concat_max_len参数需要一致 | |
| server_uuid参数 | 目标库和源库server_uuid参数不能相同。 | |
| InnoDB检查模式 | 目标库和源库innodb_strict_mode需要一致。 | |
| 数据块加密参数 | 目标库和源库block_encryption_mode需要一致。 | |
| SQL模式 | 目标库和源库sql_mode需要一致。 | |
| 迁移对象类 | 选择对象检查 |
|
| 无主键表检查 | 由于无主键表的性能低于主键表的性能,建议将无主键表修改为主键表。 | |
| 关联对象检查 | 相互关联的数据对象要确保同时迁移,避免迁移因关联对象缺失,导致迁移失败。 | |
| 外键引用操作检查 | 不支持外键级联操作。当外键是普通索引的时候,可能会导致表结构创建失败,建议改成唯一索引。 | |
| 同名检查 | 除了MySQL系统数据库之外,目标数据库不能包含与源数据库同名的数据库。 | |
| 表名规范检查 |
| |
| 加密表检查 | 当源库存在加密的表,需要确认目标库是否支持。如果目标库不支持,存在任务失败等风险。 |
MySQL->DRDS
表 预检查一览表
| 分类 | 预检查项 | 检查项详情 |
|---|---|---|
| 权限类 | 源数据库权限 |
SELECT、SHOW VIEW、EVENT。
SELECT、SHOW VIEW、EVENT、LOCK TABLES、REPLICATION SLAVE、REPLICATION CLIENT。 |
| 目标数据库权限 |
| |
| 版本类 | 源数据库版本 | 支持5.5、5.6、5.7、8.0版本。 |
| 目标数据库版本 | DRDS实例版本。 | |
| 参数类 | GTID状态 | 源数据库GTID状态建议为开启状态,源数据库实例没有开启GTID的情况下不支持主备倒换,DRS任务会因为位点不续接而中断导致无法恢复。 |
| 性能参数 | 源数据库建议开启skip-name-resolve,减少连接超时的可能性。 | |
| 源数据库log_slave_updates参数需设置为开启状态,否则会导致迁移失败。 | ||
| 源数据库的binlog_row_image参数需设置为full,否则会导致迁移失败。 | ||
| 最大允许传输包的大小 | DRS在迁移数据量大或迁移大字段情况下,源库max_allowed_packet参数过小可能会导致任务失败。 | |
| DRS在迁移数据量大或迁移大字段情况下,目标库的max_allowed_packet参数值过小导致目标库数据无法写入造成全量迁移失败。 | ||
| sql_mode取值检查 | 迁移的对象中包含引擎为MyISAM的表,则目标数据库sql_mode不能包含no_engine_substitution参数,否则可能会导致迁移失败。 | |
| 增量迁移类 | Binlog开启 | 增量迁移时,源数据库的Binlog日志必须打开,且Binlog日志格式必须为Row格式。 |
| Binlog保留时长 | 在磁盘空间允许的情况下,建议源数据库Binlog保存时间越长越好,建议为3天,设置为0,可能会导致迁移失败。
| |
| server_id值设置 | 增量迁移时,必须设置MySQL源数据库的server_id。
| |
| session变量设置 | 增量迁移时,如果设置session变量character_set_client为binary,可能导致乱码。 | |
| 目标数据库检查 | 磁盘空间检查 | 目标数据库实例必须有足够的磁盘空间。 |
| 状态检查 | 目标数据库实例状态必须正常。 | |
| 参数auto_increment校验 | 目标数据库存在表的auto_increment值至少不能小于源库表的auto_increment值。 | |
| 一致性检查 | 字符集 | 目标库和源库的字符集需要一致。 |
| 字符序 | 目标库和源库的collation_server需要一致。 | |
| 时区 | 目标库和源库的time_zone需要一致。 | |
| 大小写敏感 | 目标库和源库的lower_case_table_names参数设置需要一致。 | |
| 事务隔离级别 | 目标库和源库事务隔离级别需要一致。 | |
| group_concat函数计算结果字符的最大长度 | 目标库和源库的group_concat_max_len参数需要一致 | |
| server_uuid参数 | 目标库和源库server_uuid参数不能相同。 | |
| InnoDB检查模式 | 目标库和源库innodb_strict_mode需要一致。 | |
| 数据块加密参数 | 目标库和源库block_encryption_mode需要一致。 | |
| SQL模式 | 目标库和源库sql_mode需要一致。 | |
| 表结构 |
| |
| 迁移对象类 | 选择对象检查 |
|
| 无主键表检查 | 由于无主键表的性能低于主键表的性能,建议将无主键表修改为主键表。 | |
| 关联对象检查 | 相互关联的数据对象要确保同时迁移,避免迁移因关联对象缺失,导致迁移失败。 | |
| 外键引用操作检查 | 不支持外键级联操作。当外键是普通索引的时候,可能会导致表结构创建失败,建议改成唯一索引。 | |
| 表名规范检查 |
| |
| 加密表检查 | 当源库存在加密的表,需要确认目标库是否支持。如果目标库不支持,存在任务失败等风险。 |
MongoDB->DDS
表 预检查一览表
| 分类 | 预检查项 | 检查项详情 |
|---|---|---|
| 权限类 | 源数据库权限 |
− 副本集:连接源数据库的用户需要有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权限。 | |
| 版本类 | 源数据库版本 | 支持3.2、3.4、3.6、4.0、4.2、4.4版本。 |
| 目标数据库版本 | 支持3.4、4.0、4.2、4.4版本。 | |
| 迁移版本检查 | 仅支持目标数据库版本等于或高于源数据库版本。 | |
| 增量迁移类 | Oplog开启 | 增量迁移时,源数据库的Oplog日志必须打开。 |
| Oplog保留时长 | 在磁盘空间允许的情况下,建议源数据库Oplog保存时间越长越好,建议为3天。 | |
| Balancer关闭 | 如果迁移任务是源数据集群的增量,则源数据必须关闭Balancer。 | |
| 孤儿文档检查 | 如果是源数据为集群的全量+增量迁移任务,则源数据库必须关闭Balancer并清理孤儿文档。 | |
| 目标数据库检查 | 磁盘空间检查 | 目标数据库实例必须有足够的磁盘空间。 |
| 集群到集群的全量迁移,如果源数据库的集群没有开启分片,则需要保证目标数据库主shard节点的磁盘空间大于源数据库数据大小。 | ||
| 状态检查 | 目标数据库实例状态必须正常。 | |
| chunk数目检查 | 检查目标数据库的最大chunk数目是否足以支撑源库数据的分片分裂,当chunk个数达到目标库的最大支撑数目时,chunk不再分裂,会影响写入性能。 | |
| 一致性检查 | 固定集合检查 | 检查源库和目标库数据库固定集合是否一致,若不一致,则导致迁移失败。 |
| 迁移对象类 | 关联对象检查 | 相互关联的数据对象要确保同时迁移,避免迁移因关联对象缺失,导致迁移失败。 |
| 角色依赖检查 | 在进行用户迁移时,若所选迁移的用户与某些角色存在依赖关系,需要同时选择迁移该用户及所依赖的角色,否则会导致迁移失败。 | |
| 账号依赖检查 | 在进行用户迁移时,若所选迁移的用户与某些角色存在依赖关系,需要同时选择迁移该用户及所依赖的角色,否则会导致迁移失败。 | |
| 同名检查 | 目标数据库不能存在与源数据库同名的数据库下的同名非空集合。 | |
| 目标数据库不能存在和源数据库同名数据库下的同名视图。 | ||
| 名称检查 | 源数据库的库名不能包含/\."$和空格,集合名和视图名中不能包含$字符或以system.开头。 | |
| 复合哈希索引检查 |
| |
| 复合哈希分片键检查 | ||
| 索引检查 | 源库若存在没有索引(_id)的集合,可能导致迁移失败。 | |
| TTL索引检查 | TTL索引会因为源数据库和目标库数据的时区,时钟不一致导致迁移后数据不一致。 | |
| 索引个数检查 | 索引的个数会影响整个迁移的时间,检查源数据库是否存在索引个数大于10的集合,若存在会影响迁移速度。 |