本文为您介绍全球数据库网络(Global Database Network,简称GDN)主从实例数据校验的方法。
前提条件
已开通GDN服务并添加从实例,详情请参见开通GDN服务。
注意事项
本操作只支持在从实例中执行。
数据校验会占用一部分存储资源,建议在业务低峰期进行。
提交校验任务
语法
CHECK REPLICA TABLE {`test_db`.`test_tb`} | {`test_db`} [CHANNEL='channel_name'] [MODE=direct|snapshot];
使用限制
不支持对无主键表进行校验。
正在校验的表,再次提交校验任务时,新的校验任务会被忽略。
对已经完成校验的表再次进行校验时,系统会自动删除之前的校验结果,然后生成新的校验结果。
校验任务以异步方式执行。
支持对单张表进行校验,也支持对指定库中的所有表进行校验。
CHANNEL
:可以通过在从实例上执行SHOW SLAVE STATUS
获取Channel_Name
字段,详情请参见SHOW SLAVE STATUS。MODE
为校验模式:snapshot
:构造上下游一致性快照进行校验,需要先开启Sync Point
,详情请参见开启Sync Point。direct
:直接读取上下游数据进行校验,存在误报率。
示例
mysql> check replica table `testdb`.`testtb` channel='test' mode=direct;
Query OK, 0 rows affected (0.05 sec)
开启Sync Point
在主实例执行如下SQL即可开启Sync Point功能:
set global enable_polarx_sync_point = true;
set global enable_sync_point = true;
set global enable_xa_tso = true;
set global enable_auto_commit_tso = true;
# 设置sync point产生的时间间隔,单位:毫秒
set global SYNC_POINT_TASK_INTERVAL = 5000;
开启Sync Point功能后,CDC(Change Data Capture,日志节点)在主从实例数据同步过程中会实时构造主从实例的TSO-MAPPING,您可以通过从实例中的information_schema.rpl_sync_point
视图来查看所有的TSO-MAPPING。
mysql> select * from information_schema.rpl_sync_point limit 10;
+-------+---------------------+---------------------+---------------------+
| ID | PRIMARY_TSO | SECONDARY_TSO | CREATE_TIME |
+-------+---------------------+---------------------+---------------------+
| 31482 | 7211850887478640704 | 7211850889504489536 | 2024-06-27 06:00:41 |
| 31483 | 7211850908445966400 | 7211850910203379776 | 2024-06-27 06:00:46 |
| 31484 | 7211850929417486400 | 7211850931690799168 | 2024-06-27 06:00:51 |
| 31485 | 7211850950393200704 | 7211850952322580544 | 2024-06-27 06:00:56 |
| 31486 | 7211850971368915008 | 7211850973738696768 | 2024-06-27 06:01:01 |
| 31487 | 7211850992327852096 | 7211850994282397760 | 2024-06-27 06:01:06 |
| 31488 | 7211851013303566400 | 7211851015677542464 | 2024-06-27 06:01:11 |
| 31489 | 7211851034275086400 | 7211851036204466240 | 2024-06-27 06:01:16 |
| 31490 | 7211851055250800704 | 7211851057595416640 | 2024-06-27 06:01:21 |
| 31491 | 7211851076218126400 | 7211851078210420800 | 2024-06-27 06:01:26 |
+-------+---------------------+---------------------+---------------------+
10 rows in set (0.04 sec)
TSO:格式为时间戳,Binlog中每一个事务都包含TSO,用于区分每一个事务。详情请参见日志服务(Binlog)。
TSO-MAPPING:某一时刻主从实例的TSO。
查看校验进度
语法
CHECK REPLICA TABLE {`test_db`.`test_tb`} | {`test_db`} SHOW PROGRESS;
支持查看单张表的校验进度,同时也支持查看指定数据库下所有表的校验进度。
示例
mysql> CHECK REPLICA TABLE `test_db`.`test_tb` SHOW PROGRESS;
+----------+---------+-------+----------+---------+
| DATABASE | TABLE | STAGE | STATUS | SUMMARY |
+----------+---------+-------+----------+---------+
| test_db | test_tb | CHECK | FINISHED | SUCCESS |
+----------+---------+-------+----------+---------+
1 row in set (0.04 sec)
暂停校验任务
语法
CHECK REPLICA TABLE {`test_db`.`test_tb`} | {`test_db`} PAUSE;
每张表的校验任务会对应一个或多个子任务(根据数据量进行自动拆分)。在执行完暂停校验语句后,处于执行状态的子任务将继续执行,而未进入执行状态的子任务将不再执行。
示例
mysql> CHECK REPLICA TABLE `testdb`.`testtb` PAUSE;
Query OK, 0 rows affected (0.05 sec)
重启校验任务
语法
CHECK REPLICA TABLE {`test_db`.`test_tb`} | {`test_db`} CONTINUE;
重启校验任务后,未进入执行过的子任务将会执行。
示例
mysql> CHECK REPLICA TABLE `testdb`.`testtb` CONTINUE;
Query OK, 0 rows affected (0.05 sec)
查看校验结果
语法
CHECK REPLICA TABLE {`test_db`.`test_tb`} | {`test_db`} SHOW DIFF;
示例
mysql> CHECK REPLICA TABLE `test_db`.`test_tb` SHOW DIFF;
+----------+---------+------------+--------+--------------+-------------+--------------+-------------+
| DATABASE | TABLE | ERROR_TYPE | STATUS | SRC_KEY_NAME | SRC_KEY_VAL | DST_KEY_NAME | DST_KEY_VAL |
+----------+---------+------------+--------+--------------+-------------+--------------+-------------+
| test_db | test_tb | Miss | FOUND | [id] | [2] | [id] | NULL |
+----------+---------+------------+--------+--------------+-------------+--------------+-------------+
1 row in set (0.00 sec)
ERROR_TYPE
字段用于表示产生差异数据的原因,其取值范围如下所示:
Miss:下游缺少数据。
Orphan:下游多数据。
Diff:上下游数据不一致。
删除校验任务
语法
CHECK REPLICA TABLE {`test_db`.`test_tb`} | {`test_db`} CANCEL;
删除校验任务后,将会同时清理校验结果。
示例
mysql> CHECK REPLICA TABLE `testdb`.`testtb` CANCEL;
Query OK, 0 rows affected (0.05 sec)