代码拉取完成,页面将自动刷新
1.2.1
测试环境
【问题描述】
mysql8.0.33,检查数据是否一致,gt-checksum检测不出来,用pt-table-checksum可以检测出来。
数据库环境:mysql8.0.33,centos7.9,主库A,从库B
创建测试数据
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);
gt-checksum、pt-table-checksum 均使用mysql的root管理员,来检验数据是否一致:
# 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是空的
# 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,说明有一行数据不一致。