MVD 配置说明
MVD 支持通过配置文件执行对比任务,配置文件为 json 格式的文件。
配置选项说明
命令选项 | 类别 | 默认值 | 选项说明 |
---|---|---|---|
SOURCE_DB | dict | 源数据库连接信息,包括:数据库类型,IP,端口,服务名,用户名,密码 | |
TARGET_DB | dict | 目标数据库连接信息,包括:数据库类型,IP,端口,服务名,用户名,密码 | |
INCLUDE | list | 对比的对象范围,可指定对象类型,schema,对象名称,以及对应的模糊匹配表达式 | |
EXCLUDE | list | 对比时需要排除的对象范围,在 INLCUDE 范围内排除部分对象 | |
TABLE | str | 执行单表对比,使用此选项后,INCLUDE/EXCLUDE 选项失效 | |
ROW_DIR | str | /tmp/mvd_diff | 行差异文件目录,每张有数据差异的表,均会生成一个行差异文件 |
CATEGORY | str | all | 对比的类别,可以只对比元数据 (meta) 或数据 (data) |
MODE | str | Row | 对比模式,分为:汇总模式([S]ummary),逐行模式([R]ow),自动模式([A]utomatic),默认为: Row |
WORKERS | int | 8 | 表并行数量,取值范围:(0, 32] |
TABLE_WORKERS | int | 4 | 在分区并行/动态采样/手动并发情况下,单个表内并发数量,取值范围:(0, 32] |
DATA_FILTER | dict | 指定过滤条件,可指定单个表的过滤条件,也可以指定一批表共用的过滤条件,可指定单一过滤条件(部分对比),也可以指定多个过滤条件(手动并发) | |
SAMPLE_SIZE | int | 10240 | 动态采样触发阈值,表大小超过这个阈值才考虑使用动态采样,单位是:MB |
SAMPLE_PCT | int | 1 | 动态采样比例,取值范围:(0, 1], 取值为 1 时为全量采样 |
REMAP_SCHEMA | dict | 若对比的双方存在 schema 不一致的情况,可使用此选项指定 schema 映射关系 | |
COLUMN_LIST | dict | 指定需要对比的列名范围,以及列名的映射关系 | |
SKIP_COLUMN_TYPE | dict | {} | 跳过指定的字段类型,可具体指定跳过结构对比,跳过数据对比,或者二者皆跳过 |
SKIP_COLUMN_NAME | dict | {} | 跳过指定的字段名称,可具体指定跳过结构对比,跳过数据对比,或者二者皆跳过 |
IGNORE_FLOAT | bool | false | 对比时,是否忽略浮点类型的字段,浮点字段可能存在精度差异导致的行对比失败 |
ORA_FLOAT_PRECISION | int | -1 | 指定 Oracle float 类型的近似精度,在对比时会对 Oracle float 类型的数据进行四舍五入 |
FLOAT_PRECISION | int | -1 | 指定 float 类型的近似精度,在对比时会对 float 类型的数据进行四舍五入 |
DOUBLE_PRECISION | int | -1 | 指定 double 类型的近似精度,在对比时会对 double 类型的数据进行四舍五入 |
FRACTION_PRECISION | int | 6 | 指定毫秒字段的数据精度,Informix 数据毫秒最大精度为 5,其他库的精度取值范围为 [0, 6] |
ZERO_CHAR | str | 指定空字符 chr(0) 的替换字符,默认直接移除 chr(0) 字符 | |
TIME_ZONE | str | +00:00 | 指定对比时,在数据库客户端使用的时区,确保双方时区一致 |
EXCLUDE_SYS_TABLE | list | [] | 排除指定的部分系统表 |
RTRIM_VARCHAR | bool | false | 是否移除 varchar 等变长字符串尾部的空格 |
LOCAL_MD5 | bool | false | 是否强制源端和目标端在本地计算行数据的 md5 值 |
CALLBACK | str | 指定结果回调 URL,支持通过回调获取执行结果 | |
RUN_MODE | str | INFO | 指定运行模式,不同运行模式的日志数量会有较大差异,支持:INFO/DEBUG/WARNING/ERROR/CRITICAL 等 |
DEBUG_MD5 | bool | false | 针对 MD5 数据对比的 DEBUG 模式,该选项启用后会输出与表中行数相同数量级的日志,非必要不要启用 |
LOGFILE | str | mvd_logfile.log | 将日志输出到指定的日志文件中 |
PASSWD_ENCRYPT | bool | false | 数据库用户密码已通过 MDB 加密,需要在使用时进行解密 |
MTK_CONFIG | str | 指定 MTK 配置文件,支持通过解析 MTK 配置文件中的必要参数,进行迁移后的数据对比 | |
RESULT_FILE | str | 指定结果文件的输出位置,默认结果只输出到屏幕,不产生结果文件 | |
RESULT_FORMAT | str | json | 指定结果文件的输出格式,支持:json, plain |
DETAIL_MODE | bool | false | 是否输出详细模式的数据对比结果,详细模式会输出所有表的数据对比结果,默认简明模式只输出有差异的表的对比结果 |
ROW_FEEDBACK | bool | false | 是否精确识别主键表差异行的字段差异,并将有差异的字段数据记录到差异结果文件中(DIFF_DETAIL 字段) |
GENERATE_REPAIR | bool | false | 是否生成针对目标库的数据修复脚本 |
REPAIR_COMPARED | bool | false | 数据修复脚本是否仅针对对比字段,默认是针对所有双边匹配上的字段 |
FUNCTION_DIMENSION | dict | 旧的列统计值对比维度,不建议使用,未来可能会废弃 | |
LICENSE_FILE | str | ./license.json | 指定 License 文件的位置 |
配置文件示例如下(支持在配置文件中使用 //
进行单行注释):
{
// Mandantory configurations
// =============================================================================================
"SOURCE_DB": // Source Database connection information
{
"TYPE": "ORACLE", // DB Type: ORACLE|ORACLE2|DB2|MYSQL|POSTGRESQL|MOGDB|OPENGAUSS|SQLSERVER|INFORMIX
"HOST": "127.0.0.1", // DB Host IP
"PORT": "1521", // DB Port
"SERVICE": "orcl", // DB Name/Service
"USER": "", // DB User
"PASSWORD": "" // DB Password
},
"TARGET_DB": // Target Database connection information
{
"TYPE": "MOGDB", // DB Type: ORACLE|ORACLE2|DB2|MYSQL|POSTGRESQL|MOGDB|OPENGAUSS|SQLSERVER|INFORMIX
"HOST": "127.0.0.1", // DB Host IP
"PORT": "26000", // DB Port
"SERVICE": "postgres", // DB Name/Service
"USER": "omm", // DB User
"PASSWORD": "" // DB Password
},
"INCLUDE": // Source white list to be compared
[ // Tips: 1. <OBJECT_TYPE> can use: %/TABLE/VIEW/SEQUENCE/PROCEDURE/FUNCTION/OTHERS
// ["OBJECT_TYPE", "SCHEMA", "OBJECT_NAME"], // 2. Can use % in <SCHEMA> and <OBJECT_NAME> field, means to match all
// ["%", "HONGYE", "%"] // 3. Name is case insensitive
],
"EXCLUDE": [], // Source black list to be compared, format like "INCLUDE"
"TABLE": "", // Single table comparison, when this option used, then "INCLUDE" and "EXCLUDE" are ignored
// "TABLE": "source_schema.source_table:target_schema.target_table", // source and target can have different schema or table name
"ROW_DIR": "/tmp/mvd_diff", // Row differences data directory, each diff table has a file in this directory
"CATEGORY": "all", // Compare category: all, meta, data
"MODE": "Row", // Data compare mode, default is [R]
// [R] Row mode, compare data row by row
// [S] Summary mode, compare summary data, include row count and data signature
// [A] Automatic mode, Compare summary and compare row when summary does not matched
// Optional configurations
// =============================================================================================
// Performance related configurations
"WORKERS": 8, // Parallel between tables
"TABLE_WORKERS": 4, // Parallel within a table (split by partition/sampling)
"DATA_FILTER": // Customer defined data filter for data comparison
{
// "*": [["id < 100", "id < 100"]]
// "HONGYE.TEST_BIG_PART_BY_ID": [["ID < 10000", "ID < 10000"],
// ["ID between 10000 and 20000", "ID between 10000 and 20000"]
// ]
// Follow 3 configurations does the same thing:
// "*":["col_id < 100", "col_id > 100 and col_id < 200"]
// "*":[["col_id < 100"], ["col_id > 100 and col_id < 200"]]
// "*":[["col_id < 100", "col_id < 100"], ["col_id > 100 and col_id < 200", "col_id > 100 and col_id < 200"]]
},
"SAMPLE_SIZE": 10240, // Sampling threshold in MB, default 10240MB, 0 means do not split data
"SAMPLE_PCT": 1, // Sampling percentage, values between 0 and 1, 1 means split and compare all data
// Remapping configurations
"REMAP_SCHEMA": // Remap schema in comparison: Source:Target
{
// "SOURCE_SCHEMA": "TARGET_SCHEMA"
},
"COLUMN_LIST": // Column limitation and remapping
{
// "*": [["SOURCE_COLUMN_FOR_ALL_TABLE", "TARGET_COLUMN_FOR_ALL_TABLE"]],
// "HONGYE.TEST_BIG_PART_BY_ID": [["OBJECT_NAME", "NAME"]],
// "SCHEMA.TABLE_NAME": [["SOURCE_COLUMN_NAME", "TARGET_COLUMN_NAME"], ["SOURCE_COLUMN_NAME_2", "TARGET_COLUMN_NAME_2_NEW"]]
// Follow 3 configurations does the same thing:
// "*":["COL_INT", "COL_SMALLINT"]
// "*":[["COL_INT"], ["COL_SMALLINT"]]
// "*":[["COL_INT", "COL_INT"], ["COL_SMALLINT", "COL_SMALLINT"]]
},
// Data related configurations
"IGNORE_FLOAT": false, // Ignore float column in data comparison
"ORA_FLOAT_PRECISION": -1, // Oracle float precision (-1 ~ 128), -1 means automatic round to column "precision - 1"
"FLOAT_PRECISION": -1, // Float precision (-1 ~ 128), -1 means automatic round to column "precision - 1"
"DOUBLE_PRECISION": -1, // Double precision (-1 ~ 128), -1 means automatic round to column "precision - 1"
"FRACTION_PRECISION": 6, // Time microseconds fraction, informix max to 5
"ZERO_CHAR": "", // Replace chr(0) with given char
"TIME_ZONE": "+00:00",
"EXCLUDE_SYS_TABLE": [], // Exclude system object: object_name or schema.object_name. case insensitive
"RTRIM_VARCHAR": false, // Client time zone, default depend to server setting
// Other configurations
"CALLBACK": "",
"RUN_MODE": "INFO", // Log mode: INFO, DEBUG
"DEBUG_MD5": false, // Debug MD5 data before Python Calculation and Comparison
"LOGFILE": "",
"PASSWD_ENCRYPT": false, // DB Password are encrypted
"MTK_CONFIG": "", // MTK config file
"RESULT_FILE": "", // Write result to a file
"RESULT_FORMAT": "json", // Result format: json, plain
"DETAIL_MODE": false, // Default only list table with data differences, detail mode will list all tables in data comparison
"ROW_FEEDBACK": false, // Try to found column data differences for tables with primary key, and write differences into 'DIFF_DETAIL' field in diff result file
"GENERATE_REPAIR": false, // Whether to generate repair scripts for the target database
"REPAIR_COMPARED": false, // Whether to repair all columns matched, default is to repair all columns matched on both sides
"ROW_FEEDBACK": false, // Reversed for feature use
"FUNCTION_DIMENSION": // Column summary statistics comparison
{
"AVG": {"TYPE": "A", "FUNCTIONS": {"*": "AVG"}},
"MIN": {"TYPE": "NP", "FUNCTIONS": {"*": "MIN"}},
"MAX": {"TYPE": "NP", "FUNCTIONS": {"*": "MAX"}},
"MEDIAN": {"TYPE": "NP", "FUNCTIONS": {"*": "MEDIAN"}}
},
"LICENSE_FILE": "./license.json"
}
INCLUDE/EXCLUDE
可通过 INCLUDE/EXCLUDE
选项指定对比的范围,二者一个是白名单规则,一个是黑名单规则,对象在白名单且不在黑名单中,则会执行对比。
二者均为二维数组的配置项,配置规则如下:
- 内层每个数组对应一个对象规则,
- 内层数组包含 3 个元素,分别对应对象类型,schema和对象名
- 内层数据元素中可使用 % 表示通用匹配规则,类似数据库 LIKE 操作中的匹配规则
- 名称中的数据大小写不敏感
示例:
"INCLUDE": // Source white list to be compared
[ // Tips: 1. <OBJECT_TYPE> can use: %/TABLE/VIEW/SEQUENCE/PROCEDURE/FUNCTION/OTHERS
// ["OBJECT_TYPE", "SCHEMA", "OBJECT_NAME"], // 2. Can use % in <SCHEMA> and <OBJECT_NAME> field, means to match all
// ["%", "HONGYE", "%"] // 3. Name is case insensitive
],
"EXCLUDE": [], // Source black list to be compared, format like "INCLUDE"
TABLE
单表对比模式,使用此选项后 INCLUDE/EXCLUDE
选项失效。
单表模式中,必须指定 schema.table_name, 支持两种格式:
- 源库与目标库中 schema 和 table_name 均一致,则使用 schema.table_name
- 源库与目标库中 schema 或 table_name 存在差异,则使用 source_schema.source_table:target_schema.target_table
DATA_FILTER
通过指定过滤条件,可以实现如下两种需求:
- 针对大表,只对比部分数据,比如只对比部分比较新的数据
- 针对大表,可手动根据某一字段进行区间划分,多个区间之间可以并发进行数据对比
该选项为字典结构,其中:
- KEY 为表信息: [schema.]table_name,也可以使用 * 表示对范围内的所有表启用该过滤条件
- VALUE 为过滤条件,为二维数组,内层数组元素为具体过滤条件,包含两个元素:源条件,目标条件,如果原和目标条件名称一样,可以内层数组只写一个元素,或者直接写字符串。
配置示例如下:
"DATA_FILTER": // Customer defined data filter for data comparison
{
// "*": [["id < 100", "id < 100"]]
// "HONGYE.TEST_BIG_PART_BY_ID": [["ID < 10000", "ID < 10000"],
// ["ID between 10000 and 20000", "ID between 10000 and 20000"]
// ]
}
REMAP_SCHEMA
若对比的双方存在 schema 不一致的情况,可使用此选项指定 schema 映射关系。
该选项为字典结构,其中 KEY 为源 schema, VALUE 为目标 schema。
配置示例如下:
"REMAP_SCHEMA": // Remap schema in comparison: Source:Target
{
// "SOURCE_SCHEMA": "TARGET_SCHEMA"
}
COLUMN_LIST
该选项用于指定列名范围,以及列名的映射关系。可同时实现如下两种需求:
- 字段限制:限制只对比指定的字段
- 字段映射:设置源与目标的字段映射关系
该选项为字典结构,其中:
- KEY 为表信息: [schema.]table_name,也可以使用 * 表示对范围内的所有表启用该字段限制与映射
- VALUE 为字段信息,为二维数组,内层每个数组对应一列,其中包含两个元素:源字段,目标字段,如果原和目标字段名称一样,可以内层数组只写一个元素,或者直接写字符串。
配置示例如下:
"COLUMN_LIST": // Column limitation and remapping
{
// "*": [["SOURCE_COLUMN_FOR_ALL_TABLE", "TARGET_COLUMN_FOR_ALL_TABLE"]],
// "HONGYE.TEST_BIG_PART_BY_ID": [["OBJECT_NAME", "NAME"]],
// "SCHEMA.TABLE_NAME": [["SOURCE_COLUMN_NAME", "TARGET_COLUMN_NAME"], ["SOURCE_COLUMN_NAME_2", "TARGET_COLUMN_NAME_2_NEW"]]
}