传输对象范围
更新时间:2025-02-11
在配置数据迁移任务时,DTS 支持迁移选择传输对象范围。您可以选择整个实例或指定对象进行迁移。本文将介绍在配置数据迁移任务过程中,如何选择传输对象。
使用限制
- 目前仅 MySQL、GaiaDB、PostgreSQL、Oracle、MongoDB 支持手动选择
- 目前仅 MySQL、GaiaDB、PostgreSQL、Oracle、MongoDB 支持模式匹配
- PostgreSQL 的模式匹配仅支持表模式匹配,不支持库模式匹配
- Oracle 不支持带 % 的模式匹配
手动选择
配置 DTS 任务传输对象为 手动选择 后,在源端对象区域中勾选需要迁移的对象。同时,您可以在已选择对象区域中实现以下操作:
说明
- 迁移对象非整库时,仅 MySQL、GaiaDB 支持 OnlineDDL 操作,需打开 Online DDL 开关,详情参见 同步 Online DDL。
- PostgreSQL 与 Oracle 的增量同步不支持自动迁移新增的对象及其相关变更。
- MongoDB暂不支持库表映射与设置过滤条件。
- 迁移对象选择的粒度为库或表。若迁移对象选择的是表,则其他对象例如视图、触发器、函数或存储过程等,不会被迁移至目标库。
- 为保证数据迁移的性能和迁移任务的稳定性,DTS 会对 MySQL 的触发器进行改写,改写方式详情参见 触发器改写方式。
触发器改写方式
- 源端触发器:
SQL
1CREATE TRIGGER test_trigger AFTER INSERT ON t1
2 FOR EACH ROW
3 BEGIN
4 INSERT INTO t2 VALUES (NEW.id);
5 END;
- 目标端修改后的触发器:
SQL
1CREATE TRIGGER test_trigger AFTER INSERT ON t1
2 FOR EACH ROW
3 BEGIN
4 IF (SELECT @`__BAIDU_DTS_WRITER__`) IS NULL THEN
5 BEGIN
6 INSERT INTO t2 VALUES (NEW.id);
7 END;
8 END IF;
9 END;
DTS 往目标端写数据时,会在连接会话中设置 __BAIDU_DTS_WRITER__
变量,设置后,对于 DTS 执行的所有 SQL,都不会导致触发器运行;但对于用户执行的 SQL,触发器的功能能够正常运行。
模式匹配
配置 DTS 任务传输对象为 模式匹配 后,支持以 JSON 格式配置需要迁移的对象。具体规则如下:
JSON
1[
2 {
3 "type" : "db",
4 "src" : "待迁移的库1的名称",
5 "dst" : "待迁移的库1在目标实例中的名称"
6 },
7 {
8 "type" : "db",
9 "src" : "模式匹配多个库",
10 "dst" : "待迁移的库在目标实例中的名称"
11 },
12 {
13 "type" : "db",
14 "src" : "待迁移的库1的名称",
15 "dst" : "待迁移的库1在目标实例中的名称",
16 "where" : "",
17 "sqlType" : "库级sqlType过滤"
18 },
19 {
20 "type" : "table",
21 "src" : "待迁移或订阅的表A的名称",
22 "dst" : "待迁移或订阅的表A在目标实例中的名称"
23 "fieldBlacklist" : "列过滤(黑名单)",
24 "fieldWhitelist" : "列过滤(白名单)",
25 "where" : "行过滤"
26 },
27 {
28 "type" : "table",
29 "src" : "模式匹配多张表",
30 "dst" : "待迁移的表在目标实例中的名称",
31 "fieldBlacklist" : "列过滤(黑名单)",
32 "fieldWhitelist" : "列过滤(白名单)",
33 "where" : "行过滤"
34 },
35 {
36 "type" : "table",
37 "src" : "待迁移或订阅的表A的名称",
38 "dst" : "待迁移或订阅的表A在目标实例中的名称",
39 "where" : "",
40 "sqlType" : "表级sqlType过滤"
41 },
42]
参数 | 是否必须 | 说明 |
---|---|---|
type | Y | 待迁移对象类型:db(迁移整个库)、 table(迁移单张表或者模式匹配多张表) |
src | Y | 如果是迁移整个库,此项为待迁移的库的名称;如果是迁移表,此项为待迁移的表的名称 |
dst | Y | 如果是迁移整个库,此项为待迁移的库在目标实例中的名称;如果是迁移表,此项为待迁移的表在目标实例中的名称 |
fieldBlacklist | N | 列过滤(黑名单),符合条件的列将被排除,支持数据库标准 SQL SELECT 条件,示例:n1,n2 |
fieldWhitelist | N | 列过滤(白名单),符合条件的列将被保留,支持数据库标准 SQL SELECT 条件,示例:n1,n2 |
where | N | 行过滤,符合条件的行将被保留,仅支持数据库标准 SQL WHERE 条件,Oracle 数据库注意区分字段名大小写。示例:id>10 AND status='success' |
sqlType | N | 库表级别sqlType过滤。支持过滤的语句类型有I(insert)、U(update)、D(delete)、Q(DDL) |
迁移对象配置示例
匹配上游 old_db 的库,并不做转换的同步到下游
JSON
1[
2 {
3 "type" : "db",
4 "src" : "old_db",
5 "dst" : "old_db"
6 },
7 {
8 ...
9 }
10]
匹配上游 old_db 的库,并转换为 new_db 的同步到下游
JSON
1[
2 {
3 "type" : "db",
4 "src" : "old_db",
5 "dst" : "new_db"
6 },
7 {
8 ...
9 }
10]
匹配上游前缀为 old_db 的库,并不做转换的同步到下游
JSON
1[
2 {
3 "type" : "db",
4 "src" : "old_db%",
5 "dst" : "old_db%",
6 },
7 {
8 ...
9 }
10]
匹配上游前缀为 old_db 的库,转换成前缀为 new_db 的库同步到下游
JSON
1[
2 {
3 "type" : "db",
4 "src" : "old_db%",
5 "dst" : "new_db%"
6 },
7 {
8 ...
9 }
10]
只支持同步上游 old_db 库的 insert 和 update 语句到下游
JSON
1[
2 {
3 "type" : "db",
4 "src" : "old_db",
5 "dst" : "old_db",
6 "sqlType" : "I,U"
7 },
8 {
9 ...
10 }
11]
匹配上游表 db.tbl,并不做转换的同步到下游
JSON
1[
2 {
3 "type" : "table",
4 "src" : "db.tbl",
5 "dst" : "db.tbl",
6 "fieldBlacklist" : "id,id2,id3",
7 "fieldWhitelist" : "name,name2,name3",
8 "where" : "id>6 and name='dtstest'"
9 },
10 {
11 ...
12 }
13]
匹配上游表 old_db.old_tbl,并转换为表 new_db.new_tbl 同步到下游
JSON
1[
2 {
3 "type" : "table",
4 "src" : "old_db.old_tbl",
5 "dst" : "new_db.new_tbl",
6 "fieldBlacklist" : "id,id2,id3",
7 "fieldWhitelist" : "name,name2,name3",
8 "where" : "id>6 and name='dtstest'"
9 },
10 {
11 ...
12 }
13]
匹配上游前缀为 old_db.old_tbl 的表,并不做转换的同步到下游
JSON
1[
2 {
3 "type" : "table",
4 "src" : "old_db.old_tbl_%",
5 "dst" : "old_db.old_tbl_%",
6 "fieldBlacklist" : "id,id2,id3",
7 "fieldWhitelist" : "name,name2,name3",
8 "where" : "id>6 and name='dtstest'"
9 },
10 {
11 ...
12 }
13]
匹配上游前缀为 old_db.old_tbl 的表,并转换成前缀为 new_db.new_tbl 的表同步到下游
JSON
1[
2 {
3 "type" : "table",
4 "src" : "old_db.old_tbl_%",
5 "dst" : "new_db.new_tbl_%",
6 "fieldBlacklist" : "id,id2,id3",
7 "fieldWhitelist" : "name,name2,name3",
8 "where" : "id>6 and name='dtstest'"
9 },
10 {
11 ...
12 }
13]
匹配上游前缀为 old_db 的库、前缀为 old_tbl 的表,并转换成前缀为 new_db 的库,前缀为 new_tbl 的表同步到下游
JSON
1[
2 {
3 "type" : "table",
4 "src" : "old_db_%.old_tbl_%",
5 "dst" : "new_db_%.new_tbl_%",
6 "fieldBlacklist" : "id,id2,id3",
7 "fieldWhitelist" : "name,name2,name3",
8 "where" : "id>6 and name='dtstest'"
9 },
10 {
11 ...
12 }
13]
只支持同步上游表 db.tbl 的 delete 和 DDL 语句到下游
JSON
1[
2 {
3 "type" : "table",
4 "src" : "db.tbl",
5 "dst" : "db.tbl",
6 "sqlType" : "D,Q"
7 },
8 {
9 ...
10 }
11]