有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

通用问题

使用 DTS 进行数据迁移/同步,对源数据库有啥影响?

1. 对源数据库的数据内容无影响,源库可正常进行业务写入。DTS 进行数据迁移时,其实是复制了源数据库的一份数据,不会删除源数据库的内容,所以对源数据库的数据没有影响。
2. 对源数据库的性能有一定影响,影响主要在 CPU
DTS 在执行全量数据迁移/同步时,会将源库的全量数据全部读取一次,所以会增加源库自身的压力。
以源库为 MySQL,规格8核16G 为例,DTS 任务默认采用8线程并发,在网络无瓶颈的情况下,DTS 任务对源库的性能影响如下:
DTS 全量导出阶段:占用源库约18%-45%的 CPU,增加源库约40-60MB/s的查询压力,占用约8个活跃 session 连接数。
DTS 增量导出阶段:对源数据库基本无压力,只有一个连接实时监听源库的 binlog 日志。
3. 全量导出阶段源库的各连接详情。
3.1 (可选)分块阶段。源库表的预估行数小于200万行,不进行分块,大于200万行则需要分块,增加如下连接。分块阶段时间很短,所以对源库增加的连接也是在短时间内。
源库表的主键是整形类型,并且基本连续,会有类似如下的少量 SQL。
`SELECT MIN(`id`), MAX(`id`) FROM `db`.`table`
源库表的主键是字符串或者不连续的整形类型,会有类似如下 SQL。ORDER BY `id` limit语句会略微增加对源库的负载压力,DTS 默认使用3线程,同时会根据源数据库的规格调整,确保对源端的负载压力可控。
SELECT `id` FROM `db`.`table` WHERE `id` > `某个id` ORDER BY `id` limit 500000, 1
3.2 任务开始导出阶段会有1个线程查询系统表获取导出信息,会有类似如下 SQL。
SELECT TABLE_NAME, TABLE_TYPE, ENGINE, TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='db'

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE ABLE_SCHEMA='db' and TABLE_NAME='table' and CONSTRAINT_TYPE='PRIMARY KEY';
3.3 在结构导出阶段,会有导出线程数(默认8)的连接执行如下 SQL。
SELECT COLUMN_NAME, DATA_TYPE, COLUMN_TYPE, NUMERIC_PRECISION, NUMERIC_SCALE, CHARACTER_SET_NAME, COLUMN_DEFAULT, IS_NULLABLE from information_schema.COLUMNS " "where TABLE_SCHEMA='db' and TABLE_NAME='db';
3.4 数据导出阶段,会有导出线程数(默认8)的连接执行如下 SQL。
SELECT /*!40001 SQL_NO_CACHE */ column FROM db.table where id>= 'id' AND id < 'id';
3.5 无锁导出时,会有如下类似锁表 SQL,锁表只是为了获取无主键表的一致性位点,获取后即会解锁。
lock table xxx read
3.6 有锁导出时,会有类似如下 SQL 的全局锁。
flush table xxx with read lock

使用 DTS 进行数据迁移/同步,对目标数据库有啥影响?

1. 全量导入阶段,DTS 写入目标库时,对目标库的主要影响在 CPU 和 IOPS。
1.1 以源库为 MySQL,规格8核16G 为例,DTS 任务默认采用8线程并发,在网络无瓶颈的情况下,DTS 全量导入阶段对目标库的性能影响:占用目标库 CPU 约20%-49%,占用 IOPS 约1200-3100,占用小于8个活跃 session 连接数。
1.2 全量导入阶段目标库的连接详情。
有小于8个连接在批量创建结构。
有小于8个连接在批量写数据,类似如下语句:
insert into xxx (id,name,msg) values (xxx);
2. 增量导入阶段,DTS 会把源数据库 binlog 中的增量数据解析成 SQL,然后在目标数据库中执行,总连接数小于32个 session,具体如下:
DDL 会串行执行,执行 DDL 时,不会有其他 DML 执行。
DML 最多会有32个连接(都为短连接,超时时间30秒),其中 DML 只是简单的 insert、update、delete、replace 语句。

使用 DTS 进行数据迁移,目标库是否需要为空?

数据迁移到目标库时,可以选择整个实例迁移,也可以选择指定对象迁移。
整个实例迁移:要求目标数据库为空,需要先清空目标库,不为空系统校验不通过,无法发起任务。
指定对象迁移:选择指定的库、表等对象进行迁移,系统会校验源库和目标库是否有同名的库表,如果有,则会校验不通过,提示用户修改后再进行迁移任务。

DTS 是否支持源库使用只读实例进行迁移?

支持。源库为自建数据库的场景,在 DTS 连接源库的配置中,输入只读实例的 IP 即可;源库为腾讯云的云数据库实例的场景,仅订阅支持连接只读实例,需要提交工单申请。

DTS 是否支持源库使用备库进行迁移?

源库为自建数据库的场景,在 DTS 连接源库的配置中,输入备库的 IP 即可;源库为腾讯云数据库实例的场景,在 DTS 连接源库的配置中,只能选择实例 ID,无法连接备库。

数据迁移过程中源库是否支持写入?

支持,迁移过程中源库可以正常进行数据写入,但在结构迁移、全量迁移阶段不能对源库进行 DDL 操作,否则可能会导致任务失败。等到增量迁移阶段,DDL 和 DML 都可以正常操作。

数据迁移过程中目标库是否支持写入?

目标库不需要设置为只读,但是建议不要对目标库进行写入,如果在迁移过程中,用户同时向目标库写入,可能会导致最终源和目标的数据不一致。

DTS 是否支持两端都是线下库的迁移?

不支持,源端或者目标端必须有一个是腾讯云数据库。

DTS 是否支持两个不同腾讯云账号下的 TencentDB 实例之间的数据迁移?

支持,进行跨腾讯云账号下 TencentDB 实例间的迁移,需要以目标 TencentDB 实例所属的腾讯云账号登录 DTS。具体操作请参见 云数据库跨账号实例间迁移

DTS 是否支持同一个数据库实例内不同库表的迁移?

不支持,DTS 仅支持源库和目标库为不同的数据库实例之间的数据迁移,不支持源库和目标库为同一个数据库实例(同一个数据库实例内不同库表对象的迁移)。

同一个源端数据库是否支持配置多个 DTS 任务,往不同的云数据库实例上迁移?

支持,支持同一个源端迁移到多个目标端(任务可并行处理),也支持多个源端迁移到同一个目标端(需要等前一个任务进行到增量阶段才可发起新一个任务)。需要注意多个任务并行,可能会增加源端或者目标端的访问压力,影响迁移速率。如果您确定需要对同一个源端数据库创建多个任务,可以在创建第一个迁移任务后,通过操作更多 > 创建类似任务,快捷创建相同的任务。

DTS 是否支持定时自动迁移?

支持,您可以创建 DTS 后,在修改配置时将选择定时执行的选项,并配置定时迁移时间。

迁移过程中可以监控任务的进度吗?

可以,您可以在腾讯云 DTS 控制台 数据迁移页面查看迁移任务进度。

为什么数据增量迁移服务会有15天设置?

数据增量迁移服务目前使用的是就近代理服务器接入,通过内网专线降低了走公网的抖动问题,确保了数据传输的质量,15天的设置是为了能有效降低代理的服务器的连接压力,如果超过15天,现有阶段并不会进行强制断开,只是从合理使用迁移资源出发做了时间设置规定。

在迁移数据过程中,如何保障数据准确性?

DTS 内部采用腾讯云自研数据迁移架构,对传输链路进行实时的数据准确性校验,快速发现并纠正传输数据,保障传输数据可靠性。

数据校验为什么需要源数据库实例不为只读?

数据校验需要在源实例中创建新库 __tencentdb__,并在该库下写入 CheckSum 表,在该实例只读时将会跳过数据校验阶段。

DTS 数据迁移能指定库表进行迁移么?

可以,迁移对象可以选择整个实例,也可以选择指定库表对象。

数据迁移什么时候结束?

用户选择增量迁移时,任务长时间没有结束,有可能需要用户自己进行结束操作。
如果迁移类型选择结构迁移或者全量迁移,则任务完成后会自动结束,不需要用户手动结束。
如果迁移类型选择全量 + 增量迁移,则全量迁移完成后会自动进入增量数据同步阶段,增量数据同步不会自动结束,需要您手动单击完成结束增量数据同步。
请选择合适时间手动完成增量数据同步,并完成业务切换。
观察迁移阶段为增量同步,并显示无延迟状态,将源库停写几分钟。
目标与源库数据差距为0MB及目标与源库时间延迟为0秒时,手动完成增量同步。

为什么全量迁移前后数据的大小不一致?

因为源库和目标库的碎片空间不一样,源库可能存在一些空洞数据,因此全量迁移完成后目标库的表存储空间很可能会比源库的表存储空间小。建议用户迁移完成后使用 数据一致性校验 来核对源库和目标库内容是否一致。

DTS 数据传输服务,是否支持跨国数据库迁移?

支持,接入方式选择公网可以实现跨国数据传输。

DTS 迁移过程中任务异常中断,是否可以重新启动?

可以,用户在配置任务时,可以设置自动重试策略,在任务发生异常中断(如源库或者目标库短暂不可用,网络问题等),DTS 支持在设置的时间范围内进行自动重试,无需手动干预。

MySQL 常见问题

MySQL 迁移过程中是否会加锁?

MySQL 迁移过程中的加锁,指的是对源数据库加全局锁(FTWRL),选择全量数据迁移的场景中,才会涉及到加锁处理。
当前 DTS 在 MySQL/MariaDB//Percona/TDSQL-C MySQL/TDSQL MySQL/TDSQL TDStore 之间的数据迁移中,默认使用无锁迁移。无锁迁移指对源库不加全局锁(FTWRL),仅对无主键的表加表锁。

是否支持迁移无主键的表?

支持,但是建议用户选择有主键的表,无主键的表也可以发起任务,但是会造成以下影响:
迁移/同步无主键表,可能会导致数据重复。
无主键表在有 DML 操作时,容易导致数据同步延迟。
进行数据一致性校验的时候,无主键表将被跳过,不支持校验。
源数据库为阿里云 RDS,PolarDB 时,由于 RDS,PolarDB 在 Binlog 中为无主键或无非空唯一键的表加上附加主键列,但在表结构中不可见,可能会导致 DTS 无法识别,数据结果异常。

是否支持腾讯云 MySQL 单节点(原基础版)实例的迁移?

腾讯云 MySQL 单节点(原基础版)作为源可以使用公网模式迁移,不能使用内网模式。
暂不支持将腾讯云 MySQL 单节点(原基础版)作为迁移的目标实例。

对源库设置 binlog_format 为 row 之后,如何确保源库 binlog_format 格式立刻生效?

设置 binlog_format 为 row 后,需重置当前数据库上的所有业务连接(当源库在从机时,还需重置主从同步 SQL 线程),避免当前业务连接继续使用老格式写入。
在上述操作未结束之前,请不要创建或者启动迁移任务,避免产生数据不一致。

如果迁移的源实例里面有 Toku 引擎,迁移会有什么需要注意的?

如果源实例涉及了 Toku 引擎,我们会在迁移时默认转成 InnoDB,然后 Cluster Index 和 TokuDB 的压缩特性的表需要提前做处理,目前迁移不支持,另外对 Toku 引擎的 DDL 操作也是迁移不支持。

MySQL 数据迁移可以迁移用户权限吗?

支持,新版本 DTS 支持对用户的权限进行迁移,具体操作请参考 账号迁移