有奖捉虫:云通信与企业服务文档专题,速来> HOT
本文介绍使用 DTS 数据迁移功能从 MariaDB 或者 Percona 迁移数据至腾讯云数据库 MySQL 的操作指导。
支持的源数据库部署类型如下:
自建 MariaDB、腾讯云数据库 MariaDB。
自建 Percona。
说明
腾讯云数据库 MariaDB 支持三种内核 MariaDB、Percona 和 MySQL,用户在使用时不需要区分哪种内核,如果源数据库为腾讯云 MariaDB,不论源数据库的内核是 MariaDB、Percona 还是 MySQL,在设置源数据库或目标数据库的类型时,都选择 MariaDB。

注意事项

DTS 在执行全量数据迁移时,会占用一定源端实例资源,可能会导致源实例负载上升,增加数据库自身压力。如果您的数据库配置过低,建议您在业务低峰期进行迁移。
默认采用无锁迁移来实现,迁移过程中对源库不加全局锁(FTWRL),仅对无主键的表加表锁,其他不加锁。
创建数据一致性校验 时,DTS 会使用执行迁移任务的账号在源库中写入系统库__tencentdb__,用于记录迁移任务过程中的数据对比信息。
为保证后续数据对比问题可定位,迁移任务结束后不会删除源库中的__tencentdb__
__tencentdb__系统库占用空间非常小,约为源库存储空间的千分之一到万分之一(例如源库为50GB,则__tencentdb__系统库约为5MB - 50MB) ,并且采用单线程,等待连接机制,所以对源库的性能几乎无影响,也不会抢占资源。

前提条件

源数据库和目标数据库符合迁移功能和版本要求,请参见 数据迁移支持的数据库 进行核对。
已完成 准备工作
源数据库需要具备的权限如下:
“整个实例”迁移:
CREATE USER '迁移帐号'@'%' IDENTIFIED BY '迁移密码';
GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT,REPLICATION SLAVE,SHOW DATABASES,SHOW VIEW,PROCESS ON *.* TO '迁移帐号'@'%';
//源端若为腾讯云 MariaDB 数据库,需要提交工单进行 RELOAD 授权,其他场景请用户参照代码授权
//如果选择迁移触发器和事件,需要同时授权 TRIGGER 和 EVENT 权限
GRANT ALL PRIVILEGES ON `__tencentdb__`.* TO '迁移帐号'@'%';
GRANT SELECT ON *.* TO '迁移帐号';
“指定对象”迁移:
CREATE USER '迁移帐号'@'%' IDENTIFIED BY '迁移密码';
GRANT RELOAD,LOCK TABLES,REPLICATION CLIENT,REPLICATION SLAVE,SHOW DATABASES,SHOW VIEW, PROCESS ON *.* TO '迁移帐号'@'%';
//源端若为腾讯云 MariaDB 数据库,需要提交工单进行 RELOAD 授权,其他场景请用户参照代码授权
//如果选择迁移触发器和事件,需要同时授权 TRIGGER 和 EVENT 权限
GRANT ALL PRIVILEGES ON `__tencentdb__`.* TO '迁移帐号'@'%';
GRANT SELECT ON `mysql`.* TO '迁移帐号'@'%';
GRANT SELECT ON 待迁移的库.* TO '迁移帐号';
源数据库为 MariaDB 10.5、10.6 版本时,还需要 SLAVE MONITOR 的权限才能执行 show slave status。
需要具备目标数据库的权限:ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE USER, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, PROCESS, REFERENCES, RELOAD, SELECT, SHOW DATABASES, SHOW VIEW, TRIGGER, UPDATE(如果目标库为腾讯云数据库 MariaDB,需要 提交工单 进行 RELOAD 授权)。

异构迁移兼容性说明

MariaDB 迁移到 MySQL,由于不同的数据库类型之间功能有略微差异,会存在以下兼容性问题。
1. 由于 MariaDB 自身的功能特性,部分 SQL 执行语句与 SHOW CREATE TABLE 不一致,可能导致目标端同步的 DDL 语句有差别。
MariaDB 中的 blob 类型不指定默认值,创建表后 SHOW CREATE TABLE 会显示有默认值 DEFAULT NULL。
datetime 类型 DDL 语句在源数据为 datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP,创建表后 SHOW CREATE TABLE 显示 datetime NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE current_timestamp(),在目标端 MySQL 解析的 DDL 为:datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP
2. 一些仅 MariaDB 支持的语法(例如 CREATE OR REPLACE TABLE/PERIOD FOR/WITHOUT OVERLAPS 等),在全量阶段可能导致迁移任务报错,在增量阶段会忽略这些语句。
对于 PERIOD FOR/WITHOUT OVERLAPS 语句,在迁移任务启动前,或者在任务进行中的全量阶段(源库导出和数据导入步骤)有执行该语句,则迁移任务失败;在同步增量阶段执行该语句,则目标端会忽略,数据无法同步到目标端。
对于 CREATE OR REPLACE TABLE 语句, 由于在全量迁移阶段,不能执行库或表结构变更的 DDL 操作,所以全量阶段执行该语句,迁移任务会失败;在同步增量阶段执行该语句,则目标端会忽略,数据无法同步到目标端。
3. MariaDB 允许 blob/text 等有默认值,但 MySQL 不允许,如果有这种类型的 SQL 会导致迁移任务报错。

应用限制

支持迁移基础表、视图、函数、触发器、存储过程和事件。不支持迁移系统库表,包括 information_schemasysperformance_schema__cdb_recycle_bin____recycle_bin____tencentdb__mysql
在迁移视图、存储过程和函数时,DTS 会检查源库中 DEFINER 对应的 user1( [DEFINER = user1])和迁移账号 user2 是否一致,如果不一致,迁移后 DTS 会修改 user1 在目标库中的 SQL SECURITY 属性,由 DEFINER 转换为 INVOKER( [INVOKER = user1]),同时设置目标库中 DEFINER 为迁移账号 user2([DEFINER = 迁移账号 user2])。如果源库中视图定义过于复杂,可能会导致任务失败。
源端如果是非 GTID 实例,DTS 不支持源端 HA 切换,一旦源端 MySQL 发生切换可能会导致 DTS 增量同步中断。
只支持迁移 InnoDB、MyISAM、TokuDB 三种数据库引擎,如果存在这三种以外的数据引擎表则默认跳过不进行迁移。其中,源库如果存在压缩模式的 TokuDB 引擎数据,需要目标库同步支持压缩模式才可以迁移,否则任务会报错。
相互关联的数据对象需要同时迁移,否则会导致迁移失败。常见的关联关系:视图引用表、视图引用视图、主外键关联表等。
增量迁移过程中,若源库产生了类型为 STATEMENT 格式的 Binlog 语句,则会导致迁移失败。
源数据库为腾讯云 MariaDB 时,应用限制如下。
DTS 迁移任务要求源库、目标库的 lower_case_tame_name 参数(表名大小敏感)保持一致,如果源数据库为腾讯云数据库 MariaDB,由于云数据库 MariaDB 只能在创建实例时修改 lower_case_tame_name 参数,所以用户需要在创建源库实例时确定大小写敏感规则,并在参数校验不一致时,修改目标库的 lower_case_tame_name 参数。
源数据库为腾讯云数据库 MariaDB 10.4 版本时,在迁移任务配置中,接入类型不支持选择云数据库,需要选择公网或者其他方式。
源数据库 Binlog 的 GTID 如果存在空洞,可能会影响迁移任务的性能并导致任务失败。
不支持同时包含 DML 和 DDL 语句在一个事务的场景,遇到该情况任务会报错。
不支持 Geometry 相关的数据类型,遇到该类型数据任务报错。
不支持 ALTER VIEW 语句,遇到该语句任务跳过不迁移。

操作限制

迁移过程中请勿进行如下操作,否则会导致迁移任务失败。
请勿修改、删除源数据库和目标数据库中用户信息(包括用户名、密码和权限)和端口号。
请勿在源库写入 Binlog 格式为 STATEMENT 的数据。
请勿在源库上执行清除 Binlog 的操作。
在库表结构迁移和全量迁移阶段,请勿执行库或表结构变更的 DDL 操作。
在增量迁移阶段,请勿删除系统库表 __tencentdb__
对于 MariaDB 的特有语法,如 CREATE OR REPLACE TABLE/PERIOD FOR/WITHOUT OVERLAPS,在全量阶段可能导致迁移任务报错,在增量阶段会忽略这些语句。
如果仅执行全量数据迁移,请勿在迁移过程中向源实例中写入新的数据,否则会导致源和目标数据不一致。针对有数据写入的场景,为实时保持数据一致性,建议选择全量+增量数据迁移。

支持的 SQL 操作

操作类型
支持的 SQL 操作
DML
INSERT、UPDATE、DELETE、REPLACE
DDL
TABLE:CREATE TABLE、ALTER TABLE、DROP TABLE、TRUNCATE TABLE、RENAME TABLE
VIEW:CREATE VIEW、DROP VIEW
INDEX:CREATE INDEX、DROP INDEX
DATABASE:CREATE DATABASE、ALTER DATABASE、DROP DATABASE
暂不支持 CREATE TABLE 表名 AS SELECT 语句。

环境要求

说明
如下环境要求,系统会在启动迁移任务前自动进行校验,不符合要求的系统会报错。如果用户能够识别出来,可以参考 校验项检查要求 自行修改,如果不能则等系统校验完成,按照报错提示修改。
类型
环境要求
源数据库要求
源库和目标库网络能够连通。
源库所在的服务器需具备足够的出口带宽,否则将影响迁移速率。
实例参数要求:
源库 server_id 参数需要手动设置,且值不能设置为0。
源库表的 row_format 不能设置为 FIXED。
源库和目标库 lower_case_table_names 变量必须设置为一致。
源库变量 connect_timeout 设置数值必须大于10。
建议开启 skip-name-resolve,减少连接超时的可能性。
Binlog 参数要求:
源库 log_bin 变量必须设置为 ON。
源库 binlog_format 变量必须设置为 ROW。
源库 binlog_row_image 变量必须设置为 FULL。
MariaDB 10.2 及以上版本,Percona 5.6 及以上版本 gtid_mode 变量不为 ON 时会报警告,建议打开 gtid_mode。
不允许设置 do_db, ignore_db 过滤条件。
源实例为从库时,log_slave_updates 变量必须设置为 ON。
建议源库 Binlog 日志至少保留3天及以上,否则可能会因任务暂停/中断时间大于 Binlog 日志保留时间,造成任务无法续传,进而导致任务失败。
外键依赖:
外键依赖只能设置为 NO ACTION,RESTRICT 两种类型。
部分库表迁移时,有外键依赖的表必须齐全。
DTS 对数据类型为 FLOAT 的迁移精度为38位,对数据类型为 DOUBLE 的迁移精度为308位,需要确认是否符合预期。
环境变量 innodb_stats_on_metadata 必须设置为 OFF。
目标数据库要求
目标库的版本必须大于等于源库的版本。
目标库的空间大小须是源库待迁移库表空间的1.2倍以上。(全量数据迁移会并发执行 INSERT 操作,导致目标数据库的表产生碎片,因此全量迁移完成后目标数据库的表存储空间很可能会比源实例的表存储空间大)
目标库不能有和源库同名的表、视图等迁移对象。
目标库 max_allowed_packet 参数设置数值至少为4M。


操作步骤

MariaDB 到 MySQL 的迁移、Percona 到 MySQL 的迁移,与 MySQL 到 MySQL 的迁移操作步骤一致,请参考 MySQL 到 MySQL 的迁移 进行配置。