mxshift
1 描述
mxshift 工具目前支持以下功能:
- 全量迁移:以数据库为单位,实现从 Greenplum 5 / Greenplum 6/ MatrixDB 集群并行迁移数据到新的 MatrixDB 集群
- 反向迁移:从 MatrixDB 到 Greenplum 5 / Greenplum 6 反向迁移
- 增量迁移:通过 WHERE 条件实现增量数据迁移
- 迁移复制表(Replicated Table)
2 使用
此部分主要介绍编写启动 mxshift 工具所需的配置文件 config.json
的使用方法、相关参数,以及 mxshift 命令行相关参数。
2.1 编写配置文件
使用 mxshift 工具需要先准备一个 JSON 文件 config.json
,内容如下:
{
"mode": "normal",
"verify": true,
"bothway": true,
"concurrency": 5,
"compress_method": "lz4",
"log_level": "info",
"gphome": "/usr/local/greenplum-db-6.7.1",
"src_host": "sdw3",
"src_db": "testdb",
"src_user": "gpadmin",
"src_password": "xxxx",
"src_port": 54322,
"target_host": "172.16.100.32",
"target_db": "destdb",
"target_user": "mxadmin",
"target_password": "yyyy",
"target_port": 5432,
"where": {
"enabled": false,
"global": "txdate >= '2022-10-01' AND batchnum >= 100000000",
"override": [
{
"schema": "test_schema_1",
"name": "table_001",
"where": "abc > 10"
},
{
"schema": "test_schema_2",
"name": "another_table",
"where": "tag != 'aabbcc' AND ts > '2022-01-01'"
}
]
},
"schema_list": [
"test_schema_1",
"test_schema_2"
],
"exclude_schema_list": [
"test_schema_5",
"test_schema_8"
],
"table_list": [
{
"schema": "test_schema_1",
"name": "table_001"
},
{
"schema": "test_schema_2",
"name": "table_002"
}
],
"exclude_table_list":[
{
"schema": "test_schema_3",
"name": "table_003"
}
]
}
以下是配置文件中的详细参数介绍:
参数名 | 描述 |
---|---|
--mode | 运行模式。允许下列几个值:normal,dryrun,fetch,motion。normal:默认值,指正常的数据迁移流程;dryrun:验证两边数据库的连通性,使用简单的数据库定义语言(DDL)进行验证操作,但不进行数据的读取和写入;fetch:在 dryrun 的基础上,读取源端的数据并发送到目标端数据节点(Segment),但直接丢弃,不进行处理,此选项用于验证源端读取效率和源端到目标端网络传输效率;motion:在 fetch 的基础上,在目标端数据库解析数据并交换到真正的目标 Segment,此选项用于进一步测试目标端数据库的数据交换速率 |
--verify | 默认值为 false。校验数据迁移前后的行数是否匹配 |
--bothway | mxshift 默认会先迁移最大的表,以达到最短时间内迁移完全体数据。如果设置 bothway 为 true,则 mxshift 会从最大的表和最小的表两端同时消费 |
--concurrency | 最大并行迁移多少张表,默认值为 5,不超过 10 |
--compress_method | 压缩方式:gzip / zstd / lz4 / 0,默认值为 0 ,即不压缩。目前开启任何压缩算法,都需要目标端的每个 Segment 的 mxadmin 用户可以免密 ssh 登陆到源端的每个 Segment,建议配置后用 dryrun 进行测试 |
--deduplicate(实验特性) | 如果前一次 mxshift 迁移没有完成就退出了,打开这个选项可以使 mxshift 再次执行时继续完成剩余的表,忽略已经迁移成功的表。这个功能目前尚在实验阶段 |
--log_level | 默认值为 info,会打印正常的进度信息以及错误和警告信息。如果改为 debug,则会输出更多调试信息,仅用于开发和故障定位 |
--gphome | 源端数据库的 GPHOME 绝对路径 |
--src_host | 需要迁出数据的源 GP 集群 Master 节点主机名(Host)或 IP 地址 |
--src_db | 需要迁出数据的源 GP 数据库 |
--src_user | 需要迁出数据的源 GP 数据用户名 |
--src_password | 需要迁出数据的源 GP 数据用户密码 |
--src_port | 需要迁出数据的源 GP 数据库的端口号 |
--target_host | 需要迁入数据的目标 MatrixDB 集群 master 节点 Host 或 IP 地址 |
--target_db | 需要迁入数据的目标 MatrixDB 数据库 |
--target_user | 需要迁入数据的目标 MatrixDB 数据库用户名 |
--target_password | 需要迁入数据的目标 MatrixDB 数据库用户密码 |
--target_port | 需要迁入数据的目标 MatrixDB 数据库的端口号 |
--table_list | 需要迁移的源 GP 数据表的列表,如果是分区表需填写分区表,如果需要迁移整个 GP 数据库,只需要配置 src_db 参数,该 table_list 参数配置为空即可,mxshift 会从大到小开始迁移所有大小不为 0 的表 |
--exclude_table_list | 需排除的表的模式(schema)和名称列表 |
--schema_list | 需要迁出数据的目标 GP 数据库的 schema,优先级是如果 table_list 有配置具体的表,则只传输 table_list 中的表,如果没有,则检查 schema_list 中是否配置了 schema,如果配置了 schema,则传输该 schema 下的所有表,如果没有 schema,则传输 src_db 下的所有表 |
--exclude_schema_list | 排除需要迁出数据的目标 GP 数据库的 schema,不对该 schema 下的表进行数据迁移,如果 schema_list 和 exclude_schema_list 中配置了同名的 schema,那么该 schema 会被排除掉 |
--no-color | 关闭颜色标签 |
如果你想要通过 WHERE 条件实现增量数据迁移,那么可能会使用到以下参数:
参数名 | 描述 |
---|---|
--enabled | 本功能默认关闭,启用需手动指认 true |
--global | SQL 的 WHERE 表达式,会对本次迁移的所有表尝试附加此条件表达式,如果表上不包含 WHERE 子句里的字段名导致 SQL 语句错误,则会自动跳过该表。为此,mxshift 会对这种无法迁移的表提示 SKIPPED |
--override | 是一个数组,可以包含多个 schema 名 + 表名 + WHERE 表达式的对象,会覆盖 global 的指定的 WHERE 表达式 |
2.2 命令行参数
mxshift 命令行参数如下:
参数名 | 描述 |
---|---|
-c 或 --config_path | mxshift 工具全局配置文件路径 |
-n 或 --no-color | 打印非彩色日志 |
-v 或 --version | mxshift 工具版本 |
3 示例
3.1 全量迁移
配置文件 config_path.json
示例如下:
{
"mode": "normal",
"verify": false,
"bothway": true,
"concurrency": 5,
"compress_method": "",
"log_level": "info",
"gphome": "/usr/local/greenplum-db-6.7.1",
"src_host": "sdw3",
"src_db": "testdb",
"src_user": "gpadmin",
"src_password": "greenplum@2020",
"src_port": 54322,
"target_host": "172.16.100.32",
"target_db": "ms",
"target_user": "mxadmin",
"target_password": "xxxx",
"target_port": 5432,
"schema_list":["test_schema_1", "test_schema_2"],
"exclude_schema_list":["test_schema_5", "test_schema_8"],
"table_list":[
{
"schema":"test_schema_1",
"name":"table_001"
},
{
"schema":"test_schema_2",
"name":"table_002"
}
],
"exclude_table_list":[
{
"name":"test_schema_3",
"schema":"table_003"
}
]
}
准备好 JSON 文件后,执行如下命令以启动 mxshift 进行全量迁移。
mxshift -c config_path.json
3.2 增量迁移
通过 WHERE 条件实现增量数据迁移:
{
"mode": "normal",
"verify": false,
"bothway": true,
"concurrency": 5,
"compress_method": "",
"log_level": "info",
"gphome": "/usr/local/greenplum-db-6.7.1",
"src_host": "sdw3",
"src_db": "testdb",
"src_user": "gpadmin",
"src_password": "greenplum@2020",
"src_port": 54322,
"target_host": "172.16.100.32",
"target_db": "ms",
"target_user": "mxadmin",
"target_password": "xxxx",
"target_port": 5432,
"where": {
"enabled": false,
"global": "txdate >= '2022-10-01' AND batchnum >= 100000000",
"override": [
{
"schema":"test_schema_1",
"name":"table_001",
"where": "abc > 10"
}
]
},
"schema_list":["test_schema_1", "test_schema_2"],
"exclude_schema_list":["test_schema_5", "test_schema_8"],
"table_list":[
...
],
"exclude_table_list":[
...
]
}
准备好 JSON 文件后,执行如下命令以启动 mxshift 进行增量迁移。
mxshift -c config_path.json
3.3 迁移复制表(Replicated Table)
- 如果是迁移某个数据库,或者某个模式下的所有复制表,不需要在
config_path.json
里面做额外的配置,mxshfit 会自动判断哪些表是复制表,执行相应的迁移策略,防止重复迁移数据的问题发生。 - 如果是在
table_list
中手动配置的某张表为复制表,则需要单独为该复制表声明一个policyType
字段,值为 “r” 表示该表为复制表。"table_list":[ { "schema":"public", "name":"tbl_test_replica", "policyType":"r" } ],
准备好 JSON 文件后,执行如下命令以启动 mxshift 进行复制表迁移。
mxshift -c config_path.json
注意!
数据迁移思路及完整步骤介绍请见 数据迁移