-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathgc-sample.conf
More file actions
288 lines (253 loc) · 17 KB
/
gc-sample.conf
File metadata and controls
288 lines (253 loc) · 17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
; gt-checksum 配置文件参考
; 注意:当前配置文件不再读取 [DSNs]、[Schema]、[Rules] 等一级标签,
; 所有参数都应直接写在文件顶层,不能再带 section header。
; 定义源、目标数据源
; 这部分参数不能全部为空
srcDSN=mysql|u1:p1@tcp(172.17.0.1:3307)/information_schema?charset=utf8mb4
dstDSN=mysql|u1:p1@tcp(172.17.0.2:3307)/information_schema?charset=utf8mb4
; 当前支持 MySQL-family(MySQL/Percona/GreatSQL/MariaDB等)以及 Oracle 数据源
; Oracle DSN格式为:oracle|user/password@ip:port/sid
; 例如:srcDSN=oracle|scott/tiger@172.16.0.1:1521/helowin
;
; MySQL DSN格式为:mysql|usr:password@tcp(ip:port)/dbname?charset=xxx
; 例如:dstDSN=mysql|checksum:Checksum@3306@tcp(172.16.0.1:3306)/information_schema?charset=utf8mb4
; 提示:Percona/GreatSQL/MariaDB 数据源同样使用 mysql 驱动前缀,例如
; srcDSN=mysql|checksum:Checksum@3306@tcp(src-mariadb106-host:3306)/information_schema?charset=utf8mb4
; dstDSN=mysql|checksum:Checksum@3306@tcp(dst-mariadb1011-host:3306)/information_schema?charset=utf8mb4
; 关于MySQL-family的支持矩阵详见文档 gt-checksum-manual.md 中 "MySQL / MariaDB 跨版本兼容说明" 这部分内容
; 定义校验数据对象
; 这部分参数不能全部为空,至少要配置tables参数
tables=test.*
; 配置参数中,table=*.*表示匹配所有库(MySQL数据源则自动排除 information_schema, mysql, performance_schema, sys 等几个系统库)
; 常用示例:
; - db1.t1 表示只检查 db1.t1 这个表
; - db1.* 表示db1数据库下的所有表
; - db1.t% 表示db1数据库下所有t开头的表,如 t1, t2, tab 等;也支持 "%x" 和 "%x%" 格式,如 "%t%" 表示所有以t结尾的表
; - db1.t%:db2.t% 表示将源端db1数据库下所有t开头的表,都映射到目标端db2数据库下同样所有t开头的表
;
; 注意:表名段仅支持 % 作为部分通配符;* 仅在 "db.*" 形式(表示某库下所有表)时有效,
; 不支持作为部分通配符(如 db.t* 会在参数校验阶段报错并提示改用 db.t%)
;
; 支持库名级别映射配置,例如:db1.*:db2.*,表示源端数据库db1下的所有表,映射到目标端数据库db2下对应的表名
; 比如源端表 db1.t1 对应目标端 db2.t1 表,源端表 db1.t2 对应目标端 db2.t2 表
; 支持映射与非映射规则同时混合使用,例如
; tables=db.*,db1.*:db2.* 表示匹配db数据库下的所有表,同时将源端db1库下的表映射到目标端db2库下对应的表名
; tables=db1.t4:db2.t4,db3.t3 表示匹配db3.t3表,同时将源端db1.t4表映射到目标端db2.t4表
;
; 如果已经设置了"*.*",则不能再添加其他值
; 例如设置规则"*.*,pcms.*"时会报告table参数设置错误
; 当参数tables和ignoreTables的值设置相同时也会报错
ignoreTables =
; 参数 ignoreTables 用来定义忽略的数据对象规则
; ignoreTables 参数的配置规则和 tables 参数相同
sqlWhere=""
; 参数 sqlWhere 用来定义校验数据对象时的 WHERE 子句条件
; 这样可以只校验部分数据,而不是校验所有数据行,对于大表中只有小部分数据不一致的场景校验效率有极大提升
; 例如:sqlWhere="id>=7756" 表示只校验 id 大于等于 7756 的数据行
; 如果不设置则或参数值为空(例如 sqlWhere=""),则不添加 WHERE 子句条件,就校验所有数据行
; 该条件对所有表都生效,当某个表不存在相应的条件字段时,会忽略该表并报告IndexColumn=NULL且校验结果一致,这种情况需要自行处理
columns=
; 参数 columns 用来指定只校验表中的部分列,默认为空(校验所有列)
; 仅适用于 checkObject=data 模式,且目标表必须有主键或唯一键
; 当前仅支持 MySQL-family -> MySQL-family,不支持任一端为 Oracle 的 columns 模式
;
; 支持三种语法格式:
;
; 格式一:简单列名列表(仅在 tables 中恰好指定了一张表时可用)
; columns="c1,c2,c3"
; 源端和目标端使用相同列名,等价于格式二中源列名=目标列名
; 注意:这种写法不支持 tables 中出现通配符
;
; 格式二:同表列名映射(含库名.表名的完整限定格式,源目标为同一张逻辑表)
; columns="db1.t1.src_col1:db1.t1.dst_col1,db1.t1.src_col2:db1.t1.dst_col2"
; 适用于源端列名与目标端列名不同(如重命名迁移场景)
;
; 格式三:跨表列名映射(源目标来自不同库或不同表名,需通过 tables 参数明确映射)
; columns="db1.t1.src_col1:db2.t2.dst_col1,db1.t1.src_col2:db2.t2.dst_col2"
;
; 说明:
; - PK/唯一键列始终包含在校验 SELECT 中(用于行级匹配),无需在 columns 中显式列出
; - 非选中列的 DDL 差异(类型/长度等)不阻断校验,仅记录警告
; - 无索引表不支持 columns 模式,会直接跳过并标记为 DDL-yes
; - source-only 行(源端有目标端无):不生成 INSERT,仅记录告警日志
; - target-only 行(目标端有源端无):默认不操作,由 extraRowsSyncToSource 参数控制
; - two-sided 行(两端均存在但选中列值不同):生成 UPDATE SET <选中列> WHERE <PK>
; - 如果存在 source-only 或未删除的 target-only 行,会额外生成 columns-advisory.<schema>.<table>.sql 提示文件
; - 终端结果和 CSV 结果会额外展示 Columns 列,便于确认本次实际比对了哪些列
; 示例:
; columns="id,name,status"
; columns="testdb.orders.amount:testdb.orders.total_amount"
;
; 端到端集成回归测试:
; scripts/regression-test-columns.sh 覆盖上述所有 columns 使用场景,
; 配套 fixture 文件:testcase/MySQL-columns-source.sql / MySQL-columns-target.sql
; 用法示例:
; bash scripts/regression-test-columns.sh --src-port=3406 --dst-port=3408
; bash scripts/regression-test-columns.sh --dry-run # 仅预览测例列表
checkNoIndexTable=no
; 设置是否检查没有索引的表,可设置为 [yes | no],默认值:no
; 如果为设置则使用默认值 no
; checkNoIndexTable=yes | no
caseSensitiveObjectName=no
; 设置是否忽略库名、表名、字段名等数据对象名的大小写,可设置为 [yes | no],默认值:no
; no,忽略tables和ignoreTables涉及的数据对象名大小写规则
; 注意:在比较数据对象名时统一使用大写库名及表名,但是生成fix SQL文件时,仍采用原来的数据对象名,不会强制转成大写
; yes,按照tables和ignoreTables参数涉及的数据对象名的大小写进行匹配
; caseSensitiveObjectName=yes | no
; 其他校验规则
; 这部分参数如果不设置则使用相应的默认值
parallelThds=10
; 数据校验工作时的并行线程数,默认值:10
; 注:程序会根据 checkObject 模式自动计算连接池大小:
; checkObject=data 时,单侧连接池大小 = parallelThds*2 + 4(最低 8);
; data 模式下 queryTableDataSeparate 与 AbnormalDataDispos 两条并发 pipeline 各需
; parallelThds 个连接,峰值约为 parallelThds*2 + 2,+4 为余量。
; checkObject=struct/routine/trigger 时,单侧固定为 3,与 parallelThds 无关。
; 建议根据数据库 max_connections 配置合理设置 parallelThds,避免连接数耗尽。
; 示例(parallelThds=10):data 模式单侧需约 24 个连接,两侧合计约 48 个连接。
chunkSize=10000
; 设置单列索引每次检索多少条数据进行校验,默认值:10000,建议范围:1000 - 10000
; 注:该值设置太大时有可能会造成SQL查询效率反倒下降的情况发生,一般建议设置不超过10000
queueSize=1000
; 设置校验队列深度,默认值:1000
checkObject=data
; 设置数据校验对象,可设置为 [data|struct|routine|trigger],默认值:data
; 分别表示:行数据|表结构|存储程序|触发器
; 如果不设置则使用默认值 data
;
; 如果设置为data,则只校验行数据,不校验表结构、存储程序、触发器
;
; 如果设置为struct,则只校验表结构(包含索引、外键、分区),不校验行数据、存储程序、触发器
; 在 MariaDB -> MariaDB 场景下,隐藏索引修复语句会使用目标端兼容的 IGNORED 语法
;
; 如果设置为routine,则只校验存储程序(含存储过程、存储程序),不校验行数据、表结构、触发器,
; 这时提醒要授予 SHOW_ROUTINE ON *.* 权限才能完成存储程序定义的校验
;
; 如果设置为trigger,则只校验触发器,不校验行数据、表结构、存储程序
;
; 提示:当设置为routine/trigger时,会检查指定数据库下所有的routine/trigger,会忽略tables和ignoreTables中的正则表达式
memoryLimit=1024
; 设置内存使用限制,避免进程使用过多内存
; 设置范围 [100 - 65536],默认值:1024,单位:MB(不支持附加KB、MB、GB等单位写法)
;
; 在检查大表等个别情况下,实际使用内存可能会超过该阈值,甚至可能触发系统OOM Killer机制。这种情况下,可以考虑启用Swap分区,适当使用部分Swap,避免进程被意外杀掉
;
; 当内存使用超过该值时,会重复自动将 parallelThds, queueSize, chunkSize 三个参数调整为原来的90%(直到都减到最小值),并进行GC操作,并产生类似下面的提示信息:
; Info: Memory usage 107MB approaching limit, triggering garbage collection
; Info: Parameter change notification sent, new values - ParallelThds: 9, QueueSize: 900, ChunkSize: 9000
;
; Warning: Memory usage 180MB reached limit (100MB). Automatically reducing parameters:
; - parallelThds: 10 -> 9
; - queueSize: 1000 -> 900
; - chunkSize: 10000 -> 9000
; - Garbage collection triggered after parameter adjustment
; Info: Memory usage decreased to 76MB, below threshold, ready for next adjustment if needed
; 如果因为存在宽表,导致进程使用内存过多,可以尝试将 memoryLimit 参数设置为更大的值,例如 10240
;
; 如果存在特别大的宽表,在进行上述尝试后仍然超过内存限制,就会退出程序,并产生下面的错误提示:
;
; Fatal error: Current memory usage 269MB has reached the limit (256MB). Parameters already at minimal values. Exiting...
; 此时可以尝试继续调大 memoryLimit 参数,或者检查宽表是否可以拆分成多个表,然后再进行校验
; 如果一直报告内存超限,可以尝试每次只检查部分表,分多批次完成,避免因为内存超限导致校验任务失败
showActualRows=ON
; 设置是否显示精确行数,可设置为 [ON | OFF],默认值:ON
; ON:默认保留原有精确行数统计行为,会执行类似 SELECT COUNT(*) FROM t 的SQL,适合需要精确行数展示场景
; OFF:使用统计信息(TABLE_ROWS / CARDINALITY)估算行数,不执行全表 COUNT(*),性能更好,适合大表校验
mariaDBJSONTargetType=JSON
; 设置 MariaDB 源端 JSON alias 在目标 MySQL 端的对齐目标类型,可设置为 [JSON | LONGTEXT | TEXT],默认值:JSON
; 仅在 MariaDB -> MySQL 8.0/8.4 的 struct 校验与修复场景中生效
; JSON:按 MySQL 原生 JSON 语义对齐,适合目标端希望使用 JSON 类型的场景
; LONGTEXT:按 LONGTEXT 对齐,适合需要兼容 MariaDB JSON alias 展开语义的场景
; TEXT:按 TEXT 对齐,适合更保守的文本兼容场景;当前已实现,但尚未纳入发布级实库基线
; 如果不设置则使用默认值 JSON
; mariaDBJSONTargetType=JSON | LONGTEXT | TEXT
; 结果文件导出
; 这部分参数如果不设置则使用相应的默认值
resultExport=csv
; 设置是否将校验结果自动导出为 CSV 文件,可设置为 [OFF | csv],默认值:csv
; csv:每次运行结束后自动生成 CSV 文件,文件名默认为 gt-checksum-result-<RunID>.csv
; OFF:不生成结果文件,与旧版本行为一致
; 生成的 CSV 文件为 UTF-8 BOM 编码,可被 Excel 直接打开
; 列头固定,包含所有校验对象的完整结果(不受 terminalResultMode 过滤影响)
; 也可通过 CLI 参数 --resultExport csv|OFF 覆盖配置文件中的值
resultFile=result
; 自定义 CSV 结果文件路径,默认值:result(自动生成到 result/ 目录下)
; 若不设置,则按 result/gt-checksum-result-<RunID>.csv 命名并保存在 result 目录
; 例如:resultFile=./output/my-result.csv
; 也可通过 CLI 参数 --resultFile ./output/my-result.csv 覆盖配置文件中的值
terminalResultMode=all
; 设置终端结果输出模式,可设置为 [all | abnormal],默认值:all
; all:终端显示所有校验对象的结果(默认行为,与旧版本一致)
; abnormal:终端仅显示存在差异的结果行(Diffs 为 yes / DDL-yes / warn-only),
; 方便快速定位问题;CSV 文件始终包含完整结果,不受此参数影响
; 也可通过 CLI 参数 --terminalResultMode all|abnormal 覆盖配置文件中的值
; 设置数据修复方案
; 这部分参数如果不设置则使用相应的默认值
datafix=file
; 数据修复方式,可设置为 [file | table]
; file,生成数据修复SQL文件,默认值
; table,直接在线修复数据
; 建议设置file模式,生成fixsql后,经过再次确认以及合并部分对同一个表的DDL操作,再执行fixsql文件进行修复
; datafix=file | table
; v1.3.0 起每个对象始终生成独立修复文件,命名规则为 type.schema.object.sql
; 例如:table.appdb.orders-1.sql、table.appdb.orders-DELETE-1.sql、view.appdb.v_order.sql
; 手动修复时需先执行 *-DELETE-*.sql 文件删除不一致数据,再执行其余文件进行修复
fixTrxNum=1000
; 修复事务数,即单个事务包含多少个DML语句,默认值:1000
; 注意:如果一次要修复多个表,则每个表单独计算fixTrxNum值,而不是几个表合并起来一起计算fixTrxNum值
; 如果是宽表(一行数据超过10KB),则修复事务数应该设置得小一些,如100-1000
; 如果是窄表(一行数据低于1KB),则修复事务数应该设置得大一些,如1000-10000
fixTrxSize=4
; 修复SQL文件大小阈值,单位MB,默认值:4
; 当同时设置 fixTrxNum 和 fixTrxSize 时,任一条件先达到即触发切分
; 示例:fixTrxSize=8 表示每个fixsql文件最大约8MB
insertSqlSize=1024
; INSERT 语句合并后的最大SQL大小,单位KB,默认值:1024(即1MB)
; 当单条合并INSERT达到该阈值时会自动拆分
deleteSqlSize=16
; DELETE 语句合并后的最大SQL大小,单位KB,默认值:16(即16KB)
; 当单条合并DELETE达到该阈值时会自动拆分
fixFileDir=fixsql
; 设置生成修复SQL文件时保存的目录,默认值是 fixsql
; 如需使用其他固定目录名,可自行修改,例如 fixFileDir=./my-fixsql
; 当 datafix=file 时,可以设置本参数
; 当 datafix=table 时,可以不用设置本参数
logbin=ON
; 控制 repairDB 执行修复SQL时是否开启 binlog,可设置为 [ON | OFF],默认值:ON
; ON:保持 sql_log_bin 开启(默认行为),修复操作写入 binlog
; OFF:每条连接执行前设置 SET sql_log_bin=0,修复操作不写入 binlog
; 注意:设置为 OFF 需要目标库账号最低具有 SESSION_VARIABLES_ADMIN 权限,在8.0以前的版本可能要求SUPER权限
extraRowsSyncToSource=OFF
; 仅在 columns 模式(columns 参数非空)下生效,控制目标端多余行的处理策略
; 可设置为 [ON | OFF],默认值:OFF
; OFF(默认):target-only 行(目标端存在但源端不存在的行)只记录告警日志,不生成 DELETE 修复语句
; ON:为 target-only 行生成 DELETE 修复语句,执行后会将目标端多余行删除以与源端对齐
; 如果存在 source-only 行,仍不会自动生成 INSERT,而是写入 columns-advisory.<schema>.<table>.sql 供人工处理
; 注意:设置 ON 前请确认目标端多余行确实需要删除,该操作不可逆
; 该参数在 columns 为空(全列模式)时忽略,全列模式下 target-only 行始终通过 DELETE 语句修复
; 设置日志文件名及等级
; 这部分参数如果不设置则使用相应的默认值
logFile=./gt-checksum.log
; 设置日志文件名,可以指定为绝对路径或相对路径
; 如果不设置则使用默认值 "./gt-checksum.log"
; 支持日期时间格式,例如:gt-checksum-%Y%m%d%H%M%S.log
; 当前可支持的日期时间格式有以下几种:
; %Y:年(如2025)
; %m:月(如09)
; %d:日(如09)
; %H:小时(如08)
; %M:分钟(如08)
; %S:秒(如08)
; %s:当前时间戳(如1757409298)
; %F:完整日期(如2025-09-09)
; %T:完整时间(如08:08:08)
logLevel=info
; 设置日志等级,可设置为 [debug | info | warn | error],默认值:info
; 如果不设置则使用默认值 info
; 不建议设置为debug,除非有必要,因为debug模式会生成大量日志,数据校验性能可能下降一半以上
;
; 一个极简配置文件案例
; 仅需配置srcDSN, dstDSN, tables三个参数,其余参数均自动使用默认值
;srcDSN=mysql|checksum:checksum@tcp(127.0.0.1:3306)/information_schema?charset=utf8mb4
;dstDSN=mysql|checksum:checksum@tcp(127.0.0.1:3307)/information_schema?charset=utf8mb4
;tables=sbtest.sbtest1