传输对象范围
更新时间:2024-11-15
在配置数据迁移任务时,DTS 支持迁移选择传输对象范围。您可以选择整个实例或指定对象进行迁移。本文将介绍在配置数据迁移任务过程中,如何选择传输对象。
使用限制
- 目前仅 MySQL、GaiaDB、PostgreSQL、Oracle、MongoDB 支持手动选择
- 目前仅 MySQL、GaiaDB、PostgreSQL、Oracle 支持模式匹配
- PostgreSQL 的模式匹配仅支持表模式匹配,不支持库模式匹配
- Oracle 不支持带 % 的模式匹配
手动选择
配置 DTS 任务传输对象为 手动选择 后,在源端对象区域中勾选需要迁移的对象。同时,您可以在已选择对象区域中实现以下操作:
说明
- 迁移对象非整库时,仅 MySQL、GaiaDB 支持 OnlineDDL 操作,需打开 Online DDL 开关,详情参见 同步 Online DDL。
- PostgreSQL 与 Oracle 的增量同步不支持自动迁移新增的对象及其相关变更。
- MongoDB暂不支持库表映射与设置过滤条件。
- 迁移对象选择的粒度为库或表。若迁移对象选择的是表,则其他对象例如视图、触发器、函数或存储过程等,不会被迁移至目标库。
- 为保证数据迁移的性能和迁移任务的稳定性,DTS 会对 MySQL 的触发器进行改写,改写方式详情参见 触发器改写方式。
触发器改写方式
- 源端触发器:
CREATE TRIGGER test_trigger AFTER INSERT ON t1
FOR EACH ROW
BEGIN
INSERT INTO t2 VALUES (NEW.id);
END;
- 目标端修改后的触发器:
CREATE TRIGGER test_trigger AFTER INSERT ON t1
FOR EACH ROW
BEGIN
IF (SELECT @`__#BAIDU_DTS_WRITER#__`) IS NULL THEN
BEGIN
INSERT INTO t2 VALUES (NEW.id);
END;
END IF;
END;
DTS 往目标端写数据时,会在连接会话中设置 __#BAIDU_DTS_WRITER#__
变量,设置后,对于 DTS 执行的所有 SQL,都不会导致触发器运行;但对于用户执行的 SQL,触发器的功能能够正常运行。
模式匹配
配置 DTS 任务传输对象为 模式匹配 后,支持以 JSON 格式配置需要迁移的对象。具体规则如下:
[
{
"type" : "db",
"src" : "待迁移的库1的名称",
"dst" : "待迁移的库1在目标实例中的名称"
},
{
"type" : "db",
"src" : "模式匹配多个库",
"dst" : "待迁移的库在目标实例中的名称"
},
{
"type" : "table",
"src" : "待迁移或订阅的表A的名称",
"dst" : "待迁移或订阅的表A在目标实例中的名称"
"fieldBlacklist" : "列过滤(黑名单)",
"fieldWhitelist" : "列过滤(白名单)",
"where" : "行过滤"
},
{
"type" : "table",
"src" : "模式匹配多张表",
"dst" : "待迁移的表在目标实例中的名称",
"fieldBlacklist" : "列过滤(黑名单)",
"fieldWhitelist" : "列过滤(白名单)",
"where" : "行过滤"
}
]
参数 | 是否必须 | 说明 |
---|---|---|
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' |
迁移对象配置示例
匹配上游 old_db 的库,并不做转换的同步到下游
[
{
"type" : "db",
"src" : "old_db",
"dst" : "old_db"
},
{
...
}
]
匹配上游 old_db 的库,并转换为 new_db 的同步到下游
[
{
"type" : "db",
"src" : "old_db",
"dst" : "new_db"
},
{
...
}
]
匹配上游前缀为 old_db 的库,并不做转换的同步到下游
[
{
"type" : "db",
"src" : "old_db%",
"dst" : "old_db%",
},
{
...
}
]
匹配上游前缀为 old_db 的库,转换成前缀为 new_db 的库同步到下游
[
{
"type" : "db",
"src" : "old_db%",
"dst" : "new_db%"
},
{
...
}
]
匹配上游表 db.tbl,并不做转换的同步到下游
[
{
"type" : "table",
"src" : "db.tbl",
"dst" : "db.tbl",
"fieldBlacklist" : "id,id2,id3",
"fieldWhitelist" : "name,name2,name3",
"where" : "id>6 and name='dtstest'"
},
{
...
}
]
匹配上游表 old_db.old_tbl,并转换为表 new_db.new_tbl 同步到下游
[
{
"type" : "table",
"src" : "old_db.old_tbl",
"dst" : "new_db.new_tbl",
"fieldBlacklist" : "id,id2,id3",
"fieldWhitelist" : "name,name2,name3",
"where" : "id>6 and name='dtstest'"
},
{
...
}
]
匹配上游前缀为 old_db.old_tbl 的表,并不做转换的同步到下游
[
{
"type" : "table",
"src" : "old_db.old_tbl_%",
"dst" : "old_db.old_tbl_%",
"fieldBlacklist" : "id,id2,id3",
"fieldWhitelist" : "name,name2,name3",
"where" : "id>6 and name='dtstest'"
},
{
...
}
]
匹配上游前缀为 old_db.old_tbl 的表,并转换成前缀为 new_db.new_tbl 的表同步到下游
[
{
"type" : "table",
"src" : "old_db.old_tbl_%",
"dst" : "new_db.new_tbl_%",
"fieldBlacklist" : "id,id2,id3",
"fieldWhitelist" : "name,name2,name3",
"where" : "id>6 and name='dtstest'"
},
{
...
}
]
匹配上游前缀为 old_db 的库、前缀为 old_tbl 的表,并转换成前缀为 new_db 的库,前缀为 new_tbl 的表同步到下游
[
{
"type" : "table",
"src" : "old_db_%.old_tbl_%",
"dst" : "new_db_%.new_tbl_%",
"fieldBlacklist" : "id,id2,id3",
"fieldWhitelist" : "name,name2,name3",
"where" : "id>6 and name='dtstest'"
},
{
...
}
]