# check_data_for_mysql
**Repository Path**: yj_william/check_data_for_mysql
## Basic Information
- **Project Name**: check_data_for_mysql
- **Description**: 本工具借鉴pt-table-checksum 工具思路改写,可以检查随意两个mysql(支持mysql sql语法的数据库)节点的数据一致性。
- **Primary Language**: Shell
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2024-07-22
- **Last Updated**: 2024-07-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# check_data_for_mysql
本工具借鉴pt-table-checksum 工具思路改写,可以检查随意两个mysql(支持mysql sql语法的数据库)节点的数据一致性。
> 本工具仅供学习使用,如需检查线上的数据,请充分测试
#### 1、功能介绍
- 检查随意两个节点的数据一致性
- 支持表结构的校验
- 支持并发检查,基于表的并发
- 支持指定时间,可以规避业务高峰期
- 支持网络监控,如果网络超过阈值可以暂停校验
- 不支持无主键(非空唯一键)的表
- 不支持联合主键达到四个字段及以上的表
#### 2、安装教程
##### (1)下载
```
git clone https://gitee.com/mo-shan/check_data_for_mysql.git
cd check_data_for_mysql
```
##### (2)配置
- 编辑配置文件
```
cd /path/check_data_for_mysql
vim conf/check.conf
```
> 请结合实际情况根据注释提示进行相关配置
- 修改工作路径
```
sed -i 's#^work_dir=.*#work_dir=\"/check_data_for_mysql_path\"#g' start.sh #将这里的check_data_for_mysql_path改成check_data_for_mysql的家目录的绝对路径
```
#### 3、使用说明
##### (1)目录介绍
```
moshan /data/git/check_data_for_mysql > tree -L 2
.
├── conf
│ └── check.conf
├── func
│ ├── f_check_diff_for_mysql.sh
│ ├── f_check_diff_for_row.sh
│ ├── f_logging.sh
│ └── f_switch_time.sh
├── log
├── manager.sh
├── README.en.md
├── README.md
└── start.sh
3 directories, 9 files
moshan /data/git/check_data_for_mysql >
```
- conf 配置文件的目录,check.conf 是配置文件
- log 日志目录
- start.sh 主程序
- manager.sh 网络监控脚本,任务状态的管理脚本
##### (2)帮助手册
- 主程序
```
moshan /data/git/check_data_for_mysql > bash start.sh
Usage: start.sh
[ -t check_table ] 需要检查的表列表, 默认整库
db.table : 表示是仅检查这个库下的这个表, 其他库的这个表就不检查
table : 表示所有库下的这个表都检查
[ -T skip_check_table ] 不需要检查的表, 默认不过滤
db.table : 表示是仅这个库下的这个表不校验, 其他库的这个表会检查
table : 表示所有库下的这个表都不检查
[ -d check_db ] 需要检查的库, 默认是除了系统库以外的所有库
[ -D skip_check_db ] 不需要检查的库, 默认不过滤
[ -w threads ] 最大并发数, 总共开几个线程进行并行校验
[ -l limit_time ] 哪些时间段允许跑校验, 默认是所有时间, 如需限制可以使用该参数进行限制, 多个时间用英文逗号隔开(1,5,10), 时间段可以用中划线连起来(1-5)
1-5,10-15 表示1点到5点(包含1点和5点), 或者10点到15点可以跑, 需要注意都是闭区间的
1,5,10,15 表示1点, 5点, 10点, 15点可以跑
[ -f true ] 是否执行check操作, 默认是false, 只有为true的时候才会check, -f stop 表示终止检查任务
[ -c checksize ] 每次从数据库拿多少行数据进行比较, 默认10000, 不建议修改这个值到太大或者太小, 建议值是5000-50000, 较小的话校验时间较长, 较大的话容易影响数据库
[ -h ] 帮助信息
moshan /data/git/check_data_for_mysql >
```
> 可以根据需求进行参数使用,如需规避业务高峰期在低峰执行校验任务,请使用-l参数指定执行时间 ,如'-l 1-5'表示凌晨1点到5点执行校验任务,如果当天六点前没校验完成,会等到次日凌晨1点继续校验
- 任务管理脚本
```
moshan /data/git/check_data_for_mysql > bash manager.sh -h
Usage: manager.sh
[ -a start|stop|continue|pause ] 监控任务的管理动作, 数据校验任务的管理动作
start : 启动网络监控
stop|pause|continue : 连同校验脚本一起停掉|暂停|继续
[ -t eth0 ] 网卡设备名, 默认是eth0
[ -n 50 ] 网卡流量超过这个百分比就暂停, 等网卡流量小于这个就继续, 默认是50
[ -h ] 帮助信息
moshan /data/git/check_data_for_mysql >
```
> 可以根据实际网卡信息针对该网卡进行监控,当流量达到指定的阈值就会暂时暂停数据校验。这个脚本主要是针对使用了中间件,比如mycat(mysql到mycat)。或者是tidb(tikv到tidb),这种情况下回占用较多网络带宽。
##### (3)测试用例-校验通过场景
- 每次执行校验任务的时候强制要清空log目录,所以请做好校验结果得备份
- 执行校验任务的时候强烈建议开启screen
- 如果有网卡监控需求,执行监控脚本时也强烈建议开启screen
先开启一个screen监控网络
```
moshan /data/git/check_data_for_mysql > screen -S check_net_3306
moshan /data/git/check_data_for_mysql > bash manager.sh -a start
[ 2022-01-18 11:55:34 ] [ 1000 Mb/s ] [ RX : 2 MB/S ] [ TX : 2 MB/S ]
[ 2022-01-18 11:55:35 ] [ 1000 Mb/s ] [ RX : 2 MB/S ] [ TX : 4 MB/S ]
[ 2022-01-18 11:55:36 ] [ 1000 Mb/s ] [ RX : 2 MB/S ] [ TX : 2 MB/S ]
[ 2022-01-18 11:55:37 ] [ 1000 Mb/s ] [ RX : 2 MB/S ] [ TX : 3 MB/S ]
[ 2022-01-18 11:55:38 ] [ 1000 Mb/s ] [ RX : 1 MB/S ] [ TX : 2 MB/S ]
[ 2022-01-18 11:55:39 ] [ 1000 Mb/s ] [ RX : 1 MB/S ] [ TX : 2 MB/S ]
[ 2022-01-18 11:55:41 ] [ 1000 Mb/s ] [ RX : 1 MB/S ] [ TX : 2 MB/S ]
[ 2022-01-18 11:55:42 ] [ 1000 Mb/s ] [ RX : 2 MB/S ] [ TX : 8 MB/S ]
```
新开启一个screen执行校验任务
```
moshan /data/git/check_data_for_mysql > screen -S check_data_3306
moshan /data/git/check_data_for_mysql > bash start.sh -d dba -t dbatest1 -f true
[ 2022-01-17 20:32:19 ] [ 成功 ] [ 192.168.1.1 ] [ start.sh/start.sh ] [ f_prepare:130 ] [ 本次数据一致性检查开始 ]
[ 2022-01-17 20:32:19 ] [ 警告 ] [ 192.168.1.1 ] [ start.sh/start.sh ] [ f_main:185 ] [ 本次数据一致性检查将检查如下库 : [dba] ]
[ 2022-01-17 20:32:19 ] [ 成功 ] [ 192.168.1.1 ] [ start.sh/start.sh ] [ f_main:203 ] [ 正在检查dba库 ]
[ 2022-01-17 20:32:19 ] [ 成功 ] [ 192.168.1.1 ] [ func/f_check_diff_for_mysql.sh ] [ f_check_diff_for_mysql:249 ] [ dba.dbatest1 ] [ 表结构一致 ]
[ 2022-01-17 20:32:19 ] [ 成功 ] [ 192.168.1.1 ] [ func/f_check_diff_for_mysql.sh ] [ f_check_diff_for_mysql:491 ] [ dba.dbatest1 ] [ 1,1 ] [ 00 d 00 h 00 m 00 s ] [ 9.09%, (0:0)/1 ] [ 数据一致 ]
[ 2022-01-17 20:32:19 ] [ 成功 ] [ 192.168.1.1 ] [ func/f_check_diff_for_mysql.sh ] [ f_check_diff_for_mysql:491 ] [ dba.dbatest1 ] [ 2,11 ] [ 00 d 00 h 00 m 00 s ] [ 100.00%, (0:0)/1 ] [ 数据一致 ]
[ 2022-01-17 20:32:19 ] [ 成功 ] [ 192.168.1.1 ] [ func/f_check_diff_for_mysql.sh ] [ f_check_diff_for_mysql:504 ] [ dba.dbatest1 ] [ 检查完毕 ]
[ 2022-01-17 20:32:19 ] [ 成功 ] [ 192.168.1.1 ] [ start.sh/start.sh ] [ f_main:242 ] [ 本次数据一致性检查完成 ] [ 通过 ]
moshan /data/git/check_data_for_mysql >
```
> 检查结束后会提示检查通过,否则就是检查不通过,如下面的用例。
##### (4)测试用例-校验不通过场景
- 执行校验任务的时候强烈建议开启screen
```
moshan /data/git/check_data_for_mysql > screen -S check_data_3306
moshan /data/git/check_data_for_mysql > bash start.sh -d dbatest1 -f true
[ 2022-01-17 20:32:09 ] [ 成功 ] [ 192.168.1.1 ] [ start.sh/start.sh ] [ f_prepare:130 ] [ 本次数据一致性检查开始 ]
[ 2022-01-17 20:32:09 ] [ 警告 ] [ 192.168.1.1 ] [ start.sh/start.sh ] [ f_main:185 ] [ 本次数据一致性检查将检查如下库 : [dbatest1] ]
[ 2022-01-17 20:32:09 ] [ 成功 ] [ 192.168.1.1 ] [ start.sh/start.sh ] [ f_main:203 ] [ 正在检查dbatest1库 ]
[ 2022-01-17 20:32:09 ] [ 警告 ] [ 192.168.1.1 ] [ func/f_check_diff_for_mysql.sh ] [ f_check_diff_for_mysql:242 ] [ dbatest1.dbatest ] [ 表结构不一致 ] [ a_time name ] [ 跳过该表的检查 ]
[ 2022-01-17 20:32:09 ] [ 错误 ] [ 192.168.1.1 ] [ start.sh/start.sh ] [ f_main:232 ] [ 本次数据一致性检查完成 ] [ 不通过 ]
[ 2022-01-17 20:32:09 ] [ 错误 ] [ 192.168.1.1 ] [ start.sh/start.sh ] [ f_main:237 ] [ dbatest1.dbatest:table structure err ]
moshan /data/git/check_data_for_mysql >
```
> 检查不通过在log目录都会生成一个skip文件, 里面记录了哪些表被跳过检查及跳过原因。
```
moshan /data/git/check_data_for_mysql > ls -l log/skip.log
-rw-r--r-- 1 root root 37 Jan 17 20:35 log/skip.log
moshan /data/git/check_data_for_mysql > cat log/skip.log
dbatest1.dbatest:table structure err
moshan /data/git/check_data_for_mysql >
```