yejr 发表于 2023-3-6 09:19:11

gt-checksum用户手册

gt-checksum关于gt-checksumgt-checksum - A opensource table and data checksum tool by GreatSQL用法Usage:gt-checksum --srcDSN DSN --dstDSN DSN --tables TABLES


orgt-checksum --config=./gc.conf


快速使用案例1指定配置文件,开始执行数据校验,示例:shell> ./gt-checksum -f ./gc.conf-- gt-checksum init configuration files ---- gt-checksum init log files ---- gt-checksum init check parameter ---- gt-checksum init check table name ---- gt-checksum init check table column ---- gt-checksum init check table index column ---- gt-checksum init source and dest transaction snapshoot conn pool ---- gt-checksum init cehck table query plan and check data --begin checkSum index table db1.t1[█████████████████████████████████████████████████████████████████████████████████████████████████████████████████]113%task:   678/600table db1.t1 checksum complete** gt-checksum Overview of results **Check time:73.81s (Seconds)SchemaTable                   IndexCol                              checkMod      Rows            Differences   Datafixdb1   t1                      ol_w_id,ol_d_id,ol_o_id,ol_number       rows            5995934,5995918 yes             file


快速使用案例2设定只校验db1库下的所有表,不校验test库下的所有表,并设置没有索引的表也要校验./gt-checksum -S type=mysql,user=root,passwd=abc123,host=172.16.0.1,port=3306,charset=utf8 -D type=mysql,user=root,passwd=abc123,host=172.16.0.2,port=3306,charset=utf8 -t db1.* -it test.* -nit yes


gt-checksum特性MySQL DBA最常用的数据校验&修复工具应该是Percona Toolkit中的pt-table-checksum和pt-table-sync这两个工具,不过这两个工具并不支持MySQL MGR架构,以及国内常见的上云下云业务场景,还有MySQL、Oracle间的异构数据库等多种场景。GreatSQL开源的gt-checksum工具可以满足上述多种业务需求场景,解决这些痛点。gt-checksum工具支持以下几种常见业务需求场景:
[*]MySQL主从复制:主从复制中断后较长时间才发现,且主从间差异的数据量太多,这时候通常基本上只能重建复制从库,如果利用pt-table-checksum先校验主从数据一致性后,再利用pt-table-sync工具修复差异数据,这个过程要特别久,时间代价太大。
[*]MySQL MGR组复制:MySQL MGR因故崩溃整个集群报错退出,或某个节点异常退出,在恢复MGR集群时一般要面临着先检查各节点间数据一致性的需求,这时通常为了省事会选择其中一个节点作为主节点,其余从节点直接复制数据重建,这个过程要特别久,时间代价大。
[*]上云下云业务场景:目前上云下云的业务需求很多,在这个过程中要进行大量的数据迁移及校验工作,如果出现字符集改变导致特殊数据出现乱码或其他的情况,如果数据迁移工具在迁移过程中出现bug或者数据异常而又迁移成功,此时都需要在迁移结束后进行一次数据校验才放心。
[*]异构迁移场景:有时我们会遇到异构数据迁移场景,例如从Oracle迁移到MySQL,通常存在字符集不同,以及数据类型不同等情况,也需要在迁移结束后进行一次数据校验才放心。
[*]定期校验场景:作为DBA在维护高可用架构中为了保证主节点出现异常后能够快速放心切换,就需要保证各节点间的数据一致性,需要定期执行数据校验工作。
以上这些场景,都可以利用gt-chcksum工具来满足。参数选项详解gt-checksum支持命令行传参,或者指定配置文件两种方式运行,但不支持两种方式同时指定。配置文件可参考(这个模板),模板中包含相关参数的详细解释。gt-checksum命令行参数选项详细解释如下:
[*]--config / -f Type: string指定配置文件名,例如:
shell> ./gt-checksum -f ./gc.confshell> ./gt-checksum --config ./gc.conf


gt-checksum支持极简配置文件工作方式,即只需要最少的几个参数就能工作,例如:#shell> cat gc.conf-simplesrcDSN = mysql|pcms:abc123@tcp(172.17.16.1:3306)/information_schema?charset=utf8dstDSN = mysql|pcms:abc123@tcp(172.17.16.2:3306)/information_schema?charset=utf8tables = db1.t1


注意:
[*]极简配置文件名必须是 gc.conf-simple。
[*]配置文件中仅需指定源和目标端的DSN,以及要校验的表名即可。

[*]--srcDSN / -S Type: String. Default: port=3306,charset=utf8mb4.定义数据校验源数据库的DSN,例如:
-S type=mysql,user=root,passwd=abc123,host=172.17.140.47,port=3306,charset=utf8mb4


当前DSN定义支持MySQL、Oracle两种数据库。Oracle的连接串格式为:oracle|user/password@ip:port/sid 例如:srcDSN = oracle|pcms/abc123@172.16.0.1:1521/helowinMySQL的连接串格式为:mysql|usr:password@tcp(ip:port)/dbname?charset=xxx 例如:dstDSN = mysql|pcms:abc123@tcp(172.16.0.1:3306)/information_schema?charset=utf8注:port默认值是3306,charset默认值是utf8mb4。
[*]--dstDSN / -D Type: String. Default: port=3306,charset=utf8mb4.定义数据校验目标数据库的DSN,例如:
-D type=mysql,user=root,passwd=abc123,host=172.17.140.47,port=3306,charset=utf8mb4


和srcDSN一样,也支持MySQL、Oracle两种数据库,DSN字符串格式同srcDSN。注:port默认值是3306,charset默认值是utf8mb4。
[*]--table / -t Type: String. Default: nil.定义要执行数据校验的数据表对象列表,支持通配符"%"和"*"。表名中支持的字符有:. ,超出这些范围的表名将无法识别。下面是几个案例:

[*]. 表示所有库表对象(MySQL不包含 information_schema\mysql\performance_schema\sys)
[*]test.* 表示test库下的所有表
[*]test.t% 表示test库下所有表名中包含字母"t"开头的表
[*]db%.* 表示所有库名中包含字母"db"开头的数据库中的所有表
[*]%db.* 表示所有库名中包含字母"db"结尾的数据库中的所有表
如果已经设置为 ".",则不能再增加其他的规则,例如:设置 ".,pcms%.*" 则会报告规则错误。 如果 table 和 ignore-tables 设置的值相同的话也会报告规则错误。案例:
shell> gt-checksum -S srcDSN -D dstDSN -t db1.*



[*]--ignore-table / -it Type: String. Default: nil.定义不要执行数据校验的数据表对象列表,支持通配符"%"和"*"。表名中支持的字符有:. ,超出这些范围的表名将无法识别。具体用法参考上面 --table 选项中的案例。案例:
shell> gt-checksum -S srcDSN -D dstDSN -t db1.* -it test.*



[*]--noIndexTable / -nit Type: Bool, yes/no. Default: no.设置是否检查没有索引的表,可设置为:yes/no,默认值为:no。当设置为yes时,会对没有索引的表也执行数据校验,这个校验过程可能会非常慢。案例:
shell> gt-checksum -S srcDSN -D dstDSN -t db1.* -nit yes



[*]--lowerCase / -lc Type: Bool, yes/no. Default: no.设置是否忽略表名大小写,可统一使用小写表名,设置为:yes/no,默认值为:no。案例:
shell> gt-checksum -S srcDSN -D dstDSN -t db1.* -lc no



[*]--logFile / -lf Type: String. Default: ./gt-checksum.log.设置日志文件名,可以指定为绝对路径或相对路径。
./gt-checksum -S DSN -D DSN -lf gt-checksum.log案例:shell> gt-checksum -S srcDSN -D dstDSN -t db1.* -lf ./gt-checksum.log



[*]--logLevel, -ll Type: String, debug/info/warn/error. Default: info.设置日志等级,支持 debug/info/warn/error 几个等级,默认值为:info。案例:
shell> gt-checksum -S srcDSN -D dstDSN -t db1.* -lf ./gt-checksum.log -ll info



[*]--parallel-thds / -thds Type: Int. Default: 5.设置数据校验并行线程数。该值必须设置大于0,并行线程数越高,数据校验速度越快,系统负载也会越高,网络连接通信也可能会成为瓶颈。案例:
shell> gt-checksum -S srcDSN -D dstDSN -t db1.* -thds 5



[*]--singleIndexChanRowCount / -sicr Type: Int. Default: 1000.设置单列索引每次检索多少条数据进行校验,默认值:1000,建议范围:1000 - 5000。注:该值设置太大时有可能会造成SQL查询效率反倒下降的情况发生,一般建议设置不超过5000。案例:
./gt-checksum -S DSN -D DSN -t db1.* -sicr 1000



[*]--jointIndexChanRowCount / -jicr Type: Int. Default: 1000.设置多列索引每次检索多少条数据进行校验,默认值:1000,建议范围:1000 - 5000。注:该值设置太大时有可能会造成SQL查询效率反倒下降的情况发生,一般建议设置不超过5000。案例:
./gt-checksum -S DSN -D DSN -t db1.* -jicr 1000



[*]--queue-size / -qs Type: Int. Default: 100.设置数据校验队列深度,默认值:100。数据校验队列深度值设置越大,需要消耗的内存会越高,校验的速度也会越快。案例:
./gt-checksum -S DSN -D DSN -t db1.* -qs 100



[*]--checkMode / -cm Type: enum, count/rows/sample. Default: rows.设置数据校验模式,支持 count/rows/sample 三种模式,默认值为:rowscount 表示只校验源、目标表的数据量rows 表示逐行校验源、目标数据sample 表示只进行抽样数据校验,配合参数ratio设置采样率案例:
./gt-checksum -S DSN -D DSN -t db1.* -cm rows



[*]--ratio / -r Type: Int. Default: 10.当 checkMode = sample 时,设置数据采样率,设置范围1-100,用百分比表示,1表示1%,100表示100%,默认值:10。案例:
./gt-checksum -S DSN -D DSN -t db1.* -cm sample -r 10



[*]--checkObject / -co Type: enum, data/struct/index/partitions/foreign/trigger/func/proc. Default: data.设置数据校验对象,支持 data/struct/index/partitions/foreign/trigger/func/proc,默认值为:data分别表示:行数据/表结构/索引/分区/外键/触发器/存储函数/存储过程。案例:
./gt-checksum -S DSN -D DSN -t db1.* -co data



[*]--datafix / -df Type: enum, table/file. Default: file.设置数据修复方式,支持 file/table 两种方式。file:生成数据修复SQL文件;table:直接在线修复数据。案例:
./gt-checksum -S DSN -D DSN -t db1.* -df fileor./gt-checksum -S DSN -D DSN -t db1.* -df table



[*]--fixFileName / -ffn Type: String. Default: ./gt-checksum-DataFix.sql当 datafix = file 时,设置生成的SQL文件名,可以指定为绝对路径或相对路径。当 datafix = table 时,可以不用设置 fixFileName 参数。
./gt-checksum -S DSN -D DSN -ffn gt-checksum-DataFix.sql案例:./gt-checksum -S DSN -D DSN -t db1.* -df file -ffn ./gt-checksumDataFix.sql



[*]--fixTrxNum / -ftn Type: Int. Default: 100.设置执行数据修复时一个事务中最多运行多少条SQL,或者生成数据修复的SQL文件时,显式在SQL文件中添加 begin + commit 事务起止符中间的SQL语句数量。案例:
./gt-checksum -S DSN -D DSN -t db1.* -ftn=100



[*]--help / -h 查看帮助内容。
[*]--version / -v 打印版本号。
下载可以 这里 下载预编译好的二进制文件包,已经在Ubuntu、CentOS、RHEL等多个下测试通过。如果需要校验Oracle数据库,则还需要先下载Oracle数据库相应版本的驱动程序,并配置驱动程序使之生效。例如:待校验的数据库为Oracle 11-2,则要下载Oracle 11-2的驱动程序,并使之生效,否则连接Oracle会报错。详细方法请见下方内容:下载配置Oracle驱动程序 。下载配置Oracle驱动程序如果需要校验Oracle数据库,则还需要先下载Oracle数据库相应版本的驱动程序。例如:待校验的数据库为Oracle 11-2,则要下载Oracle 11-2的驱动程序,并使之生效,否则连接Oracle会报错。下载Oracle Instant Client从 https://www.oracle.com/database/technologies/instant-client/downloads.html 下载免费的Basic或Basic Light软件包。
[*]oracle basic client, instantclient-basic-linux.x64-11.2.0.4.0.zip
[*]oracle sqlplus, instantclient-sqlplus-linux.x64-11.2.0.4.0.zip
[*]oracle sdk, instantclient-sdk-linux.x64-11.2.0.4.0.zip
配置oracle client并生效shell> unzip instantclient-basic-linux.x64-11.2.0.4.0.zipshell> unzip instantclient-sqlplus-linux.x64-11.2.0.4.0.zipshell> unzip instantclient-sdk-linux.x64-11.2.0.4.0.zipshell> mv instantclient_11_2 /usr/localshell> echo "export LD_LIBRARY_PATH=/usr/local/instantclient_11_2:$LD_LIBRARY_PATH" >> /etc/profileshell> source /etc/profile


源码编译gt-checksum工具采用GO语言开发,您可以自行编译生成二进制文件。编译环境要求使用golang 1.17及以上版本。请参考下面方法下载源码并进行编译:shell> git clone https://gitee.com/GreatSQL/gt-checksum.gitshell> go build -o gt-checksum gt-checksum.goshell> chmod +x gt-checksumshell> mv gt-checksum /usr/local/bin


已知缺陷截止最新的1.2.0版本中,当表中有多行数据是完全重复的话,可能会导致校验结果不准确。源端有个表t1,表结构及数据如下:mysql> show create table t1\G*************************** 1. row ***************************       Table: t1Create Table: CREATE TABLE `t1` (`id` float(10,2) DEFAULT NULL,`code` varchar(10) DEFAULT NULL,KEY `idx_1` (`id`,`code`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;mysql> select * from t1;+-------+------+| id    | code |+-------+------+|1.01 | a    ||1.50 | b    ||2.30 | c    ||3.40 | d    ||4.30 | NULL ||4.30 | NULL ||4.30 | NULL ||4.30 |      ||4.30 | f    || 10.10 | e    |+-------+------+10 rows in set (0.00 sec)


注意:上述10行数据中,有3行数据是完全一致的。目标端中同样也有t1表,表结构完全一样,但数据不一样:mysql> select * from t1;+-------+------+| id    | code |+-------+------+|1.01 | a    ||1.50 | b    ||2.30 | c    ||3.40 | d    ||4.30 | NULL ||4.30 |      ||4.30 | f    || 10.10 | e    |+-------+------+8 rows in set (0.00 sec)


可以看到,目标端中的t1表只有8行数据,如果除去重复数据,两个表是一致的,这也会导致校验的结果显示为一致。...** gt-checksum Overview of results **Check time:0.30s (Seconds)SchemaTable   IndexCol      checkMod      Rows    Differences   Datafixt1      T1      id,code         rows            10,8    no            file


这个问题我们会在未来某个版本中尽快修复。BUGS可以 戳此 查看 gt-checksum 相关bug列表。
页: [1]
查看完整版本: gt-checksum用户手册