11 Star 95 Fork 23

万里数据库 / gt-checksum

 / 详情

v1.2.1检查不出来数据不一致,mysql

意向
需求
创建于  
2023-11-20 11:41

【 使用版本 】

1.2.1

【 使用环境 】

测试环境

【问题描述】
mysql8.0.33,检查数据是否一致,gt-checksum检测不出来,用pt-table-checksum可以检测出来。

【复现路径】

  1. 数据库环境:mysql8.0.33,centos7.9,主库A,从库B

  2. 创建测试数据

  mysql> CREATE DATABASE slave_test_db  DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

  mysql> use slave_test_db;
  SET FOREIGN_KEY_CHECKS=0;
  DROP TABLE IF EXISTS `student_info`;
  CREATE TABLE `student_info` (
    `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键,自增ID;【必须保留自增ID,不要将一些有随机特性的字段值设计为主键,例如order_id,会导致innodb内部page分裂和大量随机I/O,性能下降】int 大约21亿左右,超过会报错。bigint 大约9千亿左右。',
    `uuid` varchar(128) NOT NULL COMMENT '唯一索引;分布式下全局唯一,用于binlog 同步 ES 方便使用',
    `stu_num` varchar(20) NOT NULL COMMENT '学号',
    `stu_name` varchar(10) NOT NULL DEFAULT '' COMMENT '姓名',
    `stu_sex` tinyint(1) NOT NULL COMMENT '性别,0 男、1女',
    `stu_mobile` varchar(20) NOT NULL COMMENT '用户电话',
    `stu_score` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '总分',
    `update_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
    `create_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `is_delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删单;0未删除,1已删除 【表达是否概念的字段必须使用is_】',
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_student_info_stu_num` (`stu_num`) USING BTREE,
    UNIQUE KEY `uq_uuid` (`uuid`),
    KEY `idx_student_info_stu_name` (`stu_name`) USING BTREE
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生信息表';

  -- 插入测试数据
  mysql> INSERT INTO `student_info`(`uuid`, `stu_num`, `stu_name`,`stu_sex`, `stu_mobile`, `stu_score`, `create_date`, `update_date`, `is_delete`) VALUES ('uuid001', '202307001', 'liyanjing', 0, '13854870432', 95, now(), now(), 0);
INSERT INTO `student_info`(`uuid`, `stu_num`, `stu_name`,`stu_sex`, `stu_mobile`, `stu_score`, `create_date`, `update_date`, `is_delete`) VALUES ('uuid002', '202307002', 'zhangsan', 0, '13854870432', 90, now(), now(), 0);
INSERT INTO `student_info`(`uuid`, `stu_num`, `stu_name`,`stu_sex`, `stu_mobile`, `stu_score`, `create_date`, `update_date`, `is_delete`) VALUES ('uuid003', '202307003', 'wangwu', 0, '13854870432', 99, now(), now(), 0);
  1. 制造数据不一致,将B库id=3的stu_name改下值

【问题现象及影响】

gt-checksum、pt-table-checksum 均使用mysql的root管理员,来检验数据是否一致:

  1. 使用 gt-checksum 执行检查
# cd /usr/local/src/
# tar -xvf gt-checksum-1.2.1-linux-x86-64.tar.gz
# cd gt-checksum-1.2.1-linux-x86-64
# chmod +x gt-checksum

# ./gt-checksum \
  -S type=mysql,user=root,passwd='root的密码',host=A的ip,port=3306,charset=utf8mb4 \
  -D type=mysql,user=root,passwd='root的密码',host=B的ip,port=3306,charset=utf8mb4 \
  -t slave_test_db.student_info

-- 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 --

** gt-checksum Overview of results **
Check time:  0.11s (Seconds)
Schema  Table   IndexCol        checkMod        Rows    Differences     Datafix

备注:结果文件gt-checksum-DataFix.sql是空的

  1. 使用pt-table-checksum 检测
# pt-table-checksum --no-check-binlog-format --no-check-replication-filters \
 --host=主库A的ip --port=3306  --user=root --password='root的密码' \
 --databases=slave_test_db --tables='student_info' \
 --replicate=opt_check_db.checksums

Checking if all tables can be checksummed ...
Starting checksum ...
            TS ERRORS  DIFFS     ROWS  DIFF_ROWS  CHUNKS SKIPPED    TIME TABLE
11-20T11:39:04      0      1        3          0       1       0   0.020 slave_test_db.student_info

备注:DIFFS=1,说明有一行数据不一致。

评论 (0)

Sd-Liyanjing 创建了需求
Sd-Liyanjing 修改了描述
Sd-Liyanjing 修改了描述
Sd-Liyanjing 修改了描述
展开全部操作日志

登录 后才可以发表评论

状态
负责人
项目
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
预计工期 (小时)
参与者(1)
Go
1
https://gitee.com/GreatSQL/gt-checksum.git
git@gitee.com:GreatSQL/gt-checksum.git
GreatSQL
gt-checksum
gt-checksum

搜索帮助